Thanks Matt.
@Mark: Not sure what's wrong. When compiling the source code for HTML5 I do not get that error but with Android I do.
UPDATE - FIXED !!
Okay... I went back & poured over the code, and the culprit is the naming of the app class conflicting with the object class. One is BlobMonster, whilst the other is blobmonster. Now, these *shouldn't* conflict as the language is case sensitive(?).
To fix it, I renamed the app portion and references to "monster" and the object portions to "BlobMonster". Viola! I got a sea monkey guy swimming around on my phone. Too cool !!
Import mojo
Import monkey.math
' The overall Game object, handling loading, mouse position, high-level game control and rendering...
Class point
Field x:Float,y:Float
End
Function MidHandle (image:Image)
image.SetHandle image.Width () * 0.5, image.Height () * 0.5
End
Class BlobMonster
'x and y coords
Field x:Float, y:Float
'speed, try changing it
Field speed:Float = 1
'number of nodes along the body, try changing it to 100
Field segments:Float = 10
'array to hold the points along the body
Field tail:point[10]
Field time:Float = 0
Field blob:Image
Method New(inx:Float,iny:Float,inimage:Image)
x = inx
y = iny
'give the tail some coordinates, just make them the same as the main x and y for now
For Local i:Int = 0 To segments - 1
tail[i] = New point
tail[i].x = inx
tail[i].y = iny
Next
blob=inimage
End
Method Update:Int()
'time is a bit misleading, it's used for all sorts of things
time+=speed
'here the x and y coordinates are updated.
'this uses the following as a basic rule for moving things
'around a point in 2d space:
'x=radius*cos(angle)+xOrigin
'y=raduis*sin(angle)+yOrigin
'this basically is the basis for anything that moves in this example
'
'the 2 lines of code below make the monster move around, but
'you can change this to anything you like, try setting x and y to the mouse
'coordinates for example
y = (15 * Cos(time * -6)) + (240 + (180 * Sin(time * 1.3)))
x = (15 * Sin(time * -6)) + (320 + (200 * Cos(time / 1.5)))
'put the head of the tail at x,y coords
tail[0].x = x
tail[0].y = y
'update the tail
'basically, the points don't move unless they're further that 7 pixels
'from the previous point. this gives the kind of springy effect as the
'body stretches
For Local i:Int = 1 To segments - 1
'calculate distance between the current point and the previous
Local distX:Float = (tail[i - 1].x - tail[i].x)
Local distY:Float = (tail[i - 1].y - tail[i].y)
Local dist:Float = Sqrt(distX * distX + distY * distY)
'move if too far away
If dist > 7 Then
'the (distX*0.2) bit makes the point move
'just 20% of the distance. this makes the
'movement smoother, and the point decelerate
'as it gets closer to the target point.
'try changing it to 1 (i.e 100%) to see what happens
tail[i].x = tail[i].x + (distX * (0.3))
tail[i].y = tail[i].y + (distY * (0.3))
Endif
Next
Return False
End Method
Method Draw()
'time to draw stuff!
'this sets the blend mode to LIGHTBLEND, or additive blending, which makes
'the images progressively more bright as they overlap
SetBlend 1
'###########
'draw the main bit of the body
'start by setting the images handle (i.e the origin of the image) to it's center
blob.SetHandle(blob.Width()*0.5,blob.Height()*0.5)
'begin looping through the segments of the body
For Local i:Int = 0 To segments - 1
'set the alpha transparency vaue to 0.15, pretty transparent
SetAlpha 0.15
'the (0.5*sin(i*35)) bit basically bulges the size of the images being
'drawn as it gets closer to the center of the monsters body, and tapers off in size as it gets
'to the end. try changing the 0.5 to a higher number to see the effect.
'draw the image
DrawImage blob, tail[i].x, tail[i].y,0,1 + (0.5 * Sin(i * 35)), 1 + (0.5 * Sin(i * 35))
'this next chunk just draws smaller dots in the center of each segment of the body
SetAlpha 0.8
DrawImage blob, tail[i].x, tail[i].y,0,0.1, 0.1
Next
'#########################
'draw little spikes on tail
'note that the x and y scales are different
'move the image handle to halfway down the left edge, this'll make the image
'appear to the side of the coordinate it is drawn too, rather than the
'center as we had for the body sections
blob.SetHandle 0,blob.Height()*0.5
'rotate the 1st tail image. basically, we're calculating the angle between
'the last 2 points of the tail, and then adding an extra wobble (the 10*sin(time*10) bit)
'to make the pincer type effect.
DrawImage blob, tail[segments - 1].x, tail[segments - 1].y,10 * Sin(time * 10) + -calculateAngle(tail[segments - 1].x, tail[segments - 1].y, tail[segments - 5].x, tail[segments - 5].y) + 270,0.6, 0.1
'second tail image uses negative time to make it move in the opposite direction
DrawImage blob, tail[segments - 1].x, tail[segments - 1].y,10 * Sin(-time * 10) + -calculateAngle(tail[segments - 1].x, tail[segments - 1].y, tail[segments - 5].x, tail[segments - 5].y) + 270,0.6, 0.1
'#####################
'draw little fins/arms
SetAlpha 1
'begin looping through the body sections again. Note that we don't want fins
'on the first and last section because we want other things at those coords.
For Local i:Int = 1 To segments - 2
'like the bulging body, we want the fins to grow larger in the center, and smaller
'at the end, so the same sort of thing is used here.
'rotate the image. We want the fins to stick out sideways from the body (the calculateangle() bit)
'and also to move a little on their own. the 33 * Sin(time * 5 + i * 30) makes the
'fin rotate based in the i index variable, so that all the fins look like they're moving
'one after the other.
DrawImage blob, tail[i].x, tail[i].y,33 * Sin(time * 5 + i * 30) + -calculateAngle(tail[i].x, tail[i].y, tail[i - 1].x, tail[i - 1].y),0.1 + (0.6 * Sin(i * 30)), 0.05
'rotate the opposte fin, note that the signs have changes (-time and -i*30)
'to reflect the rotations of the other fin
DrawImage blob, tail[i].x, tail[i].y,33 * Sin(-time * 5 - i * 30) + -calculateAngle(tail[i].x, tail[i].y, tail[i - 1].x, tail[i - 1].y) + 180,0.1 + (0.6 * Sin(i * 30)), 0.05
Next
'###################
'center the image handle
MidHandle blob
'Draw the eyes. These are just at 90 degrees to the head of the tail.
SetAlpha 0.1
Local ang:Float = calculateAngle(tail[0].x, tail[0].y, tail[1].x, tail[1].y)
DrawImage blob, x + (7 * Cos(ang + 50)), y + (7 * Sin(ang + 50)),0,0.6, 0.6
DrawImage blob, x + (7 * Cos(ang + 140)), y + (7 * Sin(ang + 140)),0,0.6, 0.6
SetAlpha 0.5
DrawImage blob, x + (7 * Cos(ang + 50)), y + (7 * Sin(ang + 50)),0,0.1, 0.1
DrawImage blob, x + (7 * Cos(ang + 140)), y + (7 * Sin(ang + 140)),0,0.1, 0.1
'draw beaky thing
SetAlpha 0.8
blob.SetHandle 0, blob.Height()*0.5
DrawImage blob, x, y,-ang + 275,0.3, 0.1
'yellow light
MidHandle blob
SetAlpha 0.2
DrawImage blob, x, y,0,4, 4
'Finished!
End Method
End
'This function calculates and returns the angle between two 2d coordinates
Function calculateAngle:Float(x1:Float,y1:Float,x2:Float,y2:Float)
Local theX:Float=x1-x2
Local theY:Float=y1-y2
Local theAngle:Float=-ATan2(theX,theY)
Return theAngle
End Function
Class monster Extends App
Field blobimage:Image
Field theMonster:BlobMonster
' Stuff to do on startup...
Method OnCreate ()
blobimage=LoadImage( "blob.png" )
theMonster=New BlobMonster(10,10,blobimage)
SetUpdateRate 60
End
' Stuff to do while running...
Method OnUpdate ()
theMonster.Update()
End
' Drawing code...
Method OnRender ()
Cls(0, 0, 0)
theMonster.Draw()
End
End
' Here we go!
Function Main ()
New monster ' RocketGame extends App, so monkey will handle running from here...
End
Monkey file is named "monster.monkey" and of course the data folder is "monkey.data"
Not sure if this is a bug that crops up between platforms as I am still trying to get my feet wet, but I hope this helps.
I am interested if the original code compiles okay with flash, ios etc..
|