Bläddra i källkod

Added wall sliding. Corrected a pattern, enabled again game over.

Eiyeron Fulmincendii 11 år sedan
förälder
incheckning
00f8ab5249
4 ändrade filer med 63 tillägg och 7 borttagningar
  1. 1 1
      init_states.c
  2. 34 4
      update_states.c
  3. 26 2
      wall.c
  4. 2 0
      wall.h

+ 1 - 1
init_states.c

@@ -62,7 +62,7 @@ const unsigned char patternTest3[] = {
 };
 
 const unsigned char patternTest4[] = {
-	0x0D,  0x00, 0x80,
+	0x0E,  0x00, 0x80,
 	0x00,  0x00, 0x00,    0x00, 0x65,
 	0x03,  0x00, 0x00,    0x00, 0x65,
 

+ 34 - 4
update_states.c

@@ -2,6 +2,9 @@
 #include "pattern.h"
 #include "fixed.h"
 
+static void game_over(Game_Data *data);
+
+
 void update_title(Game_Data *data)
 {
 	data->last_time = data->current_time;
@@ -34,7 +37,8 @@ void update_game(Game_Data *data)
 
 		// if the player and a wall collide
 		if(isColliding(data->list, data->player_angle, data->nb_lines) == true) {
-			// death handling
+			game_over(data);
+			return;
 		}
 	// remove every wall whose distance to the center equals zero
 		data->list = removeWall(data->list, 8);
@@ -46,12 +50,19 @@ void update_game(Game_Data *data)
 		data->cooldown_timer = pattern.cooldown;
 	}
 
-	// TODO : stop at wall side.
 	if(KeyDown(K_LEFT)){
-		data->player_angle-=data->level->player_rotation_speed *  (data->current_time - data->last_time)*FRAME_TIME;
+		float new_player_position = data->player_angle - data->level->player_rotation_speed *  (data->current_time - data->last_time)*FRAME_TIME;
+		if(!isCollidingSide(data->list, data->player_angle, data->nb_lines) && isCollidingSide(data->list, new_player_position, data->nb_lines)) {
+			new_player_position = data->player_angle;
+		}
+		data->player_angle = new_player_position;
 	}
 	if(KeyDown(K_RIGHT)){
-		data->player_angle+=data->level->player_rotation_speed *  (data->current_time - data->last_time)*FRAME_TIME;
+		float new_player_position = data->player_angle + data->level->player_rotation_speed *  (data->current_time - data->last_time)*FRAME_TIME;
+		if(!isCollidingSide(data->list, data->player_angle, data->nb_lines) && isCollidingSide(data->list, new_player_position, data->nb_lines)) {
+			new_player_position = data->player_angle;
+		}
+		data->player_angle = new_player_position;
 	}
 
 	if(KeyDown(K_ALPHA) && data->alpha_latch_value == 0) {
@@ -82,6 +93,7 @@ void update_game(Game_Data *data)
 	data->player_angle = MOD(data->player_angle, 360);
 
 	updateCamera(&(data->cam), data->current_time - data->last_time);
+
 }
 
 void update_menu(Game_Data *data)
@@ -112,3 +124,21 @@ void updateCamera(Camera *cam, unsigned int delta_time){
 		cam->angle = cam->angle % 360;
 
 }
+
+
+static void game_over(Game_Data *data) {
+	// clean up wall
+	int i = 128;
+	while(data->list != NULL) {
+		Wall *next = data->list->nxt;
+		free(data->list);
+		data->list = next;
+	}
+	for (i = 0; i < data->level->nb_patterns; ++i)
+	{
+		freePattern(&data->level->patterns[i]);
+	}
+	free(data->level);
+
+	switch_to_state(MENU, data);
+}

+ 26 - 2
wall.c

@@ -118,7 +118,7 @@ void drawWalls(Wall *list, Game_Data *data, int nb_lines, Line_Transition line_t
 				fix dist = ftofix(tmp->d + cam->zoom);
 				for(i = 0; i < tmp->h && dist > FIX(8); ++i) {
 					if(dist < FIX(96))
-					ML_line(64 + fixtof(fmul(dist, cos1)), 32 + fixtof(fmul(dist,sin1)), 64 + fixtof(fmul(dist, cos2)), 32 + fixtof(fmul(dist, sin2)), drawing_color);
+						ML_line(64 + fixtof(fmul(dist, cos1)), 32 + fixtof(fmul(dist,sin1)), 64 + fixtof(fmul(dist, cos2)), 32 + fixtof(fmul(dist, sin2)), drawing_color);
 					dist -= FIX(1);
 				}
 			}
@@ -128,6 +128,29 @@ void drawWalls(Wall *list, Game_Data *data, int nb_lines, Line_Transition line_t
 
 }
 
+
+// Tests if the players hits a wall by its sides and not only by being crushed under it.
+bool isCollidingSide(Wall *list, int player_angle, int nb_lines) {
+	Wall *tmp;
+	tmp = list;
+
+	do{
+		if(tmp != NULL)
+		{
+			if(tmp-> d <= 8+tmp->h + 2)
+			{	// and is on the same line than the player
+				if(tmp->line == (int)(player_angle/ (360 / nb_lines)) && tmp->line < nb_lines)
+				{
+					return true;
+				}
+			}
+		}
+		tmp = tmp->nxt;
+	}while(tmp != NULL);
+	return false;
+
+}
+
 // tests every Wall in the list
 bool isColliding(Wall *list, int player_angle, int nb_lines)
 {
@@ -137,7 +160,8 @@ bool isColliding(Wall *list, int player_angle, int nb_lines)
 	do{
 		if(tmp != NULL)
 		{
-			if(tmp-> d <= 8+tmp->h + 2)// if the wall is close enough from the center of the screen
+			//if(tmp-> d <= 8+tmp->h + 2)// if the wall is close enough from the center of the screen
+			if(tmp-> d <= 8 + 2)// if the wall is close enough from the center of the screen
 			{	// and is on the same line than the player
 				if(tmp->line == (int)(player_angle/ (360 / nb_lines)) && tmp->line < nb_lines)
 				{	// BOOM

+ 2 - 0
wall.h

@@ -13,6 +13,8 @@ Wall *removeWall(Wall *list, int d); // returns a new pointer to the first eleme
 void drawWalls(Wall *list, Game_Data *data, int nb_lines, Line_Transition line_transition);
 // updates the ll "list"
 void updateWalls(Wall *list, unsigned int delta_time);
+// Tests if the players hits a wall by its sides and not only by being crushed under it.
+bool isCollidingSide(Wall *list, int player_angle, int nb_lines);
 // simple collision test. Returns true if a Wall from the list collides with the player
 bool isColliding(Wall *list, int player_angle, int nb_lines);
 #endif