map.c 2.5 KB

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