Advertisement
milanmetal

[RSDMK] Snake ZAPOCEO prolazi kroz zid

Jun 3rd, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.25 KB | None | 0 0
  1. #include <c8051f340.h>        
  2. #include "time.h"
  3. #include <stdlib.h>
  4. #include "TFT.h"
  5. #include "joy.h"
  6.  
  7. void OSCILLATOR_Init (void);          
  8. void PORT_Init (void);
  9. #define INIT_LEN 8
  10. #define FOOD_SIZE 8
  11. #define ANCLE_SIZE 6
  12. #define ANCLE_GAP 2
  13. #define BACKGROUND_COLOR (0, 0, 0)
  14.  
  15. //enum DIRECTION {AHEAD = 0, LEFT = 1};
  16.  
  17. typedef struct color {
  18.     byte r;
  19.     byte g;
  20.     byte b;
  21. } BOJA;
  22.  
  23. typedef struct snake {
  24.     char x1;
  25.     char x1_prev;
  26.     char y1;
  27.     char y1_prev;
  28.     BOJA color;
  29. } ZMIUGALOMA;
  30.  
  31. void snake_init(ZMIUGALOMA *malazmia, BOJA color, int *snake_len) {
  32.     int i = 0;
  33.     // -1 da bi zmija pocela od x = 0
  34.     int next_x_pos = (INIT_LEN - 1) * (ANCLE_SIZE + ANCLE_GAP);
  35.  
  36.     for(i = 0; i < INIT_LEN; i++) {
  37.         (malazmia+i)->x1 = next_x_pos; 
  38.         (malazmia+i)->y1 = 64;
  39.         if(i == 0){
  40.             (malazmia+i)->color.r = 255;
  41.             (malazmia+i)->color.g = 0;
  42.             (malazmia+i)->color.b = 0;
  43.         }   else {
  44.             (malazmia+i)->color.r = color.r;
  45.             (malazmia+i)->color.g = color.g;
  46.             (malazmia+i)->color.b = color.b;
  47.         }
  48.  
  49.         // prethodne pozicije su iste sa aktuelnim na samom pocetku
  50.         (malazmia+i)->x1_prev = (malazmia+i)->x1;  
  51.         (malazmia+i)->y1_prev = (malazmia+i)->y1;
  52.  
  53.         next_x_pos -= ANCLE_SIZE;
  54.         next_x_pos -= ANCLE_GAP;
  55.     }
  56.  
  57.     *snake_len = INIT_LEN;
  58. }
  59.  
  60. void snake_draw(ZMIUGALOMA *malazmia, int snake_len) {
  61.     int i = 0;
  62.     int next_x_pos = 0;
  63.     int exp = 0;
  64.  
  65.     for(i = 0; i < snake_len ; i++) {
  66.         TFT_setColor BACKGROUND_COLOR;
  67.         // brisemo prethodni kvadratic
  68.         TFT_fillRect(
  69.             (malazmia+i)->x1_prev,
  70.             (malazmia+i)->y1_prev,
  71.             (malazmia+i)->x1_prev + ANCLE_SIZE,
  72.             (malazmia+i)->y1_prev + ANCLE_SIZE
  73.         );
  74.     }
  75.  
  76.     for(i = 0; i < snake_len ; i++) {
  77.         TFT_setColor(
  78.             (malazmia+i)->color.r,
  79.             (malazmia+i)->color.g,
  80.             (malazmia+i)->color.b
  81.         );
  82.         TFT_fillRect(
  83.             (malazmia+i)->x1,
  84.             (malazmia+i)->y1,
  85.             (malazmia+i)->x1 + ANCLE_SIZE,
  86.             (malazmia+i)->y1 + ANCLE_SIZE
  87.         );   
  88.     }
  89. }
  90.  
  91.  
  92. void snake_redraw_tail(ZMIUGALOMA *malazmia, int snake_len) {
  93.     TFT_setColor BACKGROUND_COLOR;
  94.     TFT_fillRect(
  95.         (malazmia+snake_len-1)->x1,
  96.         (malazmia+snake_len-1)->y1,
  97.         (malazmia+snake_len-1)->x1 + ANCLE_SIZE,
  98.         (malazmia+snake_len-1)->y1 + ANCLE_SIZE
  99.         );
  100. }
  101.  
  102. void snake_move(ZMIUGALOMA *malazmia, char snake_dir, int snake_len) {
  103.     int i = 0;
  104.     int overflow_cnt;
  105.     switch(snake_dir) {
  106.         case 'a':       // move ahead
  107.             for(i = 0; i < snake_len; i++) {
  108.                 (malazmia+i)->x1_prev = (malazmia+i)->x1;
  109.                 (malazmia+i)->y1_prev = (malazmia+i)->y1;
  110.                
  111.                 (malazmia+i)->x1 += (ANCLE_SIZE + ANCLE_GAP);
  112.                 if((malazmia+i)->x1 >= 127) {
  113.                     overflow_cnt++;
  114.                     (malazmia+i)->x1 = overflow_cnt * (ANCLE_SIZE + ANCLE_GAP) ;
  115.                 }   /*else {
  116.                     (malazmia+i)->x1 += (ANCLE_SIZE + ANCLE_GAP);
  117.                 }   */
  118.             }
  119.  
  120.             //snake_redraw_tail(malazmia, snake_len);
  121.         break;
  122.     }
  123. }
  124.  
  125. void main(void)
  126. {
  127.     int joyX, joyY, prevX, prevY;
  128.     bit fire, prevFire;
  129.  
  130.     //PREPREKE prepreke[OBST_NUM];
  131.     ZMIUGALOMA malazmia[32];
  132.     BOJA color;
  133.     //enum DIRECTION snake_dir;
  134.     char snake_dir = 'a';   // a - ahead, l - left, r - right
  135.  
  136.     int snake_len;
  137.  
  138.     color.r = 255;
  139.     color.g = 255;
  140.     color.b = 0;
  141.  
  142.     PCA0MD &= ~0x40;    // Watchdog tajmer iskljucen
  143.  
  144.     OSCILLATOR_Init();  // Inicijalizacija oscilatora (Fosc = 22.1184 MHz)
  145.     TIME_Init();        // Inicijalizacija sistemskog vremena (koristi se prekid tajmera 2)
  146.     PORT_Init();        // Inicijalizacija portova
  147.     TFT_Init();         // Inicijalizacija displeja
  148.     JOY_Init();         // Inicijalizacija dzojstika
  149.  
  150.     TFT_clrScr();
  151.     //target();
  152.  
  153.     snake_init(&malazmia, color, &snake_len);
  154.  
  155.     //test aplikacija:
  156.     while (1)
  157.     {
  158.         //citanje X pozicije
  159.         prevX = joyX;
  160.         joyX = JOY_ReadX();
  161.        
  162.         //citanje Y pozicije
  163.         prevY = joyY;
  164.         joyY = JOY_ReadY();
  165.        
  166.         //citanje stanja tastera
  167.         prevFire = fire;
  168.         fire = JOY_ReadTrigger();
  169.  
  170.  
  171.         //move_obstacles();
  172.  
  173.  
  174.         if (prevX != joyX || prevY != joyY || fire != prevFire) //doslo je do promene?
  175.         {
  176.             snake_draw(&malazmia, snake_len);
  177.             delay_ms(500);
  178.             snake_move(&malazmia, snake_dir, snake_len);
  179.         }
  180.     }                            
  181.  }
  182.  
  183. void PORT_Init (void)
  184. {
  185.    P2MDIN |= 0x0F;              // 4 najniza bita porta P2 -> digitalni
  186.    P2MDOUT = 0x0C;              // Pinovi za LED -> push-pull izlazi
  187.  
  188.    // Crossbar inicijalizacija
  189.    XBR1    = 0x40;              // Dozvola crossbar-a i slabih pull-up otpornika
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement