|
|
| Absorber - There can be only one |
|
Joe larson
Member #10,200
September 2008
|
EDIT: Changing the name to Rover Wars. {"name":"roverwars.gif","src":"http:\/\/static.allegro.cc\/image\/cache\/3\/6\/3689497099ba45c4f3b0c9427bd1d160.gif","w":300,"h":225,"tn":"http:\/\/static.allegro.cc\/image\/cache\/3\/6\/3689497099ba45c4f3b0c9427bd1d160"} I'm gonna feature this game on my site, Cymon's Games, in February, but it turned out so well I've just got to show it off. I could expand it, add a score table to declare a winner after a number of rounds, add sound, but I'm gonna keep this one simple. It proves the concept. If it turns out that folks like this I may make those additions. Download it compiled for windows and it's source here. Note to self, allegro.cc forums uses html tags, not BBCode. |
|
Trent Gamblin
Member #261
April 2000
|
Great little game! If eating hotdogs is wrong, I don't wanna be right. |
|
MiquelFire
Member #3,110
January 2003
|
Fun game. A little confusing as to which ball is whose (whom? Err, Matt!) when you start however. --- |
|
Joe larson
Member #10,200
September 2008
|
I've updated the zip with some minor (cheap) changes to the main menu to hopefully make the colorization a little clearer. protip - press F10 while the game is running. |
|
kazzmir
Member #1,786
December 2001
|
Pretty neat game dynamics, but its not that hard. I was able to win 3 times in a row. I think its a great base for something more interesting. Maybe make the screen larger (like a large virtual area that you can move through) and have things like negative balls that always take away some of your life? |
|
OnlineCop
Member #7,919
October 2006
|
Very neat. One small problem is that when you're playing against 2 computers, and one of those spawns by the edge of the screen, it just "bounces" next to the screen edge instead of seeking out the balls around it (or even avoiding the bigger balls/enemies as they move closer). Other than that, this is a perfect candidate for an iPhone or Facebook app. It's a little high on the CPU usage, but that can always be tweaked later. Thumbs up! EDIT: Also, what to do in this situation (against a computer OR other players): {"name":"600015","src":"http:\/\/static.allegro.cc\/image\/cache\/9\/0\/90b85af2cfee2c5d203f72717cbb637c.png","w":806,"h":626,"tn":"http:\/\/static.allegro.cc\/image\/cache\/9\/0\/90b85af2cfee2c5d203f72717cbb637c"} EDIT 2: Here's what happens when it's 3 computers all against each other: {"name":"600016","src":"http:\/\/static.allegro.cc\/image\/cache\/3\/f\/3fdbfa5cbda586fcf515e67d0cd25590.png","w":806,"h":628,"tn":"http:\/\/static.allegro.cc\/image\/cache\/3\/f\/3fdbfa5cbda586fcf515e67d0cd25590"} Seems the big one is too concerned about the li'l one to go after the medium one, and the medium one is just scared off its own little corner. The physics and logic in this were very well implemented. EDIT 3: Yay, Playser 1 wins! Can you find him? Player 2, who was quite massive, got sucked into a NPC as Player 1 was running for his life from its own NPC black hole predators: {"name":"600017","src":"http:\/\/static.allegro.cc\/image\/cache\/7\/8\/7842c0693e87d8fc1223bbbd809be0bc.png","w":803,"h":626,"tn":"http:\/\/static.allegro.cc\/image\/cache\/7\/8\/7842c0693e87d8fc1223bbbd809be0bc"} -- |
|
Joe larson
Member #10,200
September 2008
|
Naturally the game is better against a human. The AI is pretty dumb. It just find the closest bubble and if it's smaller moves towards it and if it's bigger moves away from it. Oh, and in the case of a jerk hiding in the corner, your bad for getting so big. You can take care of it by pressing F1 and starting over. |
|
OnlineCop
Member #7,919
October 2006
|
So the point of this game is "it sucks to be you"? -- |
|
Dario ff
Member #10,065
August 2008
|
Great game! TranslatorHack 2010, a human translation chain in a.cc. |
|
OnlineCop
Member #7,919
October 2006
|
Joe, looks good, but you have an early "return" in your Blob::check_collision() code: 48int Blob::check_collide (Blob* obj) {
49 if( (obj->x - obj->radius) > (this->x + this->radius) ) return 0;
50 if( (obj->x + obj->radius) < (this->x - this->radius) ) return 0;
51 if( (obj->y - obj->radius) > (this->y + this->radius) ) return 0;
52 if( (obj->y + obj->radius) < (this->y - this->radius) ) return 0;
53 return 1; 54 int xx = abs(this->x - obj->x);
55 int yy = abs(this->y - obj->y);
56 double d = xx * xx + yy * yy; // Pythagorean theorem minus the sqrt to save processor cycles
57 if (d <= ((this->radius + obj->radius) * (this->radius + obj->radius))) { // we have overlap
58 return 1;
59 }
60 return 0;
61}
I got rid of this, and the balls correctly collided when they were at diagonals with each other (and overlapping visually). Otherwise, they SHOULD have absorbed each other but didn't. -- |
|
Joe larson
Member #10,200
September 2008
|
Thanks for that. Duh. If you have any hints for the frame rate people are complaining about. Maybe that's just the frame rate the game's moving at. let's see... 10 frames per second. Yeah that is a bit slow. But if I drop that it'll speed up the game, and I don't know that I want that. I'll play with it. |
|
Dario ff
Member #10,065
August 2008
|
You know, normally in programming, Delta Timing is a popular technique for making the game run at the same speed in any frame rate But, what the hell, I have the source code, I'll add it myself TranslatorHack 2010, a human translation chain in a.cc. |
|
OnlineCop
Member #7,919
October 2006
|
This won't speed things up considerably, but you have several places where you do this kind of construct: if (blobs[c].x - blobs[c].radius < 0) ... if (blobs[c].y - blobs[c].radius < 0) ... if (blobs[c].x + blobs[c].radius) > SCREENW) ... if (blobs[c].y + blobs[c].radius) > SCREENH) ... I would think that if blob[c].x is close to the left edge of the screen, it can automatically exclude the need for the check that it's against the right edge of the screen as well. You could rewrite this to: if (blobs[c].x - blobs[c].radius < 0) ... else if (blobs[c].x + blobs[c].radius) > SCREENW) ... if (blobs[c].y - blobs[c].radius < 0) ... else if (blobs[c].y + blobs[c].radius) > SCREENH) ... Then, if you're by the left edge of the screen, you're not going to check that you're exceeding the right bounds of the screen also. You may consider sorting all of your blobs. Since your screen is wider than it is tall, it's better to sort them along the x-axis. Then, when you are testing for collisions, you can eliminate all blobs that are too far away. This will at help with the framerate, since you're currently testing ALL blobs, even those on the opposite end of the screen. And why do you (re)initialize the player_colors every time your gameloop() is called? Since the color values are fixed (not dependent on their sizes, or anything), call them within your init() loop a single time, and pass them into your other functions (if you don't want to just make them globals). EDIT 1class Blob
2{
3public:
4 ...
5
6 Blob(int new_x = 0, int new_y = 0, double new_radius = 1.0)
7 {
8 this->x = new_x;
9 this->y = new_y;
10 this->dx = 0;
11 this->dy = 0;
12 this->radius = new_radius;
13 this->calc_area ();
14 this->playerid = 0;
15 }
You can initialize everything using the single-colon, which even gives you the ability to set const-defined variables (or, well, consts 1 Blob(int new_x = 0, int new_y = 0, double new_radius = 1.0) :
2 x(new_x),
3 y(new_y),
4 dx(0),
5 dy(0),
6 radius(new_radius),
7 playerid(0)
8 {
9 this->calc_area ();
10 }
</nitpick> -- |
|
BAF
Member #2,981
December 2002
|
Interesting game. Is there a way to show FPS built in? Because it seems to run fine for me. Also, you should set the color depth to the desktop color depth so aero doesn't kick off in Windowed mode. |
|
SiegeLord
Member #7,827
October 2006
|
dario ff said:
You know, normally in programming, Delta Timing is a popular technique for making the game run at the same speed in any frame rate "For in much wisdom is much grief: and he that increases knowledge increases sorrow."-Ecclesiastes 1:18 |
|
Dario ff
Member #10,065
August 2008
|
I still mantain my point of view TranslatorHack 2010, a human translation chain in a.cc. |
|
Joe larson
Member #10,200
September 2008
|
I'm using the allegro timer routines to control my framerate. It was my understanding this would fix my timing at a constant rate. Is that not the case? At the moment my framerate is a 66ms pause, which should translate into about 15FPS. @OnlineCop - Investigating further turns out that early return statement caused false positives on the collision at diagonals which was giving me negative overlap which was causing me trouble until I figured it was negative overlaps and corrected the code for that in the collides_with function, essentially fixing the symptom while not getting at the root cause. Now that I've fixed that I'm guessing my check for negative distances is mostly redundant, but good to have. Also, concerning your else statements when you hit the side wall. Yeah, that might be a minor, very minor, optimization. But concerning sorting the list I do not see an effective way to make that save any time due to the 2D nature of the board. Unless I do some sort of perpixel check on the edges of the bubble. That's why "check_collide()" (IIRC that's what I called it) does a quick AABB check before pulling out the more mathematically intensive Pythagorean's. And double oops to initializing player_colors every time. Fixed now. re: nitpick - Wow! I didn't know it worked like that. Obviously I'm still learning. |
|
Dario ff
Member #10,065
August 2008
|
The way you're doing your timing is right. I'm just complaining because you putted a so LOW fps limit. I mentioned Delta Timing because you said that you wanted it to run at the same speed, and that's what it does. But Siege Lord now mantains a point for fixed framerate... IDK, leave it in 10 FPS if you want to. I can always modify the source code. Joe larson said: EDIT: Changing the name to Rover Wars.
Ohhh... TranslatorHack 2010, a human translation chain in a.cc. |
|
CursedTyrant
Member #7,080
April 2006
|
Setting the FPS limit below 30 for a game that isn't Tic-Tac-Toe is absurd. --------- |
|
Joe larson
Member #10,200
September 2008
|
@dario ff: "Ohhh... |
|
|