The Nature of Code for Monkey X - MOJO2
Monkey Forums/Monkey Code/The Nature of Code for Monkey X - MOJO2
| ||
The Nature of Code is a book written by Daniel Shiffman, it addresses math concepts like Vectors, Forces, Particles and more. All the examples in his book was written for JAVA and I translated it to Monkey MOJO2. thank Daniel for given his permission to publish the code for Monkey. You can read his book here http://natureofcode.com/ to understand the concepts. These examples use MOJO2, so make sure you have MonkeyXPro85e or earlier. I recommend that you create one directory per example, for instance vector1_1, vector1_2 and so on, then save your examples in the directories, that is because some of the files will have the same name but the code may be different. You can get the zipped files here http://apd-games.com/NatureOfCode/vectors_MOJO2.zip 1-Vectors Example 1.1 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-1: Bouncing Ball, no vectors 'Translated to Monnkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Class Vectors1_1 Extends App Field canvas:Canvas Field width:Float = 640 '= DeviceWidth() Field height:Float = 360 '= DeviceHeight() Field x:float = 100 Field y:float = 100 Field xspeed:float = 2.5 Field yspeed:float = 2 Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 canvas.SetColor(0.5, 0.5, 0.5) Circle(x, y, 16, 16) canvas.SetAlpha(0.7) r = 127 / 255.0; g = 127 / 255.0; b = 127 / 255.0 canvas.SetColor(r, g, b) canvas.DrawEllipse(x, y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) canvas.Flush Return True End Method OnUpdate:Int() 'Add the current speed To the location. x = x + xspeed y = y + yspeed If ( (x > width) or (x < 0)) xspeed = xspeed * -1 EndIf If ( (y > height) or (y < 0)) yspeed = yspeed * -1 EndIf Return True End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) Next End End Function Main:Int() New Vectors1_1() Return true End |
| ||
Vectors Example 1-2 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-2: Bouncing Ball, with PVector! 'Translated to Monnkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector Class Vectors1_2 Extends App Field canvas:Canvas Field location:PVector Field velocity:PVector Field width:Float = 0 Field height:Float = 0 Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End location = New PVector(100, 100) velocity = New PVector(2.5, 5) Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) 'canvas.DrawRect(0, 0, width, height) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 canvas.SetColor(0.5, 0.5, 0.5) Circle(Self.location.x, Self.location.y, 16, 16) canvas.SetAlpha(0.7) r = 127 / 255.0; g = 127 / 255.0; b = 127 / 255.0 canvas.SetColor(r, g, b) canvas.DrawEllipse(Self.location.x, Self.location.y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) canvas.Flush Return True End Method OnUpdate:Int() 'Add the current speed to the location. location.add(velocity) If ( (location.x > width) or (location.x < 0)) velocity.x = velocity.x * -1 EndIf If ( (location.y > height) or (location.y < 0)) velocity.y = velocity.y * -1 EndIf Return True End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) Next End End Function Main:Int() New Vectors1_2() Return true End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-3 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-3: Vector subtraction 'Translated to Monnkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector Class Vectors1_3 Extends App Field canvas:Canvas Field location:PVector Field velocity:PVector Field width:Float = 0 Field height:Float = 0 Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End location = New PVector(100, 100) velocity = New PVector(2.5, 5) Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) 'canvas.DrawRect(0, 0, width, height) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 Circle(Self.location.x, Self.location.y, 16, 16) canvas.SetAlpha(0.7) r = 127 / 255.0; g = 127 / 255.0; b = 127 / 255.0 canvas.SetColor(r, g, b) canvas.DrawEllipse(Self.location.x, Self.location.y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) canvas.Flush Return True End Method OnUpdate:Int() 'Add the current speed to the location. location.add(velocity) If ( (location.x > width) or (location.x < 0)) velocity.x = velocity.x * -1 EndIf If ( (location.y > height) or (location.y < 0)) velocity.y = velocity.y * -1 EndIf Return True End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) Next End End Function Main:Int() New Vectors1_3() Return true End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-4 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-4: Vector multiplication 'Translated to Monnkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector Class Vectors1_4 Extends App Field canvas:Canvas Field mouse:PVector Field center:PVector Field width:Float = 0 Field height:Float = 0 Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End mouse = New PVector(MouseX(), MouseY()) center = New PVector(width / 2, height / 2) Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) 'canvas.DrawRect(0, 0, width, height) canvas.SetColor(0.5, 0.5, 0.5) ' canvas.DrawText(" " + mouse.x + " " + mouse.y, MouseX(), MouseY()) canvas.PushMatrix canvas.Translate(width / 2, height / 2) canvas.DrawLine(0, 0, mouse.x, mouse.y) canvas.PopMatrix canvas.Flush Return True End Method OnUpdate:Int() mouse = New PVector(MouseX(), MouseY()) ' center = New PVector(width / 2, height / 2) mouse.sub(center) 'Multiplying a vector ! The vector is now half its original size(multiplied by 0.5). mouse.mult(0.5) Return True End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) Next End End Function Main:Int() New Vectors1_4() Return true End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-5 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-5: Vector magnitude 'Translated to Monnkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector Class Vectors1_5 Extends App Field canvas:Canvas Field width:Float = 0 Field height:Float = 0 Field mouse:PVector Field center:PVector Field ellwidth:Int Field ellheight:Int Field touching:Int Field touchhit:Int Field touchX:Float Field touchY:Float Field accX:Float Field accY:Float Field accZ:Float Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) 'Two PVectors, one for the mouse location and one for the center of the window mouse = New PVector(MouseX(), MouseY()) center = New PVector(width / 2, height / 2) mouse.sub(center) canvas.SetColor(0.0, 0.0, 0.0) 'The magnitude (i.e. length) of a vector can be accessed via the mag() function. Here it is used as the width of a rectangle drawn at the top of the window. Local m:Float = mouse.mag() 'fill(0); canvas.DrawRect(0, 0, m, 10) canvas.PushMatrix 'Draw a line to represent the vector. canvas.Translate(width / 2, height / 2) 'DrawText("x:" + mx + " y:" + my, 0, 0) canvas.DrawLine(0, 0, mouse.x, mouse.y) canvas.PopMatrix canvas.Flush Return True End Method OnUpdate:Int() input() ' get User Touch screen or mouse Return True End Method input:Int() 'touching=0 touchhit = -1 For Local i:Int = 0 Until 64 If TouchDown(i) touching+=1 Next touchhit = TouchHit() touchX = TouchX(0) touchY = TouchY(0) accX = AccelX() accY = AccelY() accZ = AccelZ() Return True End End Function Main:Int() New Vectors1_5() Return true End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-6 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-5: Demonstration of normalizing a vector. ' Normalizing a vector sets its length to 1. 'Translated to Monnkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector Class Vectors1_6 Extends App Field canvas:Canvas Field width:Float = 0 '= DeviceWidth() Field height:Float = 0 '= DeviceHeight() Field mouse:PVector Field center:PVector Field ellwidth:Int Field ellheight:Int Field touching:Int Field touchhit:Int Field touchX:Float Field touchY:Float Field accX:Float Field accY:Float Field accZ:Float Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) 'Two PVectors, one for the mouse location and one for the center of the window mouse = New PVector(MouseX(), MouseY()) center = New PVector(width / 2, height / 2) mouse.sub(center) mouse.normalize() 'In this example, after the vector is normalized, 'it is multiplied by 50 so that it is viewable onscreen. 'Note that no matter where the mouse is, the vector will 'have the same length (50) due to the normalization process. mouse.mult(50) canvas.SetColor(0, 0, 0) canvas.PushMatrix 'Draw a line to represent the vector. canvas.Translate(width / 2, height / 2) 'DrawText("x:" + mx + " y:" + my, 0, 0) canvas.DrawLine(0, 0, mouse.x, mouse.y) canvas.PopMatrix canvas.Flush Return True End Method OnUpdate:Int() input() ' get User Touch screen or mouse Return True End Method input:Int() 'touching=0 touchhit = -1 For Local i:Int = 0 Until 64 If TouchDown(i) touching+=1 Next touchhit = TouchHit() touchX = TouchX(0) touchY = TouchY(0) accX = AccelX() accY = AccelY() accZ = AccelZ() Return True End End Function Main:Int() New Vectors1_6() Return true End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-7 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-7: Motion 101. 'Translated to Monkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector Import mover Class Vectors1_7 Extends App Field width:Float = 0 Field height:Float = 0 Field mover:Mover Field touching:Int Field touchhit:Int Field touchX:Float Field touchY:Float Field accX:Float Field accY:Float Field accZ:Float Method OnCreate:Int() SetUpdateRate(60) width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End mover = New Mover(width, height) Return True End Method OnRender:Int() mover.display() Return True End Method OnUpdate:Int() mover.update() mover.checkEdges() 'input() ' get User Touch screen or mouse Return True End Method input:Int() 'touching=0 touchhit = -1 For Local i:Int = 0 Until 8'64 If TouchDown(i) touching+=1 Next touchhit = TouchHit(0) touchX = TouchX(0) touchY = TouchY(0) accX = AccelX() accY = AccelY() accZ = AccelZ() Return True End End Function Main:Int() New Vectors1_7() Return true End Strict Import mojo2 Import pvector Class Mover 'Our object has two PVectors: location and velocity. Field location:PVector Field velocity:PVector Field acceleration:PVector Field topspeed:Float Field mouse:PVector Field width:Float Field height:Float Field canvas:Canvas ' Method New(w:Float, h:Float) ' 'location = New PVector(w / 2, h / 2) ' location = New PVector(Rnd(w), Rnd(h)) ' velocity = New PVector(0, 0) ' acceleration = New PVector(-0.01, 0.01) ' topspeed = 5 ' 10 ' End Method New(w:Float, h:Float) Self.width = w Self.height = h location = New PVector(Rnd(Self.width), Rnd(Self.height)) velocity = New PVector(Rnd(-2, 2), Rnd(-2, 2)) location = New PVector(width / 2, height / 2) canvas = New Canvas End Method update:Void() ' mouse = New PVector(MouseX(), MouseY()) ' 'Print "x:"+mouse.x + " y:"+mouse.y ' acceleration = acceleration.sub(mouse, location) ' 'Set magnitude of acceleration ' acceleration.normalize(); ' acceleration.mult(0.2); ' 'Velocity changes according to acceleration ' velocity.add(acceleration); ' 'Limit the velocity by topspeed ' velocity.limit(topspeed); ' 'Location changes by velocity location.add(velocity); End Method display:Void() canvas.Clear(1.0, 1.0, 1.0) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 canvas.SetColor(0.5, 0.5, 0.5) Circle(Self.location.x, Self.location.y, 16, 16) canvas.SetAlpha(0.7) r = 127 / 255.0; g = 127 / 255.0; b = 127 / 255.0 canvas.SetColor(r, g, b) canvas.DrawEllipse(Self.location.x, Self.location.y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) canvas.Flush End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) 'DrawPoint(x + Cos(phi) * w, y - Sin(phi) * h) Next End Method checkEdges:Void() If (location.x > Self.width) Self.location.x = 0 Else If (Self.location.x < 0) Self.location.x = Self.width End If (location.y > Self.height) Self.location.y = 0 Else If (location.y < 0) Self.location.y = Self.height End End End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-8 Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-8: Motion 101 Acelleration. 'Translated to Monkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo Import pvector Import mover Class Vectors1_8 Extends App Field width:Float = 0 Field height:Float = 0 Field mover:Mover Field touching:Int Field touchhit:Int Field touchX:Float Field touchY:Float Field accX:Float Field accY:Float Field accZ:Float Method OnCreate:Int() SetUpdateRate(60) width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 480 End mover = New Mover(width, height) Return True End Method OnRender:Int() mover.display() Return True End Method OnUpdate:Int() mover.update() mover.checkEdges() 'input() ' get Use r Touch screen or mouse Return True End Method input:Int() 'touching=0 touchhit = -1 For Local i:Int = 0 Until 64 If TouchDown(i) touching+=1 Next touchhit = TouchHit() touchX = TouchX(0) touchY = TouchY(0) accX = AccelX() accY = AccelY() accZ = AccelZ() Return True End End Function Main:Int() New Vectors1_8() Return true End Strict Import mojo2 Import pvector Class Mover 'Our object has two PVectors: location and velocity. Field location:PVector Field velocity:PVector Field acceleration:PVector Field topspeed:Float Field mouse:PVector Field width:Float Field height:Float Field canvas:Canvas Method New(w:Float, h:Float) width = w height = h location = New PVector(w / 2, h / 2) velocity = New PVector(0, 0) acceleration = New PVector(-0.001, 0.01) topspeed = 10.0 canvas = New Canvas End ' Method New(w:Float, h:Float) ' Self.width = w ' Self.height = h ' location = New PVector(Rnd(Self.width), Rnd(Self.height)) ' velocity = New PVector(Rnd(-2, 2), Rnd(-2, 2)) ' location = New PVector(width / 2, height / 2) ' ' End Method update:Void() 'Velocity changes according to acceleration velocity.add(acceleration) 'Limit the velocity by topspeed velocity.limit(topspeed) 'Location changes by velocity location.add(velocity) End Method display:Void() canvas.Clear(1.0, 1.0, 1.0) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 canvas.SetColor(0.5, 0.5, 0.5) ' Print "vel x:" + Self.velocity.x + " vel y:" + Self.velocity.y ' Print "Loc x:" + Self.location.x + " Loc y:" + Self.location.y Circle(Self.location.x, Self.location.y, 16, 16) canvas.SetAlpha(0.7) r = 127 / 255.0; g = 127 / 255.0; b = 127 / 255.0 canvas.SetColor(r, g, b) canvas.DrawEllipse(Self.location.x, Self.location.y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) canvas.Flush End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) 'DrawPoint(x + Cos(phi) * w, y - Sin(phi) * h) Next End Method checkEdges:Void() If (location.x > width) location.x = 0 Else If (location.x < 0) location.x = width End If (location.y > height) location.y = 0 Else If (location.y < 0) location.y = height End End End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-10 Move the mouse '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-10: Motion 101 Acelleration. 'Translated to Monkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector ' !!!!! ------ Import classes need lowercase names ------ !!!!!! Import mover Class Vectors1_10 Extends App Field width:Float = 0 '= DeviceWidth() Field height:Float = 0 '= DeviceHeight() Field mover:Mover Field touching:Int Field touchhit:Int Field touchX:Float Field touchY:Float Field accX:Float Field accY:Float Field accZ:Float Method OnCreate:Int() SetUpdateRate(60) width = DeviceWidth() height = DeviceHeight() If width = 0 width = 640 End If height = 0 height = 360 End mover = New Mover(width, height) Return True End Method OnRender:Int() mover.display() Return True End Method OnUpdate:Int() mover.update() 'mover.checkEdges() ' input() ' get Use r Touch screen or mouse Return True End Method input:Int() 'touching=0 touchhit = -1 For Local i:Int = 0 Until 64 If TouchDown(i) touching+=1 Next touchhit = TouchHit() touchX = TouchX(0) touchY = TouchY(0) accX = AccelX() accY = AccelY() accZ = AccelZ() Return True End End Function Main:Int() New Vectors1_10() Return true End Strict Import mojo2 Import pvector Class Mover 'Our object has two PVectors: location and velocity. Field location:PVector Field velocity:PVector Field acceleration:PVector Field topspeed:Float Field mouse:PVector Field width:Float Field height:Float Field canvas:Canvas Method New(w:Float, h:Float) canvas = New Canvas Self.width = w Self.height = h location = New PVector(w / 2, h / 2) velocity = New PVector(0, 0) topspeed = 5 End Method update:Void() mouse = New PVector(MouseX(), MouseY()) acceleration = New PVector(0, 0) acceleration = acceleration.sub(mouse, location) 'Set magnitude of acceleration acceleration.normalize() acceleration.mult(0.2) 'Velocity changes according to acceleration velocity.add(acceleration); 'Limit the velocity by topspeed velocity.limit(topspeed); 'Location changes by velocity location.add(velocity); End Method display:Void() canvas.Clear(1.0, 1.0, 1.0) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 canvas.SetColor(0.5, 0.5, 0.5) Circle(Self.location.x, Self.location.y, 16, 16) canvas.SetAlpha(0.7) r = 127 / 255.0; g = 127 / 255.0; b = 127 / 255.0 canvas.SetColor(r, g, b) canvas.DrawEllipse(Self.location.x, Self.location.y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) canvas.Flush End Method Circle:Void(x:Float, y:Float, w:Float, h:Float) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) 'DrawPoint(x + Cos(phi) * w, y - Sin(phi) * h) Next End Method checkEdges:Void() If (location.x > Self.width) Self.location.x = 0 Else If (Self.location.x < 0) Self.location.x = Self.width End If (location.y > Self.height) Self.location.y = 0 Else If (location.y < 0) Self.location.y = Self.height End End End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Method sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) ' ret.x = v.x - vec.x ' ret.y = v.y - vec.y Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
Vectors Example 1-11 Move the mouse Strict '************************************************* 'The Nature of Code 'Daniel Shiffman 'http://natureofcode.com 'Example 1-11: Motion 101 Acelleration. 'Translated to Monkey Mojo 2 by Aroldo Carvalho 'April 2016 '************************************************* Import mojo2 Import pvector ' !!!!! ------ Import classes need lowercase names ------ !!!!!! Import mover Class Vectors1_11 Extends App Field width:Float = 0 Field height:Float = 0 Field canvas:Canvas Field movers:Mover[20] Field touching:Int Field touchhit:Int Field touchX:Float Field touchY:Float Field accX:Float Field accY:Float Field accZ:Float Method OnCreate:Int() SetUpdateRate(60) canvas = New Canvas Local r:= 12 Local g:= 10 Local b:= 5 For Local i:= 0 Until movers.Length movers[i] = New Mover() movers[i].setColor(r, g, b) r *= 2; g *= 4; b *= 2 End Return True End Method OnRender:Int() canvas.Clear(1.0, 1.0, 1.0) For Local i:= 0 Until movers.Length movers[i].update() movers[i].display(canvas) 'Print "i:"+i+ " x:"+ movers[i].location.x + " y:"+ movers[i].location.y End canvas.Flush Return True End Method OnUpdate:Int() ' input() ' get Use r Touch screen or mouse Return True End Method input:Int() 'touching=0 touchhit = -1 For Local i:Int = 0 Until 64 If TouchDown(i) touching+=1 Next touchhit = TouchHit() touchX = TouchX(0) touchY = TouchY(0) accX = AccelX() accY = AccelY() accZ = AccelZ() Return True End End Function Main:Int() New Vectors1_11() Return true End Strict Import mojo2 Import pvector Class Mover 'Our object has two PVectors: location and velocity. Field location:PVector Field velocity:PVector Field topspeed:Float Field w:Float Field h:Float Field R:Float Field G:Float Field B:Float Method New() w = DeviceWidth() h = DeviceHeight() If w = 0 w = 640 End If h = 0 h = 360 End location = New PVector(Rnd(w), Rnd(h)) velocity = New PVector(0, 0) topspeed = 5 End Method update:Void() 'Compute a vector that points from location to mouse Local mouse:PVector = New PVector(MouseX(), MouseY()) Local acceleration:PVector = PVector.sub(mouse, Self.location) 'Set magnitude of acceleration acceleration.normalize() acceleration.mult(0.2) 'Velocity changes according to acceleration velocity.add(acceleration) 'Limit the velocity by topspeed velocity.limit(topspeed) 'Location changes by velocity location.add(velocity) End Method display:Void(canvas:Canvas) canvas.SetAlpha(0.8) Local r:Float = 127 / 255.0, g:Float = 127 / 255.0, b:Float = 127 / 255.0 canvas.SetColor(0.5, 0.5, 0.5) Circle(location.x, location.y, 16, 16, canvas) canvas.SetAlpha(0.7) canvas.SetColor(R, G, B) canvas.DrawEllipse(location.x, location.y, 16, 16) r = 127 / 255.0; g = 127 / 255.0; b = 64 / 255.0 canvas.SetColor(127, 127, 64) canvas.SetAlpha(1.0) End Method Circle:Void(x:Float, y:Float, w:Float, h:Float, canvas:Canvas) For Local phi:Float = 0.0 Until 360.0 Step 10 canvas.DrawLine(x + Cos(phi - 10) * w, y - Sin(phi - 10) * h, x + Cos(phi) * w, y - Sin(phi) * h) Next End Method checkEdges:Void() If (location.x > w) location.x = 0 Else If (location.x < 0) location.x = w End If (location.y > h) location.y = 0 Else If (location.y < 0) location.y = h End End Method setColor:Void(r:Float, g:Float, b:Float) R = r / 255.0; G = g / 255.0; B = b / 255.0 End End Strict Class PVector Field x:Float Field y:Float Method New(x_:Float = 0, y_:Float = 0) x = x_ y = y_ End ' Method New(v:PVector, vec:PVector) ' x = x_ ' y = y_ ' End 'A function to add another PVector to this PVector. Simply add the x components and the y components together. Method add:Int(v:PVector) y = y + v.y x = x + v.x Return True End Function add:PVector(v1:PVector, v2:PVector) Local v3:PVector = New PVector(v1.x + v2.x, v1.y + v2.y) Return v3 End Method sub:Int(v:PVector) x = x - v.x y = y - v.y Return True End Function sub:PVector(v:PVector, vec:PVector) Local ret:PVector = New PVector(v.x - vec.x, v.y - vec.y) Return ret End Method mult:Int(n:float) x = x * n y = y * n Return True End Method div:Int(n:float) x = x / n y = y / n Return True End Method mag:Float() Return Sqrt(x * x + y * y) End Method normalize:Void() Local m:Float = mag() If (m <> 0) div(m) End End Method limit:Void(high:Float) If (Self.mag() > high) normalize() mult(high) End End End |
| ||
would be nice if this was all in a single easy to grab zip file as well. |
| ||
Paul - Taiphoz, You can get the zipped files here http://apd-games.com/NatureOfCode/vectors_MOJO2.zip. |