Ver código fonte

Made walls correctly stretching if a transition is doing.

Eiyeron Fulmincendii 11 anos atrás
pai
commit
467d8861f7
7 arquivos alterados com 74 adições e 46 exclusões
  1. 22 22
      FXSH_Build.bat
  2. 1 1
      draw_states.c
  3. 4 2
      hexagon.c
  4. 1 1
      struct.h
  5. 14 9
      update_states.c
  6. 31 10
      wall.c
  7. 1 1
      wall.h

+ 22 - 22
FXSH_Build.bat

@@ -1,22 +1,22 @@
-@echo off
-rem Do not edit! This batch file is created by CASIO fx-9860G SDK.
-
-
-if exist HEXAGON.G1A  del HEXAGON.G1A
-
-cd debug
-if exist FXADDINror.bin  del FXADDINror.bin
-"C:\Program Files\CASIO\fx-9860G SDK\OS\SH\Bin\Hmake.exe" Addin.mak
-cd ..
-if not exist debug\FXADDINror.bin  goto error
-
-"C:\Program Files\CASIO\fx-9860G SDK\Tools\MakeAddinHeader363.exe" "C:\Users\Florian\GIT\Super-Hexagon-Casio"
-if not exist HEXAGON.G1A  goto error
-echo Build has completed.
-goto end
-
-:error
-echo Build was not successful.
-
-:end
-
+@echo off
+rem Do not edit! This batch file is created by CASIO fx-9860G SDK.
+
+
+if exist HEXAGON.G1A  del HEXAGON.G1A
+
+cd debug
+if exist FXADDINror.bin  del FXADDINror.bin
+"C:\CASIO\fx-9860G_SDK\OS\SH\Bin\Hmake.exe" Addin.mak
+cd ..
+if not exist debug\FXADDINror.bin  goto error
+
+"C:\CASIO\fx-9860G_SDK\Tools\MakeAddinHeader363.exe" "Z:\home\eiyeron\Programming\Casio\Super-Hexagon-Casio"
+if not exist HEXAGON.G1A  goto error
+echo Build has completed.
+goto end
+
+:error
+echo Build was not successful.
+
+:end
+

+ 1 - 1
draw_states.c

@@ -6,7 +6,7 @@ void draw_game(Game_Data *data)
     drawDiagonals(data->cam, data->nb_lines, data->line_transition);
     	//showing the walls
     if(data->list != NULL)
-	drawWalls(data->list, &(data->cam), data->nb_lines);
+	drawWalls(data->list, &(data->cam), data->nb_lines, data->line_transition);
 }
 void draw_title(Game_Data *data)
 {

+ 4 - 2
hexagon.c

@@ -19,6 +19,7 @@ int AddIn_main(int isAppli, unsigned short OptionNum)
 
     switch_to_state(GAME, &data);
 
+
     while(KeyUp(K_EXIT)){ //main loop
         //fps
         if(RTC_GetTicks() - tempsOrigine >= 32 )//if 1/4 seconds elapsed
@@ -33,13 +34,14 @@ int AddIn_main(int isAppli, unsigned short OptionNum)
         draw(&data);
 
 	//printing debug information
-        intToStr(fps_text, fps);
-        PrintMini(0, 0, fps_text, MINI_OVER);
+        // intToStr(fps_text, fps);
+        // PrintMini(0, 0, fps_text, MINI_OVER);
 
 	//updating the screen
         ML_display_vram();
         ML_clear_vram();
 
+        //Sleep(1/0.06);
         Sleep(1/0.06);
     }
 

+ 1 - 1
struct.h

@@ -87,7 +87,7 @@ struct Game_Data{
 	unsigned int start_time;
 	unsigned int last_time;
 	unsigned int current_time;
-	unsigned int player_angle;
+	int player_angle;
 
 	unsigned int nb_lines;
 	Line_Transition line_transition;

+ 14 - 9
update_states.c

@@ -4,28 +4,31 @@ void update_title(Game_Data *data)
 {
 //TODO
 }
+
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
 void update_game(Game_Data *data)
 {
 	data->last_time = data->current_time;
 	data->current_time = RTC_GetTicks();
 	if(data->list != NULL){ //if the linked list is not empty
-		updateWalls(data->list, data->current_time - data->last_time); //update the linked list
+		updateWalls(data->list, min(data->current_time - data->last_time, 2)); //update the linked list
 
 	if(isColliding(data->list, data->player_angle, data->nb_lines) == true){ //if the player and a wall collide
 		PrintMini(50, 0, "TOUCHE", MINI_OVER); //death handling
 	}
-	data->list = removeWall(data->list, 0); //remove every wall whose distance to the center equals zero
+	data->list = removeWall(data->list, 8); //remove every wall whose distance to the center equals zero
 	}
 	//level generation
 	//TODO: something else than pure randomness
 	if(rand() % 40 == 1){
-		data->list = addWall(data->list, 128, 8, 1, rand()%6);
+		data->list = addWall(data->list, 128, 5, 1, rand()%data->nb_lines);
 	}else if(rand() % 70 == 1){
-		int emptyRow = rand()%6;
+		int emptyRow = rand()%data->nb_lines;
 		int i = 0;
-		for(i = 0; i < 6; i++)
+		for(i = 0; i < data->nb_lines; i++)
 			if(i != emptyRow)
-				data->list = addWall(data->list, 128, 15, 1, i);
+				data->list = addWall(data->list, 128, 5, 1, i);
     }
 	if(KeyDown(K_LEFT)){
 		data->player_angle-=15;
@@ -53,9 +56,11 @@ void update_game(Game_Data *data)
 		}
 	}
 
-	if(data->player_angle < 0)
-		data->player_angle = 360 + data->player_angle;
-		data->player_angle = data->player_angle % 360;
+	while(data->player_angle < 0)
+		data->player_angle += 360;
+	while(data->player_angle > 360)
+		data->player_angle -= 360;
+		//data->player_angle = data->player_angle % 360;
 
 	updateCamera(&(data->cam), data->current_time - data->last_time);
 }

+ 31 - 10
wall.c

@@ -31,7 +31,8 @@ Wall *removeWall(Wall *list, int d)
 	Wall *tmp1;
 	Wall *tmp2;
 
-	if(list->d <= 0)
+	if(list == NULL) return list;
+	if(list->d <= d)
 	{
 		if(list->nxt != NULL)
 			tmp1 = list->nxt;
@@ -44,7 +45,7 @@ Wall *removeWall(Wall *list, int d)
 	do{
 		if(tmp1->nxt != NULL)
 		{
-			if(tmp1->nxt->d <= 0.0)
+			if(tmp1->nxt->d <= d)
 			{
 				tmp2 = tmp1->nxt;
 				if(tmp1->nxt->nxt != NULL)
@@ -76,26 +77,45 @@ void updateWalls(Wall *list, unsigned int delta_time)
 	}while(tmp != NULL);
 }
 
-void drawWalls(Wall *list, Camera *cam, int nb_lines)
+void drawWalls(Wall *list, Camera *cam, int nb_lines, Line_Transition line_transition)
 {//NEEDS A COMPLETE REWRITE TO SUPPORT THE LINE TRANSITIONS !
 	Wall *tmp;
+
+
+	float coeff = 0.0;
+	float transition_angle = 0.0;
+	
+	float delta_angle = 360.0 / nb_lines;
+
+	float meh = 0;
+
+	float offset = 0;
+
+	if(line_transition.delta_nb_lines == 1)
+		nb_lines ++;
+
+	if(line_transition.counter_start != 0)
+		coeff = (float)line_transition.counter / (float)line_transition.counter_start;
+	transition_angle = delta_angle * coeff;
+
+	offset = (delta_angle - transition_angle) * line_transition.delta_nb_lines/(float)nb_lines;
+
 	tmp = list;
 	do{
 		if(tmp != NULL)
 		{
 			if(tmp->d + tmp->h< 64)
 			{
-				const float angle =  ((360 / nb_lines) * tmp->line + cam->angle) * PI / 180;
+				const float angle =  ((delta_angle - offset) * tmp->line + cam->angle) * PI / 180.;
 				const float cos1 = cos(angle);
-				const float cos2 = cos(angle +  (360.0 / nb_lines) * (PI / 180));
+				const float cos2 = cos(angle +  (delta_angle - offset) * (PI / 180.));
 				const float sin1 = sin(angle);
-				const float sin2 = sin(angle + (360.0 / nb_lines) * (PI / 180));
+				const float sin2 = sin(angle + (delta_angle - offset) * (PI / 180.));
 
 				int i,j, x, y;
 
 				float dist = tmp->d + cam->zoom;
-				for(i = 0; i < tmp->h; ++i) {
-					if(dist <= 8) break;
+				for(i = 0; i < tmp->h && dist > 8; ++i) {
 					ML_line(64 + dist*cos1, 32 + dist*sin1, 64 + dist*cos2, 32 + dist*sin2, BLACK);
 					--dist;
 				}
@@ -103,6 +123,7 @@ void drawWalls(Wall *list, Camera *cam, int nb_lines)
 		}
 		tmp = tmp->nxt;
 	}while(tmp != NULL);
+
 }
 
 //tests every Wall in the list
@@ -114,9 +135,9 @@ bool isColliding(Wall *list, int player_angle, int nb_lines)
 	do{
 		if(tmp != NULL)
 		{
-			if(tmp-> d <= 8)//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
 			{	//and is on the same line than the player
-				if(tmp->line == (int)(player_angle/ 360 / nb_lines))
+				if(tmp->line == (int)(player_angle/ (360 / nb_lines)) && tmp->line < nb_lines)
 				{	//BOOM
 					return true;
 				}

+ 1 - 1
wall.h

@@ -10,7 +10,7 @@ Wall *addWall(Wall *list, int d, int h, int id, int line);//returns a new pointe
 Wall *removeWall(Wall *list, int d); //returns a new pointer to the first element
 
 //show the ll "list"
-void drawWalls(Wall *list, Camera *cam, int nb_lines);
+void drawWalls(Wall *list, Camera *cam, int nb_lines, Line_Transition line_transition);
 //updates the ll "list"
 void updateWalls(Wall *list, unsigned int delta_time);
 //simple collision test. Returns true if a Wall from the list collides with the player