November 28, 2020, 11:45:57 AM

Author Topic: [bmx] basic max2d window event system by skidracer [ 1+ years ago ]  (Read 556 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : basic max2d window event system
Author : skidracer
Posted : 1+ years ago

Description : Found this code in a very old folder (pre maxgui)...

I did just refactor TSprite to TQuad before posting, hope it didn't break.

Hit F1 key to add layer

Use mouse to position layer


Code :
Code: BlitzMax
  1. ' ancient code from old bmx test folder
  2. ' hit f1 to add layer
  3. ' draw window frames
  4.  
  5. Strict
  6.  
  7. Global System:TSystem
  8.  
  9. Type TQuad
  10.         Field   x#,y#
  11.         Field   width,height
  12.         Field   image:TImage
  13.        
  14.         Method Draw()
  15.                 DrawImage image,x,y
  16.         End Method
  17. End Type
  18.  
  19. Type TView Extends TQuad
  20.         Field   parent:TView
  21.         Field   task:TTask
  22.         Field   spritelist:TList
  23.         Field   originx,originy
  24.         Field   background[]
  25.  
  26.         Method FindView:TView(mx,my)
  27.                 Local v:TView,p:TView  
  28.                 Local t:TList          
  29.                 If mx>=x And my>=y And mx<x+width And my<y+height
  30.                         spritelist=spritelist.reversed()
  31.                         For v=EachIn spritelist
  32.                                 p=v.FindView(mx,my)
  33.                                 If p Exit
  34.                         Next
  35.                         spritelist=spritelist.reversed()
  36.                         If p Return p                  
  37.                         Return Self
  38.                 EndIf
  39.         End Method
  40.  
  41.         Method Move(dx#,dy#)
  42.                 Local v:TView
  43.                 x:+dx
  44.                 y:+dy
  45.                 For v=EachIn spritelist
  46.                         v.Move(dx,dy)
  47.                 Next
  48.         End Method
  49.                
  50.         Method CreateView:TView(t:TTask,x,y,w,h)
  51.                 Local   v:TView
  52.                 Assert t
  53.                 v=New TView
  54.                 v.parent=Self
  55.                 v.task=t
  56.                 v.x=x
  57.                 v.y=y
  58.                 v.width=w
  59.                 v.height=h
  60.                 v.spritelist=New TList
  61.                 spritelist.addlast v
  62.                 Return v
  63.         End Method
  64.        
  65.         Method CreateFrameView:TView(t:TTask,x,y,w,h)
  66.                 Local   frame:TView
  67.                 Local   view:TView
  68.                 frame=CreateView(System,x-4,y-24,w+8,h+28)
  69.                 frame.background=[0,255,0]
  70.                 view=frame.CreateView(t,x,y,w,h)
  71.                 view.background=[0,0,0]
  72.                 Return view            
  73.         End Method             
  74.                
  75.         Method Draw()
  76.                 Local s:TQuad
  77.                 Local vx,vy,vw,vh
  78.                
  79.                 vw=width;vh=height
  80.                 vx=x;If vx<0 vw:+vx;vx=0
  81.                 vy=y;If vy<0 vh:+vy;vy=0
  82.                 SetViewport vx,vy,vw,vh
  83.                 SetOrigin x+originx,y+originy
  84.                 If background
  85.                         SetColor background[0],background[1],background[2]
  86.                         DrawRect 0,0,width,height
  87.                         SetColor 255,255,255
  88.                 EndIf
  89.                 For s=EachIn SpriteList
  90.                         s.Draw()
  91.                 Next   
  92.         End Method
  93.                        
  94.         Method CreateSprite:TQuad(image:TImage,x#=0,y#=0)
  95.                 Local   s:TQuad
  96.                 s=New TQuad
  97.                 s.x=x
  98.                 s.y=y
  99.                 s.width=image.width
  100.                 s.height=image.height
  101.                 s.image=image
  102.                 spritelist.addlast s
  103.                 Return s
  104.         End Method
  105. End Type
  106.  
  107. Type TDisplay Extends TView
  108.                
  109.         Method Draw()
  110.                 SetViewport 0,0,width,height
  111.                 Cls
  112.                 Super.Draw()
  113.                 Flip
  114.         End Method
  115.        
  116.         Function CreateDisplay:TDisplay(t:TTask,w,h)
  117.                 Local   d:TDisplay
  118.                 Graphics w,h',32
  119.                 d=New TDisplay
  120.                 d.task=t
  121.                 d.width=w
  122.                 d.height=h
  123.                 d.spritelist=New TList
  124.                 Return d
  125.         End Function
  126. End Type
  127.  
  128. Const MOUSELCLICK=1
  129. Const MOUSERCLICK=2
  130. Const MOUSELDRAG=3
  131. Const MOUSERDRAG=4
  132. Const MOUSELRELEASE=5
  133. Const MOUSERRELEASE=6
  134. Const CHARKEY=7
  135.  
  136. Type TMessage
  137.         Field   link:TMessage
  138.         Field   id
  139.         Field   MouseX,MouseY
  140.         Field   MouseXSpeed,MouseYSpeed
  141.         Field   view:TView
  142.         Field   CHARKEY
  143. End Type
  144.  
  145. Type TTask
  146.         Field   messages:TMessage
  147.  
  148.         Method Post(MSG:TMessage)
  149.                 Local   m:TMessage
  150.                 m=messages
  151.                 If m
  152.                         While m.link
  153.                                 m=m.link
  154.                         Wend
  155.                         m.link=MSG
  156.                 Else
  157.                         messages=MSG
  158.                 EndIf
  159.         End Method
  160.        
  161.         Method GetMessage:TMessage()
  162.                 Local   m:TMessage
  163.                 m=messages
  164.                 If m messages=m.link
  165.                 Return m
  166.         End Method
  167.                        
  168.         Method Update() Abstract
  169. End Type
  170.  
  171. Type TSystem Extends TTask
  172.         Field   tasklist:TList
  173.         Field   display:TDisplay
  174.         Field   shutdown
  175.         Field   oldmx,oldmy,oldml,oldmr
  176.         Field   mousefocus:TView
  177.         Field   keyboardfocus:TView
  178.                
  179.         Method Update()
  180.                 Local   m:TMessage
  181.                 Local   v:TView
  182.                 Local   t:TTask
  183.                 Local   mx,my,ml,mr,mouseevent,c
  184.                                
  185.                 mx=MouseX()
  186.                 my=MouseY()
  187.                
  188.                 ml=MouseDown(1)
  189.                 mr=MouseDown(2)
  190.                
  191.                 If mx<>oldmx Or my<>oldmy
  192.                         If ml mouseevent=MOUSELDRAG
  193.                         If mr mouseevent=MOUSERDRAG
  194.                 EndIf
  195.                
  196.                 If ml And (Not oldml) mouseevent=MOUSELCLICK
  197.                 If mr And (Not oldmr) mouseevent=MOUSERCLICK
  198.                
  199.                 If (Not ml) And oldml mouseevent=MOUSELRELEASE
  200.                 If (Not mr) And oldmr mouseevent=MOUSERRELEASE
  201.                                                
  202.                 If mouseevent
  203.                         v=mousefocus
  204.                         If v=Null Or (mouseevent=MOUSELCLICK Or mouseevent=MOUSERCLICK)
  205.                                 v=display.FindView(mx,my)
  206.                                 mousefocus=v
  207.                                 keyboardfocus=v
  208.                         EndIf
  209.                         If v
  210.                                 m=New TMessage
  211.                                 m.id=mouseevent
  212.                                 m.MouseX=mx
  213.                                 m.MouseY=my
  214.                                 m.MouseXSpeed=mx-oldmx
  215.                                 m.MouseYSpeed=my-oldmy
  216.                                 m.view=v
  217.                                 v.task.Post m
  218.                         EndIf
  219.                         If mouseevent=MOUSELRELEASE Or mouseevent=MOUSERRELEASE
  220.                                 mousefocus=Null
  221.                         EndIf
  222.                 EndIf
  223.                
  224.                 oldmx=mx;oldmy=my;oldml=ml;oldmr=mr
  225.  
  226.                 t=Self
  227.                 If keyboardfocus t=keyboardfocus.task
  228.                 If v
  229.                         While True
  230.                                 c=GetChar()
  231.                                 If c=0 Exit
  232.                                 m=New TMessage
  233.                                 m.id=CHARKEY
  234.                                 m.MouseX=mx
  235.                                 m.MouseY=my
  236.                                 m.CHARKEY=c
  237.                                 t.Post m
  238.                         Wend
  239.                 EndIf
  240.                                
  241.                 m=GetMessage()
  242.                 While m
  243.                         DebugLog "message says:"+m.ToString()
  244.                         If m.id=MOUSELDRAG
  245.                                 m.view.Move(m.MouseXSpeed,m.MouseYSpeed)
  246.                         EndIf
  247.                         m=GetMessage()
  248.                 Wend
  249.        
  250.                 For t=EachIn tasklist
  251.                         t.Update()
  252.                 Next
  253.                                
  254.                 If KeyHit(KEY_ESCAPE) shutdown=True
  255.        
  256.         End Method
  257.        
  258.         Method AddTask(t:TTask)
  259.                 tasklist.addlast t
  260.         End Method
  261.        
  262.         Method Run()
  263.                 While Not shutdown
  264.                         Update()
  265.                         display.Draw()         
  266.                 Wend
  267.         End Method
  268.        
  269.         Function CreateSystem:TSystem(w,h)
  270.                 Local s:TSystem
  271.                 s=New TSystem
  272.                 s.tasklist=New TList   
  273.                 s.display=TDisplay.CreateDisplay(s,w,h)
  274.                 Return s
  275.         End Function
  276. End Type
  277.  
  278.  
  279.  
  280. System=TSystem.CreateSystem(1024,768)
  281. System.AddTask TBallTask.Create(1,100,100,200,200)
  282.  
  283. SetBlend ALPHABLEND
  284.  
  285. System.Run
  286.  
  287. End
  288.  
  289. Function Normalize(x#Var,y#Var,z#Var)
  290.         Local   l#
  291.         l=x*x+y*y+z*z
  292.         If l
  293.                 l=1.0/Sqr(l)
  294.                 x:*l;y:*l;z:*l
  295.         EndIf
  296. End Function           
  297.  
  298. Function CreateSphere:TImage(d)
  299.         Local   image:TImage,pixmap:TPixmap
  300.         Local   pix[],x,y,r#,f#,a,pf
  301.         Local   dx#,dy#,dz#,l
  302.         Local   lx#,ly#,lz#
  303.        
  304.         pf=PF_RGBA8888
  305.         pixmap=CreatePixmap(d,d,pf)
  306.         pix=New Int[d]
  307.         r=0.5*d
  308.         lx=0.5;ly=-0.5;lz=1.5;Normalize lx,ly,lz       
  309.         For y=0 Until d
  310.                 For x=0 Until d
  311.                         dx=x+.5-r
  312.                         dy=y+.5-r
  313.                         f=dx*dx+dy*dy           'calc 3d vector for point on sphere
  314.                         dx=dx/r
  315.                         dy=dy/r
  316.                         dz=Sqr(1.0-(dx*dx+dy*dy))                      
  317.                         l=16+255*(lx*dx+ly*dy+lz*dz)    'calc light from dot product
  318.                         l=Max(0,l)
  319.                         l=Min(255,l)
  320.                         l=l | (l Shl 8) | (l Shl 16)
  321.                         f=Sqr(f)
  322.                         a=0    
  323.                         If f<r
  324.                                 a=255*(r-f)
  325.                                 If a>255 a=255
  326.                         EndIf
  327.                         pix[x]=(a Shl 24)|l
  328. ?MACOS 
  329.                         pix[x]=(a)|(l Shl 8)
  330. ?
  331.                 Next
  332.                 CopyPixels pix,pixmap.pixelptr(0,y),pf,d
  333.         Next
  334.         image=LoadImage(pixmap)
  335.         Return image
  336. End Function
  337.  
  338. Function CreateCircle:TImage(d)
  339.         Local   image:TImage,pixmap:TPixmap
  340.         Local   pix[],x,y,r#,rr#,f#,a,pf
  341.         pf=PF_RGBA8888
  342.         pixmap=CreatePixmap(d,d,pf)
  343.         pix=New Int[d]
  344.         r=0.5*d
  345.         rr=r*r
  346.         For y=0 Until d
  347.                 For x=0 Until d
  348.                         f=Sqr((x+.5-r)*(x+.5-r)+(y+.5-r)*(y+.5-r))
  349.                         a=0
  350.                         If f<r
  351.                                 a=255*(r-f)
  352.                                 If a>255 a=255
  353.                         EndIf
  354.                         pix[x]=(a Shl 24)|$ffffff
  355. ?MACOS 
  356.                         pix[x]=(a)|$ffffff00
  357. ?
  358.                 Next
  359.                 CopyPixels pix,pixmap.pixelptr(0,y),pf,d
  360.         Next
  361.         image=LoadImage(pixmap)
  362.         Return image
  363. End Function
  364.  
  365. Type TBall
  366.         Field   parent:TBallTask
  367.         Field   sprite:TQuad   
  368.         Field   x#,y#,vx#,vy#
  369.        
  370.         Method Update()
  371.                 Local   w,h
  372.                 w=parent.view.width-sprite.width
  373.                 h=parent.view.height-sprite.height
  374.                 x:+vx
  375.                 y:+vy
  376.                 If x<0 x=0;vx=Abs(vx)
  377.                 If y<0 y=0;vy=Abs(vy)
  378.                 If x>w x=w;vx=-Abs(vx)
  379.                 If y>h y=h;vy=-Abs(vy)
  380.                 sprite.x=x
  381.                 sprite.y=y
  382.         End Method
  383. End Type
  384.  
  385. Type TBallTask Extends TTask
  386.         Field   view:TView
  387.         Field   image:TImage
  388.         Field   balls:TList
  389.  
  390.         Function Create:TBallTask(n,x,y,w,h)
  391.                 Local   b:TBallTask,i
  392.                 b=New TBallTask        
  393.                 b.view=System.display.CreateFrameView(b,x,y,w,h)
  394.                 b.image=CreateSphere(32)
  395. '               b.image=CreateCircle(32)
  396.                 b.balls=New TList
  397.                 For i=1 To n
  398.                         b.AddBall()
  399.                 Next
  400.                 Return b
  401.         End Function
  402.  
  403.         Method AddBall()
  404.                 Local   b:TBall
  405.                 b=New TBall
  406.                 b.parent=Self
  407.                 b.x=Rnd(view.width)
  408.                 b.y=Rnd(view.height)
  409.                 b.vx=Rnd(-1.0,1.0)
  410.                 b.vy=Rnd(-1.0,1.0)
  411.                 b.sprite=view.CreateSprite(image)
  412.                 balls.addlast b
  413.         End Method
  414.        
  415.         Method Update()
  416.                 Local   b:TBall
  417.                 Local   m:TMessage
  418.                                
  419.                 m=GetMessage()
  420.                 While m
  421.                         m=GetMessage()
  422.                 Wend
  423.                
  424.                 If KeyHit(KEY_F1)
  425.                         System.AddTask TBallTask.Create(256,100,100,400,300)
  426.                 EndIf
  427.                
  428.                 For b=EachIn balls
  429.                         b.Update()
  430.                 Next           
  431.         End Method
  432. End Type


Comments :


degac(Posted 1+ years ago)

 Thanks very much, inspiring code.This is a 'kernel' of a GUI written in max2d...I think I'll bookmark this 'ancient' piece of code.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal