Mar 2, 2016

Finished Game

So my game is finished, and I've got mixed feelings about it. On the one hand, I'm glad that it works and is pretty stable. I came into this project only wanting to make a simple game of tag with some special features, like obstacles. As I worked I had to remove some of the features I wanted, like obstacles and a restart button, for the sake of having a working networked prototype at the deadline. If I had more time I would have added things like:


  • Obstacles with collision detection
  • Make players switch colors when they touch (switch who is "it")
  • A restart button
I'm also a little disappointed that I didn't get to add in any data checking during the grace period that would have let me run the game at a higher framerate. I just didn't have time with work and class.

The finished project is pretty simple. I took some screenshots to show the progression of the game:
The start location for the players
The red player, who is "it" gets closer to the target.
When the red player touches blue, both players see the game over screen.
There were a few code snippets that I think exemplify some of the effort I put into the project, even if the end result wasn't very flashy. First, there's the logic I built for the collision detection. 

boolean isInsideRect(float x, float y, float rectX, float rectY, float rectW, float rectH)
{
boolean answer = x > rectX && y > rectY && x < rectX+rectW && y < rectY+rectH; return answer; }


This function was used in my IMM120 class (I can't find the original github repo) and I had to tweak it for my implementation:

if ((isInsideRect(player1.x, player1.y, player2.x, player2.y, size, size)) ||
(isInsideRect(player1.x, player1.y+size, player2.x, player2.y, size, size))||
(isInsideRect(player1.x, player1.y, player2.x+size, player2.y, size, size))||
(isInsideRect(player1.x, player1.y, player2.x, player2.y+size, size, size))||
(isInsideRect(player1.x+size, player1.y, player2.x, player2.y, size, size))||
(isInsideRect(player1.x+size, player1.y+size, player2.x, player2.y, size, size))||
(isInsideRect(player1.x+size, player1.y+size, player2.x+size, player2.y+size, size, size))||
(isInsideRect(player1.x+size, player1.y, player2.x, player2.y+size, size, size))||
(isInsideRect(player1.x+size, player1.y, player2.x+size, player2.y, size, size))||
(isInsideRect(player1.x+size, player1.y+size, player2.x+size, player2.y, size, size))||
(isInsideRect(player1.x+size, player1.y+size, player2.x, player2.y+size, size, size))||
(isInsideRect(player1.x+size, player1.y, player2.x, player2.y+size, size, size))||
(isInsideRect(player1.x, player1.y, player2.x+size, player2.y, size, size))||
(isInsideRect(player1.x, player1.y, player2.x, player2.y+size, size, size))||
(isInsideRect(player1.x, player1.y, player2.x+size, player2.y+size, size, size))||
(isInsideRect(player1.x, player1.y+size, player2.x+size, player2.y+size, size, size))
== true) {
gameOver = true;
}



As you can see, it's a bit tedious and sloppy. But it's the way I know how to do collision detection, so I used it. It seems to work.

I also like the way I did movement for the player who is "it". I used processing's second() function to count time, and after 30 seconds have passed the player moves faster. It isn't really anything special, but I liked the functionality of it.

void update(){
if(keyPressed == true && keyCode == UP){
y -= speed;
}
if(keyPressed == true && keyCode == DOWN){
y += speed;
}
if(keyPressed == true && keyCode == RIGHT){
x += speed;
}
if(keyPressed == true && keyCode == LEFT){
x -= speed;
}
if (x > width - 100){
x = width - 100;
}
if (x < 0){ x = 0; } if (y > height - 100){
y = height - 100;
}
if (y < 0){ y = 0; } if (time > 30){
speed = 15;
}
}



All in all, there were a couple takeaways from this project for me.

1. Collision detection is hard
2. Everything will always take longer and be harder than you think it will.

I wish I had had more time/skill to implement the features I wanted to. I'm a little disappointed with the outcome of this project, but I'm glad it at least works on some level.