Quellcode durchsuchen

Basic walking engine
Still lacks a lot of features but the framework is there

Dan ELKOUBY vor 11 Jahren
Ursprung
Commit
9cbb8a204d
2 geänderte Dateien mit 113 neuen und 12 gelöschten Zeilen
  1. 3 11
      main.c
  2. 110 1
      map.c

+ 3 - 11
main.c

@@ -5,6 +5,7 @@
 int main()
 {
 	initBuffering();
+	timer_init(0);
 
 	Map map;
 	map.w = 15;
@@ -64,18 +65,9 @@ int main()
 	map.layer0 = mapdata0;
 	map.layer1 = mapdata1;
 
-	unsigned x = 0;
-	unsigned y = 0;
-	while (!isKeyPressed(KEY_NSPIRE_ESC))
-	{
-		if (isKeyPressed(KEY_NSPIRE_UP)) y-=2;
-		if (isKeyPressed(KEY_NSPIRE_DOWN)) y+=2;
-		if (isKeyPressed(KEY_NSPIRE_LEFT)) x-=2;
-		if (isKeyPressed(KEY_NSPIRE_RIGHT)) x+=2;
-		map_draw(x, y, map);
-		bufferSwap();
-	}
+	map_walk(7, 5, map);
 
+	timer_restore(0);
 	deinitBuffering();
 	return 0;
 }

+ 110 - 1
map.c

@@ -14,6 +14,9 @@ typedef struct
 
 void map_draw(unsigned x, unsigned y, const Map map)
 {
+	x += 20;
+	y += 12;
+
 	unsigned offset_x = x % 24 * -1;
 	unsigned offset_y = y % 24 * -1;
 
@@ -23,7 +26,7 @@ void map_draw(unsigned x, unsigned y, const Map map)
 	sprite.w = 24;
 	sprite.h = 24;
 
-	tile_offset = x / 24 + y / 24 * map.w;
+	tile_offset = x / 24 - 7 + (y / 24 - 5) * map.w;
 
 	for (j = 0; j < 11; j++)
 	{
@@ -42,3 +45,109 @@ void map_draw(unsigned x, unsigned y, const Map map)
 	}
 }
 
+unsigned map_collide(unsigned x, unsigned y, const Map map)
+{
+	return 0;
+}
+
+static void map_walk_speed_load(unsigned time)
+{
+	timer_load(0, time);
+	while (timer_read(0) != time);
+}
+
+static unsigned map_walk_speed_read(unsigned time, unsigned div)
+{
+	return (time - timer_read(0)) / div;
+}
+
+void map_walk(unsigned x, unsigned y, Map map)
+{
+	unsigned i, walk_time, walk_div;
+
+	while (!isKeyPressed(KEY_NSPIRE_ESC))
+	{
+		if (isKeyPressed(KEY_NSPIRE_VAR))
+		{
+			walk_time = 6554;
+			walk_div = 273;
+		}
+		else
+		{
+			walk_time = 13107;
+			walk_div = 546;
+		}
+
+		if (isKeyPressed(KEY_NSPIRE_5) && !map_collide(x, y + 1, map))
+		{
+			map_walk_speed_load(walk_time);
+
+			for (i = 1; i < 24; i++)
+			{
+				if (i >= map_walk_speed_read(walk_time, walk_div))
+				{
+					while (i > map_walk_speed_read(walk_time, walk_div));
+					map_draw(x * 24, y * 24 + i, map);
+					bufferSwap();
+				}
+			}
+
+			y++;
+		}
+
+		else if (isKeyPressed(KEY_NSPIRE_8) && !map_collide(x, y - 1, map))
+		{
+			map_walk_speed_load(walk_time);
+
+			for (i = 1; i < 24; i++)
+			{
+				if (i >= map_walk_speed_read(walk_time, walk_div))
+				{
+					while (i > map_walk_speed_read(walk_time, walk_div));
+					map_draw(x * 24, y * 24 - i, map);
+					bufferSwap();
+				}
+			}
+
+			y--;
+		}
+
+		else if (isKeyPressed(KEY_NSPIRE_4) && !map_collide(x - 1, y, map))
+		{
+			map_walk_speed_load(walk_time);
+
+			for (i = 1; i < 24; i++)
+			{
+				if (i >= map_walk_speed_read(walk_time, walk_div))
+				{
+					while (i > map_walk_speed_read(walk_time, walk_div));
+					map_draw(x * 24 - i, y * 24, map);
+					bufferSwap();
+				}
+			}
+
+			x--;
+		}
+
+		else if (isKeyPressed(KEY_NSPIRE_6) && !map_collide(x + 1, y, map))
+		{
+			map_walk_speed_load(walk_time);
+
+			for (i = 1; i < 24; i++)
+			{
+				if (i >= map_walk_speed_read(walk_time, walk_div))
+				{
+					while (i > map_walk_speed_read(walk_time, walk_div));
+					map_draw(x * 24 + i, y * 24, map);
+					bufferSwap();
+				}
+			}
+
+			x++;
+		}
+
+		map_draw(x * 24, y * 24, map);
+		bufferSwap();
+	}
+}
+