main.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include <tice.h>
  2. #include <graphx.h>
  3. #include <keypadc.h>
  4. #include <debug.h>
  5. #include <compression.h>
  6. #include "gfx/main_gfx.h"
  7. #include "lib/vector.h"
  8. #include "lib/sprite.h"
  9. #include "lib/object.h"
  10. int walk_speed = 1;
  11. int run_speed = 3;
  12. float scale = 3.0;
  13. int frameskip = 10;
  14. // #define RESIZE_SPRITES
  15. #define log(msg) dbg_sprintf(dbgout, "[TBP] %s\n", msg)
  16. int main(void){
  17. kb_key_t arrows;
  18. int max_width = LCD_WIDTH;
  19. int max_height = LCD_HEIGHT;
  20. int frame = 0;
  21. size_t i;
  22. int speed;
  23. Object* object;
  24. Sprite* sprite;
  25. Object* player = new_Object(0, 0);
  26. Vector* objects = new_Vector(1, sizeof(Object), &free_Object);
  27. Vector* sprites = new_Vector(22, sizeof(Sprite), &free_Sprite);
  28. if(!sprites->consume(sprites, new_Sprite(bm1_width, bm1_height, bm1_compressed)) ||
  29. !sprites->consume(sprites, new_Sprite(bm2_width, bm2_height, bm2_compressed)) ||
  30. !sprites->consume(sprites, new_Sprite(bm3_width, bm3_height, bm3_compressed)) ||
  31. !sprites->consume(sprites, new_Sprite(bm4_width, bm4_height, bm4_compressed)) ||
  32. !sprites->consume(sprites, new_Sprite(bm5_width, bm5_height, bm5_compressed)) ||
  33. !sprites->consume(sprites, new_Sprite(bm6_width, bm6_height, bm6_compressed)) ||
  34. !sprites->consume(sprites, new_Sprite(bm7_width, bm7_height, bm7_compressed)) ||
  35. !sprites->consume(sprites, new_Sprite(bm8_width, bm8_height, bm8_compressed)) ||
  36. !sprites->consume(sprites, new_Sprite(bm9_width, bm9_height, bm9_compressed)) ||
  37. !sprites->consume(sprites, new_Sprite(bm10_width, bm10_height, bm10_compressed)) ||
  38. !sprites->consume(sprites, new_Sprite(bm11_width, bm11_height, bm11_compressed)) ||
  39. !sprites->consume(sprites, new_Sprite(bm12_width, bm12_height, bm12_compressed)) ||
  40. !sprites->consume(sprites, new_Sprite(bm13_width, bm13_height, bm13_compressed)) ||
  41. !sprites->consume(sprites, new_Sprite(bm14_width, bm14_height, bm14_compressed)) ||
  42. !sprites->consume(sprites, new_Sprite(bm15_width, bm15_height, bm15_compressed)) ||
  43. !sprites->consume(sprites, new_Sprite(bm16_width, bm16_height, bm16_compressed)) ||
  44. !sprites->consume(sprites, new_Sprite(bm17_width, bm17_height, bm17_compressed)) ||
  45. !sprites->consume(sprites, new_Sprite(bm18_width, bm18_height, bm18_compressed)) ||
  46. !sprites->consume(sprites, new_Sprite(bm19_width, bm19_height, bm19_compressed)) ||
  47. !sprites->consume(sprites, new_Sprite(bm20_width, bm20_height, bm20_compressed)) ||
  48. !sprites->consume(sprites, new_Sprite(bm21_width, bm21_height, bm21_compressed)) ||
  49. !sprites->consume(sprites, new_Sprite(bm22_width, bm22_height, bm22_compressed))
  50. ){
  51. log("Failed to load sprites");
  52. free_Object(player);
  53. free_Vector(objects);
  54. free_Vector(sprites);
  55. return 1;
  56. }
  57. if(!objects->push(objects, player)){
  58. log("Unable to add player to stack");
  59. free_Vector(objects);
  60. free_Object(player);
  61. return 1;
  62. }
  63. free_Object(player);
  64. player = objects->get(objects, 0);
  65. player->sprite = sprites->get(sprites, 0);
  66. log("Get max sizes");
  67. #ifdef RESIZE_SPRITES
  68. log("Resizing sprites");
  69. dbg_sprintf(dbgout, "[Player] %d x %d\n", player->sprite->data->width, player->sprite->data->height);
  70. for(i = 0; i < sprites->count(sprites); i++){
  71. sprite = sprites->get(sprites, i);
  72. sprite->resize(sprite, sprite->data->width * scale, sprite->data->height * scale);
  73. }
  74. dbg_sprintf(dbgout, "[Player] %d x %d\n", player->sprite->data->width, player->sprite->data->height);
  75. #else
  76. player->scale.x = scale;
  77. player->scale.y = scale;
  78. max_width -= player->width(player);
  79. max_height -= player->height(player);
  80. #endif
  81. log("Start graphics");
  82. gfx_Begin();
  83. gfx_SetPalette(main_palette, sizeof_main_palette, 0);
  84. gfx_SetDrawBuffer();
  85. log("Main loop");
  86. do{
  87. player->sprite = sprites->get(sprites, 0);
  88. kb_Scan();
  89. if(kb_Data[2] & kb_Alpha){
  90. speed = run_speed;
  91. }else{
  92. speed = walk_speed;
  93. }
  94. arrows = kb_Data[7];
  95. if(arrows & kb_Down){
  96. if(player->y < max_height){
  97. player->y += speed;
  98. if(frame > 2){
  99. player->sprite = sprites->get(sprites, 2);
  100. }else{
  101. player->sprite = sprites->get(sprites, 4);
  102. }
  103. }
  104. }else if(arrows & kb_Up){
  105. if(player->y > 0){
  106. player->y -= speed;
  107. if(frame > 2){
  108. player->sprite = sprites->get(sprites, 18);
  109. }else{
  110. player->sprite = sprites->get(sprites, 20);
  111. }
  112. }
  113. }
  114. if(arrows & kb_Right){
  115. if(player->x < max_width){
  116. player->x += speed;
  117. if(frame > 2){
  118. player->sprite = sprites->get(sprites, 10);
  119. }else{
  120. player->sprite = sprites->get(sprites, 12);
  121. }
  122. }
  123. }else if(arrows & kb_Left){
  124. if(player->x > 0){
  125. player->x -= speed;
  126. if(frame > 2){
  127. player->sprite = sprites->get(sprites, 6);
  128. }else{
  129. player->sprite = sprites->get(sprites, 8);
  130. }
  131. }
  132. }
  133. if(player->x < 0){
  134. player->x = 0;
  135. }else if(player->x >= max_width){
  136. player->x = max_width;
  137. }
  138. if(player->y < 0){
  139. player->y = 0;
  140. }else if(player->y >= max_height){
  141. player->y = max_height;
  142. }
  143. gfx_FillScreen(0);
  144. for(i = 0; i < objects->count(objects); i++){
  145. object = objects->get(objects, i);
  146. object->draw(object);
  147. }
  148. gfx_BlitBuffer();
  149. frame++;
  150. if(frame > frameskip){
  151. frame = 0;
  152. }
  153. }while (! (kb_Data[6] & kb_Clear));
  154. log("Freeing sprites stack");
  155. free_Vector(sprites);
  156. player->sprite = NULL;
  157. log("Freeing objects stack");
  158. free_Vector(objects);
  159. log("End graphics");
  160. gfx_End();
  161. log("Done");
  162. return 0;
  163. }