map.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include <os.h>
  2. #include "map.h"
  3. #if INTERFACE
  4. typedef struct
  5. {
  6. unsigned w;
  7. unsigned h;
  8. unsigned *layer0;
  9. unsigned *layer1;
  10. } Map;
  11. #endif
  12. void map_draw(unsigned x, unsigned y, const Map map)
  13. {
  14. x += 20;
  15. y += 12;
  16. unsigned offset_x = x % 24 * -1;
  17. unsigned offset_y = y % 24 * -1;
  18. unsigned i, j, tile_offset;
  19. Rect sprite;
  20. sprite.y = 0;
  21. sprite.w = 24;
  22. sprite.h = 24;
  23. tile_offset = x / 24 - 7 + (y / 24 - 5) * map.w;
  24. for (j = 0; j < 11; j++)
  25. {
  26. for (i = 0; i < 15; i++)
  27. {
  28. sprite.x = map.layer0[tile_offset] * 24;
  29. draw_sprite_sheet(tiles, offset_x, offset_y, &sprite);
  30. tile_offset++;
  31. offset_x += 24;
  32. }
  33. tile_offset += map.w - 15;
  34. offset_x -= 24 * 15;
  35. offset_y += 24;
  36. }
  37. }
  38. unsigned map_collide(unsigned x, unsigned y, const Map map)
  39. {
  40. return 0;
  41. }
  42. static void map_walk_speed_load(unsigned time)
  43. {
  44. timer_load(0, time);
  45. while (timer_read(0) != time);
  46. }
  47. static unsigned map_walk_speed_read(unsigned time, unsigned div)
  48. {
  49. return (time - timer_read(0)) / div;
  50. }
  51. void map_walk(unsigned x, unsigned y, Map map)
  52. {
  53. unsigned i, walk_time, walk_div;
  54. while (!isKeyPressed(KEY_NSPIRE_ESC))
  55. {
  56. if (isKeyPressed(KEY_NSPIRE_VAR))
  57. {
  58. walk_time = 6554;
  59. walk_div = 273;
  60. }
  61. else
  62. {
  63. walk_time = 13107;
  64. walk_div = 546;
  65. }
  66. if (isKeyPressed(KEY_NSPIRE_5) && !map_collide(x, y + 1, map))
  67. {
  68. map_walk_speed_load(walk_time);
  69. for (i = 1; i < 24; i++)
  70. {
  71. if (i >= map_walk_speed_read(walk_time, walk_div))
  72. {
  73. while (i > map_walk_speed_read(walk_time, walk_div));
  74. map_draw(x * 24, y * 24 + i, map);
  75. buffer_swap();
  76. }
  77. }
  78. y++;
  79. }
  80. else if (isKeyPressed(KEY_NSPIRE_8) && !map_collide(x, y - 1, map))
  81. {
  82. map_walk_speed_load(walk_time);
  83. for (i = 1; i < 24; i++)
  84. {
  85. if (i >= map_walk_speed_read(walk_time, walk_div))
  86. {
  87. while (i > map_walk_speed_read(walk_time, walk_div));
  88. map_draw(x * 24, y * 24 - i, map);
  89. buffer_swap();
  90. }
  91. }
  92. y--;
  93. }
  94. else if (isKeyPressed(KEY_NSPIRE_4) && !map_collide(x - 1, y, map))
  95. {
  96. map_walk_speed_load(walk_time);
  97. for (i = 1; i < 24; i++)
  98. {
  99. if (i >= map_walk_speed_read(walk_time, walk_div))
  100. {
  101. while (i > map_walk_speed_read(walk_time, walk_div));
  102. map_draw(x * 24 - i, y * 24, map);
  103. buffer_swap();
  104. }
  105. }
  106. x--;
  107. }
  108. else if (isKeyPressed(KEY_NSPIRE_6) && !map_collide(x + 1, y, map))
  109. {
  110. map_walk_speed_load(walk_time);
  111. for (i = 1; i < 24; i++)
  112. {
  113. if (i >= map_walk_speed_read(walk_time, walk_div))
  114. {
  115. while (i > map_walk_speed_read(walk_time, walk_div));
  116. map_draw(x * 24 + i, y * 24, map);
  117. buffer_swap();
  118. }
  119. }
  120. x++;
  121. }
  122. map_draw(x * 24, y * 24, map);
  123. buffer_swap();
  124. }
  125. }