Adding some functionalityI was happy that I had this and that on the screen, doing this and that, but nothing affected anything. This, obviously, wasn't acceptable, so the next attributes added to the GameObject were hitpoints, for example. Of course I added much more junk to it but none of it makes any sense or difference at this point, so we'll just ignore them for now. As I had decided to work on something Asteroids-like (no, I wasn't going to stay there but to add much more weird but interesting junk) project, (not) colliding with things is pretty important, I guess. While writing up this set of posts I've also worked on more than makes sense to explain now.
- The rocks can hit the player's ship and vice versa
- The rocks can hit each other
- The speed difference should matter
- Mass differences should matter
- The collision angle is also important
Two-phased collision detectionBecause at a given moment there can be quite a good amount of Objects on the lists, there's absolutely no point in checking each and every one by the pixel. It's maybe better to first check if any two objects are about to collide and only then go for a more accurate check, if needed. In the first phase - at the moment - I just iterate through the list of all the 'roids and the player's Ship and compare each other's basic areas for overlapping. To this task pygame's rectangle.colliderect() function is just fine:
def collides_with(self, other):
collides = False
if self and other:
collides = self.accurate_collision(other)
def accurate_collision(self, other):
Naturally the second method is only a stub that I'll implement properly whenever I get to it. Right now it just says "yeah, yeah, they do collide, stop bothering me already" and then both colliding GameObjects get a 2d6 amount of damage until one or both of them are destroyed. Because there are four sizes of Asteroids, the bigger ones break into n smaller Asteroids, if the masters of d6 so decide.
While testing I got rather quickly tired of my ship being destroyed while flying around, so I added a Megatron-like cheat. The game says Afterdeath and the Ship's hitpoints are replenished as if nothing had ever happened.
One chilly morning I was chatting about this project with a yet another coworker of mine (he had noticed some mumblings of mine in g+). Among many others a comment about the lack of antialiasing was brought up, he asked if I had considered using it or if I was going for a more retro look. My answer was that yes, I was going to do that whenever I got some more important and more bothersome stuff done out of the way. While we were chatting we took a look at Pygame's docs and we noticed that if I just switch all my draw.polygon-calls to draw.aalines and add a single True variable, nothing else is needed. So I tried that out the same evening and it does look much nicer, doesn't it?
After the collisionBecause it would be rather ridiculous to have the space rocks flying inside and through each other after the initial collision, giving more and more damage, I thought it'd be handy to work on the deflect-method that would count the new speed vectors and angles to the colliding parties. If I could come up with something even remotely like billiards table physics, I'd be a happy *camper*. When that gets combined with critical hits (a small but fast Asteroid could crack an enormous one in two, for example), the result could be pretty fun. Oh, and the planets and who knows what else... I've got absolutely nothing ready so far!
"War. War never changes."For everyone who's listened or read to my endless mumblings it's clear as day that among many other weird things Star Wars and Battletech are (and have been) big things for me. Especially BT is something I'm going to get some weapons-related influence. The main idea is that the player could choose one or few items of violence in their ships, depending on the ship's slots. Missiles/rockets, death rays (with or without pulses), automatic cannons and particle cannons that spit out cerulean bolts of lightning. Muahahahaha!
And if you can swap the weapon modules, why not the reactor as well?
I'm just throwing ideas around, I'll find out later what on earth I want to do with this.