Import mojo Global stars:Starfield,mx:Float,my:Float Function Main() stars = New Starfield() End Function Class TStar Field x:Float,y:Float,z:Float Method Init() x=Rnd(-100,100) y=Rnd(-100,100) z=Rnd(-100,100) End Method Method Update() z-=1 x+=mx y+=my If z<=-100 z+=200 If x<=-100 x+=200 If y<=-100 y+=200 If x>= 100 x-=200 If y>= 100 y-=200 End Method Method Draw() Local i:Int=z+121 Local px:Int=x*450/(z+151) Local py:Int=y*350/(z+151) SetColor 255-i,255-i,255-i DrawRect 320+px,240+py,1,1 End Method End Class Class Starfield Extends App Field star:TStar[1024] Method OnCreate() SetUpdateRate 50 For Local t:Int=0 To star.Length-1 star[t]=New TStar star[t].Init Next End Method Method OnUpdate() mx=(MouseX()-320)/50 my=(MouseY()-240)/50 For Local t:Int=0 To star.Length-1 star[t].Update Next End Method Method OnRender() Cls 0,0,0 For Local t:Int=0 To star.Length-1 star[t].Draw Next End Method End Class
Monkey: minimum base script for the diddy framework
Strict Import mojo Import diddy Global titleScreen:TitleScreen Function Main:Int() game = New MyGame() Return 0 End Class MyGame Extends DiddyApp Method OnCreate:Int() Super.OnCreate() titleScreen = New TitleScreen titleScreen.PreStart() Return 0 End End Class TitleScreen Extends Screen Method New() name = "Title" End Method Start:Void() game.screenFade.Start(50, false) End Method Render:Void() Cls DrawText "TITLE SCREEN!", SCREEN_WIDTH2, SCREEN_HEIGHT2, 0.5, 0.5 DrawText "Click to Play!", SCREEN_WIDTH2, SCREEN_HEIGHT2 + 20, 0.5, 0.5 DrawText "Escape to Quit!", SCREEN_WIDTH2, SCREEN_HEIGHT2 + 40, 0.5, 0.5 End Method Update:Void() If KeyHit(KEY_ESCAPE) game.screenFade.Start(50, true) game.nextScreen = game.exitScreen End End End
Monkey: class example with extends, implements and abstract
Strict Import mojo Interface IUpdateable Method OnUpdate:Int() End Interface IRenderable Method OnRender:Int() End Class AbstractEntity Abstract Global cw:Int Global ch:Int Method New (cw:Int, ch:Int) Self.cw = cw; Self.ch = ch; End End Class Ball Extends AbstractEntity Implements IUpdateable, IRenderable Field x:Int Field y:Int Field xs:Int Field ys:Int Method New () Self.x = 0 Self.y = 0 Self.xs = 1 Self.ys = 1 End Method New (cw:Int, ch:Int) Super.New(cw, ch) Self.x = 0 Self.y = 0 Self.xs = 1 Self.ys = 1 End Method OnUpdate:Int() Self.x += xs Self.y += ys If Self.x > Self.cw-16 Or Self.x < 0 Self.xs =- Self.xs End If Self.y > Self.ch-16 Or Self.y < 0 Self.ys =- Self.ys End Return 0 End Method OnRender:Int() DrawCircle Self.x, Self.y, 16 Return 0 End End Class Pad Extends AbstractEntity Implements IUpdateable, IRenderable Field x:Int Field y:Int Field xs:Int Method New () Self.x = 0 Self.y = ch - 16 Self.xs = 1 End Method New (cw:Int, ch:Int) Super.New(cw, ch) Self.x = 0 Self.y = ch - 16 Self.xs = 1 End Method OnUpdate:Int() Self.x += xs If Self.x > Self.cw-64 Or Self.x < 0 Self.xs =- Self.xs End Return 0 End Method OnRender:Int() DrawRect Self.x, Self.y, 64, 8 Return 0 End End Class game Extends App Field ball:Ball Field pad:Pad Method OnCreate:Int() SetUpdateRate(60) ball = New Ball(DeviceWidth(), DeviceHeight()) pad = New Pad() Return 0 End Method OnUpdate:Int() ball.OnUpdate() pad.OnUpdate() Return 0 End Method OnRender:Int() Cls 0,0,0 ball.OnRender() pad.OnRender() Return 0 End End Function Main:Int() New game Return 0 End
Monkey: particle class
Import mojo Class Particle Global ParticleList:List<particle> = New List<particle> Field x:Float,y:Float,a:Float = 1,r:Int Field ox:Int,oy:Int Field img:Image Field dx:Float,dy:Float, da:Float Field maxdistance:Int Field speed:Float Field dir:Int Field fade:Int Field z:Int Method Create:Particle(_x:Int, _y:Int, _img:Image, _dir:Int = 0, _speed:Float = 0, frames:Int = 1, _fade:Int = False, _autorot:Int = False, _z:Int = 0) ParticleList.AddLast(Self) z = _z x = _x y = _y ox = _x oy = _y img = _img speed = _speed dir = _dir dx = Sin(dir) * speed dy = -Cos(dir) * speed da = 1.0 / frames maxdistance = frames If dir And _autorot r = -dir - 180 End If If _fade fade = True End If End Method Method Update() x+=dx y+=dy If fade a-=da maxdistance-=1 If maxdistance <= 0 Or a <= 0 Destroy() End If If x > VDeviceWidth() Or x < 0 - img.Width Or y > VDeviceHeight() Or y < 0 - img.Height Destroy() End If End Method Method Draw() SetAlpha a DrawImage img,x,y,r,1,1 SetAlpha 1 End Method Method SetPAlpha(alpha:Float) a = alpha End Method Method SetPRotation(rot:Int) r = rot End Method Method Destroy() ParticleList.Remove(Self) End Method Method AddX(_x:Int) x+= _x End Method Method AddY(_y:Int) y+= _y End Method Method SetDirection(_dir:Int) dir = _dir End Method Method SetSpeed(_speed:Float) speed = _speed End Method End Function ParticleExplosion(_x:Float, _y:Float, image:Image, n:Int, frames:Int, speed_multiplyer:Float = 0, ar:Int = False, _z:Int = 0) Local speed:Float For Local i:Int = 1 To n Local dir:Int = Rnd(0, 359) If speed_multiplyer speed = Rnd(0.08*speed_multiplyer, 1.5*speed_multiplyer) Else speed = Rnd(0.08, 1.5) End If Local part:Particle = New Particle() part.Create(_x, _y, image, dir, speed, frames - 10 + Rnd((frames*1.40)), True, ar, _z) Next End Function Function EmitParticle(_x:Float, _y:Float, image:Image, frames:Int, fade:Int = True, dir:Int = 0, speed:Float = 0, ar:Int = False, _z:Int = 0) Local part:Particle = New Particle() part.Create(_x, _y, image, dir, speed, frames, fade, ar, _z) End Function Function ParticleCount:Int() Return Particle.ParticleList.Count() End Function Function ClearParticles() Particle.ParticleList.Clear() End Function Function ClearParticlesZ(z:Int = 0) For Local delp:Particle = Eachin Particle.ParticleList If delp.z = z Particle.ParticleList.Remove(delp) End If Next End Function Function UpdateParticlesZ(z:Int = 0, forcex:Float = 0, forcey:Float = 0) For Local UpdateP:Particle = Eachin Particle.ParticleList If UpdateP.z = z UpdateP.Update() If forcex UpdateP.x+=forcex If forcey UpdateP.y+=forcey End If Next End Function Function DrawParticlesZ(z:Int = 0) For Local UpdateP:Particle = Eachin Particle.ParticleList If UpdateP.z = z UpdateP.Draw() End If Next End Function
Monkey: box2d falling boxes
'----Includes----' Import box2d.dynamics.b2world '----Test Zone----' Function Main() New Box2DLoop() End Function '----Main Loop----' Class Box2DLoop Extends App Field _world:b2World Field RATIO:Float = 8 Field _nextCrateIn:Int '--Main Methods----' Method OnCreate() ' 1. Set Up World setupWorld() ' Create Walls and Floors createWallsAndFloor() setupDebugDraw() _nextCrateIn = 0 'Display Setup SetUpdateRate(60) End Method Method setupDebugDraw:Void() 'Box2D Debug Settings 'Delete this section if you dont need to see the physical process in graphics. Local dbgDraw :b2DebugDraw = New b2DebugDraw() dbgDraw.SetDrawScale(10.0) dbgDraw.SetFillAlpha(0.3) dbgDraw.SetLineThickness(1.0) dbgDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit)'| b2DebugDraw.e_pairBit) _world.SetDebugDraw(dbgDraw) End Method OnRender() Cls _world.DrawDebugData() End Method Method OnUpdate() _world.TimeStep(1.0 /30,10,10) _world.ClearForces() _nextCrateIn = _nextCrateIn - 1 If _nextCrateIn <=0 And _world.m_bodyCount < 80 Then addARandomCrate() _nextCrateIn = 10 Endif End Method Method setupWorld() ' Define gravity Local gravity:b2Vec2 = New b2Vec2(0,9.8) ' Ignore Sleeping Objects Local ignoresleeping:Bool = True _world = New b2World(gravity,ignoresleeping) End Method addARandomCrate() Local fd:b2FixtureDef = New b2FixtureDef() Local sd:b2PolygonShape = New b2PolygonShape() Local bd:b2BodyDef = New b2BodyDef(); bd.type = b2Body.b2_Body fd.friction = 0.8 fd.restitution = 0.3 fd.density = 0.7 fd.shape = sd sd.SetAsBox(randomInt(5,40) / RATIO, randomInt(5, 40) / RATIO) bd.position.Set(randomInt(15,530) / RATIO, randomInt(-100, -10) / RATIO) bd.angle = randomInt(0,360) * 3.14 / 180 Local b:b2Body = _world.CreateBody(bd) b.CreateFixture(fd) End Method randomInt:Int(lowVal:Int, highVal:Int) If (lowVal <= highVal) Return lowVal + Floor(Rnd() * (highVal - lowVal + 1)) Endif End Method createWallsAndFloor:Void() Local sd:b2PolygonShape = New b2PolygonShape() Local fd:b2FixtureDef = New b2FixtureDef() Local bd:b2BodyDef = New b2BodyDef() bd.type = b2Body.b2_staticBody sd.SetAsArray([New b2Vec2(0,0),New b2Vec2(550/RATIO,0), New b2Vec2(550/RATIO,10/RATIO), New b2Vec2(0,10/RATIO)]) fd.friction = 0.5 fd.restitution = 0.3 fd.density = 0.0 fd.shape = sd bd.position.Set(0,560/RATIO) Local b:b2Body = _world.CreateBody(bd) b.CreateFixture(fd) Local sdwall:b2PolygonShape = New b2PolygonShape() Local fdwall:b2FixtureDef = New b2FixtureDef() Local bdwall:b2BodyDef = New b2BodyDef() bd.type = b2Body.b2_staticBody fdwall.friction = 0.5 fdwall.restitution = 0.3 fdwall.density = 0 fdwall.shape = sdwall sdwall.SetAsBox(5/RATIO,390/RATIO) bdwall.position.Set(5/RATIO,195/RATIO) Local leftwall:b2Body = _world.CreateBody(bdwall) leftwall.CreateFixture(fdwall) bdwall.position.Set(545/RATIO,195/RATIO) Local rightwall:b2Body = _world.CreateBody(bdwall) rightwall.CreateFixture(fdwall) End End Class
Monkey: box2d simple join example
#rem In this demo I create two bodies and then join them with a Joint. one body is a static body. Please take this demo and expend it with explanations so we can all learn. (keep it simple..) #End '----Imports----' Import box2d.collision Import box2d.collision.shapes Import box2d.common.math Import box2d.dynamics.contacts Import box2d.dynamics Import box2d.flash.flashtypes Import box2d.common.math.b2vec2 '----Test Zone----' Function Main() New Box2DLoop End Function '----Main Loop----' Class Box2DLoop Extends App 'Box 2D World Definitions Field BXworld : b2World 'Box2D physical World Object Field m_velocityIterations : Int = 10 'Dont know whats this yet. Field m_positionIterations : Int = 10 'Either that. Field m_timeStep : Float = 1.0/60 'Hmm, I know whats this but no changes accured when presetting. Field m_physScale : Float = 1 ' 30 'I Change its value but same results. Field m_debugdrawscale : Float = 10 'This Affects the size of the physical Body Display 'A Box2D Object Definition Field ABody:b2Body 'The Actual Body Field BBody:b2Body 'The Actual Body Field BodyDef:b2BodyDef Field BodyShape:b2PolygonShape Field BodyFixture:b2FixtureDef Method OnCreate() 'Display Setup SetUpdateRate(60) '--Box2D Section--' 'World Setups BXworld = New b2World(New b2Vec2(0,9.7),True) 'General Body Definitions BodyDef =New b2BodyDef BodyShape =New b2PolygonShape() BodyFixture=New b2FixtureDef BodyDef.type=b2Body.b2_Body 'A dynamic body set BodyFixture.density =1.0 BodyFixture.friction =0.5 BodyFixture.restitution =0.1 BodyShape.SetAsBox(5,5) BodyFixture.shape=BodyShape 'Create Body 1 ABody=BXworld.CreateBody(BodyDef) ABody.CreateFixture(BodyFixture) ABody.SetPosition(New b2Vec2(20,20)) 'Create Body 2 BBody=BXworld.CreateBody(BodyDef) BBody.CreateFixture(BodyFixture) BBody.SetPosition(New b2Vec2(45,20)) BBody.SetType(True) 'Setting the Body as Static '------------------------------------------------------------' 'Basic Creation of Joint type revolute.. Local NewJoint:b2RevoluteJointDef=New b2RevoluteJointDef NewJoint.Initialize(ABody,BBody,New b2Vec2(30.0,25.0)) BXworld.CreateJoint(NewJoint) '------------------------------------------------------------' 'Debug Settings 'Delete this section if you dont need to see the physical process. Local dbgDraw :b2DebugDraw = New b2DebugDraw() dbgDraw.SetDrawScale(m_debugdrawscale) dbgDraw.SetFillAlpha(0.3) dbgDraw.SetLineThickness(1.0) dbgDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit)'| b2DebugDraw.e_pairBit) BXworld.SetDebugDraw(dbgDraw) End Method Method OnRender() Cls 'Box2D Display Section BXworld.DrawDebugData() 'Delete this line if you dont need to see the physical process in graphics. (must also delete 'Box2D Debug Settings section above) End Method Method OnUpdate() 'The Stepping of Box2D Engine BXworld.TimeStep(m_timeStep,m_velocityIterations,m_positionIterations) BXworld.ClearForces() 'Dont know why you need this.. End Method End Class
Monkey: simple box2d box
#rem 'Im still very new at box2d but im starting to understand its principle. 'its not an easy to understand engine since the tutorials are not dealing with explaning the core principle of this engine. 'I will try to do that with what ive figured out till now. 'In box2d you First define things and then create them. 'First you define the your 2D world. 'Example: Field BXworld : b2World 'Box2D physical World Object Field m_velocityIterations : int = 10 'Dont know whats this yet. Field m_positionIterations : int = 10 'Either that. Field m_timeStep : Float = 1.0/60 'Hmm, I know whats this but no changes accured when presetting. Field m_physScale : Float = 1 ' 30 'I Change its value but same results. Field m_debugdrawscale : Float = 10 Then you create it. BXworld = New b2World(New b2Vec2(0,9.7),True) Now that you have created your world you can create objects. Same here, first you need to define the object and then create it. Example: Field ABody:b2Body 'The Actual Body Field BodyDef:b2BodyDef Field BodyShape:b2PolygonShape Field BodyFixture:b2FixtureDef BodyDef.type=b2Body.b2_Body 'A dynamic body set BodyFixture.density =1.0 BodyFixture.friction =0.5 BodyFixture.restitution =0.1 BodyShape.SetAsBox(10,10) BodyFixture.shape=BodyShape You create the object using the World... ABody=BXworld.CreateBody(BodyDef) ABody.CreateFixture(BodyFixture) I still not totaly understand this engine but you can run the demo and check stuff out. My next demo will be a joint demo. #End '----Imports----' Import box2d.collision Import box2d.collision.shapes Import box2d.common.math Import box2d.dynamics.contacts Import box2d.dynamics Import box2d.flash.flashtypes Import box2d.common.math.b2vec2 '----Test Zone----' Function Main() New Box2DLoop End Function '----Main Loop----' Class Box2DLoop Extends App 'Box 2D World Definitions Field BXworld : b2World 'Box2D physical World Object Field m_velocityIterations : Int = 10 'Dont know whats this yet. Field m_positionIterations : Int = 10 'Either that. Field m_timeStep : Float = 1.0/60 'Hmm, I know whats this but no changes accured when presetting. Field m_physScale : Float = 1 ' 30 'I Change its value but same results. Field m_debugdrawscale : Float = 10 'This Affects the size of the physical Body Display 'A Box2D Object Definition Field ABody:b2Body 'The Actual Body Field BodyDef:b2BodyDef Field BodyShape:b2PolygonShape Field BodyFixture:b2FixtureDef Method OnCreate() 'Display Setup SetUpdateRate(60) '--Box2D Section--' 'World Setups BXworld = New b2World(New b2Vec2(0,9.7),True) 'Creating a Simple Box (simple.. right..) BodyDef =New b2BodyDef BodyShape =New b2PolygonShape() BodyFixture=New b2FixtureDef BodyDef.type=b2Body.b2_Body 'A dynamic body set BodyFixture.density =1.0 BodyFixture.friction =0.5 BodyFixture.restitution =0.1 BodyShape.SetAsBox(10,10) BodyFixture.shape=BodyShape ABody=BXworld.CreateBody(BodyDef) ABody.CreateFixture(BodyFixture) ABody.SetPosition(New b2Vec2(20,20)) 'Debug Settings 'Delete this section if you dont need to see the physical process. Local dbgDraw :b2DebugDraw = New b2DebugDraw() dbgDraw.SetDrawScale(m_debugdrawscale) dbgDraw.SetFillAlpha(0.3) dbgDraw.SetLineThickness(1.0) dbgDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit)'| b2DebugDraw.e_pairBit) BXworld.SetDebugDraw(dbgDraw) End Method Method OnRender() Cls 'Box2D Display Section BXworld.DrawDebugData() 'Delete this line if you dont need to see the physical process in graphics. (must also delete 'Box2D Debug Settings section above) End Method Method OnUpdate() 'The Stepping of Box2D Engine BXworld.TimeStep(m_timeStep,m_velocityIterations,m_positionIterations) BXworld.ClearForces() 'Dont know why you need this.. End Method End Class
Monkey: minimum Box2d with diddy example
Strict Import diddy Import box2d.collision Import box2d.collision.shapes Import box2d.collision.shapes Import box2d.dynamics.joints Import box2d.common.math Import box2d.dynamics.contacts Import box2d.dynamics Import box2d.flash.flashtypes Import box2d.common.math.b2vec2 Global gameScreen:Screen Function Main:Int() game=New MyGame() Return 0 End Function Class MyGame Extends DiddyApp Method OnCreate:Int() Super.OnCreate() SetUpdateRate(60) gameScreen = New Box2dscreen gameScreen.PreStart() Return 0 End End Class Box2dscreen Extends Screen ' Field world:b2World Field contactlistener:ContactListener ' Field m_velocityIterations:Int = 10 Field m_positionIterations:Int = 10 Field m_timeStep:Float = 1.0/60 ' set this to your SetUpdateRate() Field m_physScale:Float = 1' 30 ' Not in use, but you should not use pixels as your units, an object of length 200 pixels would be seen by Box2D as the size of a 45 story building. Field m_debugdrawscale:Float=1 ' set this to m_physScale if you are scaling your world. Method New() Local doSleep:Bool = True Self.world = New b2World(New b2Vec2(0,0), doSleep) ' no need for AABB in newer versions of box2d, the world is infinite Self.SetGravity(1.0,20) ' world.SetWarmStarting(True) ' ' '// set debug draw Local dbgDraw :b2DebugDraw = New b2DebugDraw() dbgDraw.SetDrawScale(m_debugdrawscale) ' was 30 dbgDraw.SetFillAlpha(0.3) dbgDraw.SetLineThickness(1.0) dbgDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit)'| b2DebugDraw.e_pairBit) world.SetDebugDraw(dbgDraw) Self.contactlistener=New ContactListener() world.SetContactListener(Self.contactlistener)' for collision detection, if you need information which objects collide End Method Method Start:Void() Self.CreateDemo() End Method Render:Void() Cls Self.world.DrawDebugData() End Method Update:Void() world.TimeStep(m_timeStep, m_velocityIterations, m_positionIterations) world.ClearForces() End Method Method SetGravity:Void(x:Float,y:Float) Self.world.SetGravity(New b2Vec2(x,y)) End Method Method CreateDemo:Void() Local b:b2Body ' a box for ground b=Self.CreateBox(340,420,480,30,True) b.SetUserData(New StringObject("ground")) ' give object a name for collision detection in contactlistener ' a sphere b=Self.CreateSphere(350,220,40) b.SetUserData(New StringObject("sphere")) ' create a polygon from an array of b2d Vectors Local tri:b2Vec2[]= [New b2Vec2(0, 0), New b2Vec2(0, -100), New b2Vec2(200 ,0)] b=Self.CreatePolybody(200,20,tri) b.SetUserData(New StringObject("triangle1")) ' ' create a polygon from an array with floats Local triangle:Float[]=[0.000000000,-49.000000,99.000000,59.0000000,-77.000000,79.0000000] b=Self.CreatePolybody(200,100,Self.ArrayToVectorarray(triangle)) b.SetUserData(New StringObject("triangle2")) End Method Method CreateBox:b2Body (xpos:Float,ypos:Float,width:Float,height:Float,static:Bool=True) Local fd :b2FixtureDef = New b2FixtureDef() Local sd :b2PolygonShape = New b2PolygonShape() Local bd :b2BodyDef = New b2BodyDef() If static=True bd.type = b2Body.b2_staticBody Else bd.type = b2Body.b2_Body Endif fd.density = 1.0 fd.friction = 0.5 fd.restitution = 0.1 fd.shape = sd sd.SetAsBox(width,height) bd.position.Set(xpos,ypos) Local b :b2Body b = Self.world.CreateBody(bd) ' Recall that shapes don’t know about bodies and may be used independently of the physics simulation. Therefore Box2D provides the b2Fixture class to attach shapes to bodies. b.CreateFixture(fd) ' Return b End Method Method CreateSphere:b2Body (xpos:Float,ypos:Float,radius:Float,static:Bool=False) Local fd :b2FixtureDef = New b2FixtureDef() Local bd :b2BodyDef = New b2BodyDef() Local cd :b2CircleShape = New b2CircleShape() ' cd.m_radius = radius fd.density = 2 fd.restitution = 0.2 fd.friction = 0.5 fd.shape=cd If static=True bd.type = b2Body.b2_staticBody ' a static body Else bd.type = b2Body.b2_Body 'a dynamic body Endif bd.position.Set(xpos,ypos) Local b :b2Body b = Self.world.CreateBody(bd) b=Self.world.CreateBody(bd) b.CreateFixture(fd) Return b End Method Method CreatePolybody:b2Body(xpos:Float,ypos:Float,verts:b2Vec2[],static:Bool=False,bullet:Bool=False) ' polys must be defined vertices from left to right or their collision will not work. They must be convex. ' A polygon is convex when all line segments connecting two points in the interior do not cross any edge ' of the polygon. ' Polygons are solid and never hollow. A polygon must have 3 or more vertices. Local b :b2Body Local fd :b2FixtureDef = New b2FixtureDef() Local sd :b2PolygonShape = New b2PolygonShape() Local bd :b2BodyDef = New b2BodyDef() ' sd.SetAsArray(verts,verts.Length) fd.shape=sd bd.type = b2Body.b2_Body ' bd.position.Set(xpos,ypos) bd.bullet=bullet b=Self.world.CreateBody(bd) ' fd.density = 1.0 fd.friction = 0.5 fd.restitution = 0.1 b.CreateFixture(fd) ' Return b End Method Method ArrayToVectorarray:b2Vec2[](arr:Float[]) ' converts a normal array with floats to an array of b2Vec2 Local vecs:b2Vec2[1] vecs=vecs.Resize(arr.Length/2) Local count:Int For Local f:Float=0 To arr.Length-2 Step 2 vecs[count]=New b2Vec2(arr[f],arr[f+1]) count+=1 Next Return vecs End Method Method Cleanup:Void() ' When a world leaves scope or is deleted by calling delete on a pointer, all the memory reserved for bodies, fixtures, and joints is freed. ' This is done to improve performance and make your life easier. However, you will need to nullify any body, fixture, or joint pointers you have because they will become invalid. End Method End Class Class ContactListener Extends b2ContactListener ' to gather information about collided objects. ' http://www.box2dflash.org/docs/2.1a/reference/Box2D/Dynamics/b2ContactListener.html ' You cannot create/destroy Box2D entities inside these callbacks. Method New() Super.New() End Method PreSolve : Void (contact:b2Contact, oldManifold:b2Manifold) End Method BeginContact:Void(contact:b2Contact) ' Print "objects did collide.." ' ' get the fixtures involved in collision Local fixA:b2Fixture=contact.GetFixtureA()' Instead of telling you which b2Body collided, the b2Contact tells you which fixture collided. Local fixB:b2Fixture=contact.GetFixtureB()' To know which b2Body was involved in the collision you can retrieve a reference to the fixture. Local userdata1:Object=Object(fixA.GetBody().GetUserData()) Local userdata2:Object=Object(fixB.GetBody().GetUserData()) If userdata1<>Null Local name:String=StringObject(userdata1).ToString() ' Print "involved in collision:"+ name Endif If userdata2<>Null Local name:String=StringObject(userdata2).ToString() ' Print "involved in collision:"+ name Endif End Method End
ASObjC: NSURLConnection – http get and post
-- -- pgURLAppDelegate.applescript -- pgURL -- -- Created by goodtime on 4/10/11. -- Copyright 2011 NiceMac. All rights reserved. -- demonstrates doing a GET or POST Request using NSURLConnection. Runs in the Background (not in main thread) -- contains no UI... might add one later, for now it just logs or displays alerts -- see console log and feel free to change the URL -- reference material: http://cocoawithlove.com/2008/09/cocoa-application-driven-by-http-data.html script pgURLAppDelegate property parent : class "NSObject" property self : current application's pgURLAppDelegate -- should match the script delegate name above property myURL : "http://www.heise.de" -- URL of your request property postMethod : "POST" -- use POST for POST property myBody : "" -- PUT YOUR POST MESSAGE HERE if trying to do a POST -- URL Request Encoding property myEncoding : NSUTF8StringEncoding of current application --code for UTF8 property getMethod : "GET" -- use GET for any other Requests property intermediateMsg : "" -- Text String returned from the request (may not be complete for long downloads) property entireMsg : "" -- All the Text String returned from the request on pgURL_(myURL, myBody, myMethod) -- String to NSURL tell class "NSURL" of current application set myURL to URLWithString_(myURL) end tell -- String tell class "NSString" of current application set myBody to stringWithString_(myBody) end set myBody to myBody's dataUsingEncoding_(myEncoding) tell class "NSString" of current application set myMethod to myMethod end tell NSMutableURLRequest of current application set myRequest to requestWithURL_(myURL) end tell myRequest setHTTPMethod_(myMethod) end -- add the Message Body when sending a POST Method if myMethod = "POST" then tell myRequest setHTTPBody_(myBody) end end -- form the connection set myConnection to (((current application's class "NSURLConnection")'s alloc)'s initWithRequest_delegate_(myRequest, self)) end -- handle the connection in the background (not in main thread) -- this is controlled by the next four threads on connection_didReceiveResponse_(myConnection, response) tell class "NSHTTPURLResponse" of current application set statusText to (localizedStringForStatusCode_(statusCode of response)) as text set statusCode to (statusCode of response) as string end -- if it fails to do anything, show what it didn't do here (the error) if statustext = "no error" then -- I am not really sure if this does anything or if it is reseting the returnData properly tell current application's returnData setLength_(0) end else display alert "HTTP Error: " & statusCode & return & "Error Message: " & statusText & "." end end on connection_didReceiveData_(myConnection, returnData) -- convert Data returned to String (Don't ever forget how to do this, it is a pain when do forget) set my intermediateMsg to (((current application's class "NSString")'s alloc)'s initWithData_encoding_(returnData, current application's NSUTF8StringEncoding)) as string log "didReceivedData:" log intermediateMsg & return & return set my entireMsg to my entireMsg & intermediateMsg end on connection_didFailWithError_(myConnection,trpErr) -- display alert trpErr as string log trpErr set EM to "" try set newError to (NSLocalizedDescription of userInfo of (trpErr)) as string on error EM -- if AppleScript can't do this, so what else is wrong set errorMore to EM end display alert newError & return & return & errorMore end on connectionDidFinishLoading_(myConnection) log "connection Finished." -- here you can do what you want to do with the intermediateMsg log "here is your entire message returned:" log entireMsg log "end of line." end on applicationWillFinishLaunching_(aNotification) -- Insert code here to initialize your application before any files are opened -- run the request here for demonstration purposes pgURL_(myURL, myBody, getMethod) end applicationWillFinishLaunching_ on applicationShouldTerminate_(sender) -- Insert code here to do any housekeeping before your application quits return current application's NSTerminateNow end applicationShouldTerminate_ end script
ASObjC: NSScreen – get screen resolution
property myScreen : class "NSScreen" of current application set screen to item 1 of myScreen's screens set res to screen's frame as list set {screenw, screenh} to {|width| of |size| of item 1 of res, height of |size| of item 1 of res}