Monkey Game Development Book HelpMonkey Forums/Monkey Beginners/Monkey Game Development Book Help
| Hello Everyone,|
I am taking a Game Development Class, and we are using Monkey Game Development. In chapter 3 it wants to make a game called Rocket Commander it is much like Missile Command. The last part for the bombs in the CheckCollisions Method I am getting a error of cannot convert explosion to float here is the whole Method.
For Local explosion := Eachin explosions
dist = GetDistance(cx, cy, explosion.x, explosion.y)
If dist < explosion Then
game.score += expolsion.score
game.totalBombsDestroyed += 1
explosion.score += 100
For Local city := Eachin cities
dist = GetDistance(cx, cy, city.x, city.y)
If dist < 30 Then
For Local launcher := Eachin launchers
dist = GetDistance(cx, cy, launcher.x, launcher.y)
If dist < 15 Then
Has anyone worked with this book and can give me some advice.
| I haven't seen the book but from what I can see is that explosion is an object and dist is a float. maybe it should be dist < explosion.radius? |
post the explosion class code. maybe it will help making correct conclusion.
| Yes, it's a book typing error|
In my code this block is
For Local explosion := Eachin explosions dist = GetDistance(cx, cy, explosion.x, explosion.y) If dist < 20 Then bombs.Remove(Self) game.score += explosion.score game.totalBombsDestroyed += 1 explosion.score += 100 Endif Next
| Thanks nikoniko for helping out. |
| GetDistance isn't getting the actual distance between 2 points is it? If so, that's horribly inefficient for comparing distance. The book hopefully mentions that square root calculations are very heavy, especially on mobile devices. Always use the squared distance where possible.|
Edit: Let me mention that one of my games used the real distance for computations and it stopped the game from displaying more than sixty things on screen at a time without bogging down to a few frames a second. I then switched it over to use squared distances and it allowed me to put thousands of things on screen all at once without this bogging down.
| Goodlookinguy wrote:|
The book hopefully mentions that square root calculations are very heavy, especially on mobile devices. Always use the squared distance where possible.
I am thinking RC is very simple game example and using square root is right as example game engine geometry. Next step - optimization! Use square funct or precalculated table of func (sqrt, sin, cos, etc) for superfast position/distance how we did in pc/xt time without math coprocessor :)
PS What is smooth font ugly in Internet Explorer?!
| Lookup tables are kinda useless now since floating point values are used more often than not.|
Something like this is tons of times faster than getting the real distance and is realistic for use in modern day games. I just hope the book mentions this somewhere along the way.
For Local explosion := Eachin explosions dist = GetSquaredDistance(cx, cy, explosion.x, explosion.y) If dist < 20*20 bombs.Remove(Self) game.score += explosion.score game.totalBombsDestroyed += 1 explosion.score += 100 End Next Function GetSquaredDistance( x1:Float, y1:Float, x2:Float, y2:Float ) Local distX:Float = x2 - x1 Local distY:Float = y2 - y1 Return distX * distX + distY * distY End
| Goodlookinguy wrote:|
Something like this is tons of times faster than getting the real distance and is realistic
You're right. It's the good and useful optimization example.
| To me|
dist = GetSquaredDistance(cx, cy, explosion.x, explosion.y)
If dist < 20*20
Looks like a circle to circle collision and could be code to call a function to return a bool
If Circle2Circle(cx, cy, explosion.x, explosion.y,10,10)..... Function Circle2Circle:Bool( x1:Float, y1:Float, x2:Float, y2:Float, r1:Float, r2:Float ) Local dx:Float = x2 - x1 Local dy:Float = y2 - y1 Local ri:Float = r1 + r2 Return ( (dx * dx) + (dy * dy) <= ri * ri ) End Function
An interesting article that's worth a read about the origin of the inverse square root function in Quake 3
| It's interesting that the code matches up with a circles colliding algorithm. Although I based that algorithm on 2 vectors. And, to be fair, it doesn't actually match up completely.|
This part of the line
is precomputed to
I was just doing 20*20 for readability.
Edit: Also, I think just about everyone knows about the invsqrt function after the source code for those large games were released and it was riddled with fowl comments.
| It can also be useful to check the bounding box first:|
' Calculate dx and dy
If dx >= - 20 And dx <= 20 And dy >= -20 And dy <= 20
If dx * dx + dy * dy <= 20 * 20
' Collision happens
Realistically, though, a missile command game is probably testing less than 100 collisions per update, and finicky optimisations are unnecessary on modern machines.
| The quake sources were riddled with expressive comments not fowl! |
| Semantics. Still, they were working with C++ so I'm not surprised. |