Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2022:cstan:endless_runner [2022/05/27 11:15]
catalina.maftei [Jurnal]
pm:prj2022:cstan:endless_runner [2022/06/01 22:43] (current)
catalina.maftei [Jurnal]
Line 9: Line 9:
 Endless Runner este un joc interactiv. Endless Runner este un joc interactiv.
  
-Printr-o simpla apasare de buton, jocul incepe iar jucatorul trebuie sa se concentreze pentru a reusi sa sara peste toate obstacolele. Cu fiecare apasare pe buton, personajul din joc sare peste obiecte, iar scorul se mareste. In momentul in care jucatorul a atins un obiect,​jocul se termina si se afiseaza scorul final .+Printr-o simpla apasare de buton, jocul incepe iar jucatorul trebuie sa se concentreze pentru a reusi sa sara peste toate obstacolele. Cu fiecare apasare pe buton, personajul din joc sare peste obiecte, iar scorul se mareste. In momentul in care jucatorul a atins un obiect,​jocul se termina si se afiseaza scorul final si se aude un mic sunet sa te anunte ca ai pierdut.  
 +Daca jucatorul doreste sa reporneasca jocul, trebuie sa apese pe buton dupa ce afiseaza pe ecran textul "Game Over. Start a new game" si sa astepte 5 secunde, iar mai apoi jocul va reporni.
  
 </​note>​ </​note>​
Line 30: Line 31:
 Lista de Componente: ​ Lista de Componente: ​
   - Arduino UNO   - Arduino UNO
-  - 16 x 2 Character LCD: https://​www.banggood.com/​custlink/​vDm... ​+  - 16 x 2 Character LCD
   - Breadboard   - Breadboard
   - Jumper Wires   - Jumper Wires
-  - Push Button: https://​www.banggood.com/​custlink/​3KD...+  - Button
   - Battery Connector   - Battery Connector
-  - 9V Battery +  - Buzzer
-  - Variable Resistors 103 +
  
  
 Schema :  Schema : 
  
-{{ :​pm:​prj2022:​cstan:​whatsapp_image_2022-04-21_at_20.56.31.jpeg?300 |}}+{{ :​pm:​prj2022:​cstan:​schemaa.png?300 |}}
 </​note>​ </​note>​
  
Line 50: Line 50:
 Pe partea de Software Design, pot spune ca am inclus biblioteca folosita LiquidCrystal.h pentru utilizarea LCD 16×2. ​ Pe partea de Software Design, pot spune ca am inclus biblioteca folosita LiquidCrystal.h pentru utilizarea LCD 16×2. ​
  
-#include <​LiquidCrystal.h>+{{:​pm:​prj2022:​cstan:​cod.txt|}}
  
-#define PIN_BUTTON 2+</​note>​
  
-#define PIN_AUTOPLAY 1+===== Rezultate Obţinute =====
  
-#define PIN_READWRITE 10+<note tip> 
 +In urma realizarii proiectului,​rezultatele au fost cele dorite reusind sa  ma joc propriul meu joc Chrome Dino .
  
-#define PIN_CONTRAST 12+{{ :​pm:​prj2022:​cstan:​1.jpeg?​300 |}}
  
-#define SPRITE_RUN1 1+{{ :​pm:​prj2022:​cstan:​2.jpeg?​300 |}}
  
-#define SPRITE_RUN2 2+{{ :​pm:​prj2022:​cstan:​3.jpeg?​300 |}} 
 +</​note>​
  
-#define SPRITE_JUMP 3 
  
-#define SPRITE_JUMP_UPPER '​.' ​        // Use the '​.'​ character for the head 
  
-#define SPRITE_JUMP_LOWER 4+===== Jurnal =====
  
-#define SPRITE_TERRAIN_EMPTY ' ' ​     // User the ' ' character+<​note>​
  
-#define SPRITE_TERRAIN_SOLID 5 +Initial, jocul fost gandit ​in alt moddar dintr-o mica problema cu LCD-ul a trebuit sa fie schimbat si sa ajunga la aceasta forma finala.
- +
-#define SPRITE_TERRAIN_SOLID_RIGHT 6 +
- +
-#define SPRITE_TERRAIN_SOLID_LEFT 7 +
- +
-#define HERO_HORIZONTAL_POSITION 1    // Horizontal position of hero on screen +
- +
-#define TERRAIN_WIDTH 16 +
- +
-#define TERRAIN_EMPTY 0 +
- +
-#define TERRAIN_LOWER_BLOCK 1 +
- +
-#define TERRAIN_UPPER_BLOCK 2 +
- +
-#define HERO_POSITION_OFF 0          // Hero is invisible +
- +
-#define HERO_POSITION_RUN_LOWER_1 1  // Hero is running on lower row (pose 1) +
- +
-#define HERO_POSITION_RUN_LOWER_2 2  //                              (pose 2) +
- +
-#define HERO_POSITION_JUMP_1 3       // Starting ​jump +
- +
-#define HERO_POSITION_JUMP_2 4       // Half-way up +
- +
-#define HERO_POSITION_JUMP_3 5       // Jump is on upper row +
- +
-#define HERO_POSITION_JUMP_4 6       // Jump is on upper row +
- +
-#define HERO_POSITION_JUMP_5 7       // Jump is on upper row +
- +
-#define HERO_POSITION_JUMP_6 8       // Jump is on upper row +
- +
-#define HERO_POSITION_JUMP_7 9       // Half-way down +
- +
-#define HERO_POSITION_JUMP_8 10      // About to land +
- +
-#define HERO_POSITION_RUN_UPPER_1 11 // Hero is running on upper row (pose 1) +
- +
-#define HERO_POSITION_RUN_UPPER_2 12 //                              (pose 2) +
- +
-LiquidCrystal lcd(11, 9, 6, 5, 4, 3); +
- +
-static char terrainUpper[TERRAIN_WIDTH + 1]; +
- +
-static char terrainLower[TERRAIN_WIDTH + 1]; +
- +
-static bool buttonPushed = false; +
- +
-void initializeGraphics(){ +
-  static byte graphics[] = { +
-    // Run position 1 +
-    B01100, +
-    B01100, +
-    B00000, +
-    B01110, +
-    B11100, +
-    B01100, +
-    B11010, +
-    B10011, +
-    // Run position 2 +
-    B01100, +
-    B01100, +
-    B00000, +
-    B01100, +
-    B01100, +
-    B01100, +
-    B01100, +
-    B01110, +
-    // Jump +
-    B01100, +
-    B01100, +
-    B00000, +
-    B11110, +
-    B01101, +
-    B11111, +
-    B10000, +
-    B00000, +
-    // Jump lower +
-    B11110, +
-    B01101, +
-    B11111, +
-    B10000, +
-    B00000, +
-    B00000, +
-    B00000, +
-    B00000, +
-    // Ground +
-    B11111, +
-    B11111, +
-    B11111, +
-    B11111, +
-    B11111, +
-    B11111, +
-    B11111, +
-    B11111, +
-    // Ground right +
-    B00011, +
-    B00011, +
-    B00011, +
-    B00011, +
-    B00011, +
-    B00011, +
-    B00011, +
-    B00011, +
-    // Ground left +
-    B11000, +
-    B11000, +
-    B11000, +
-    B11000, +
-    B11000, +
-    B11000, +
-    B11000, +
-    B11000, +
-  }; +
-  int i; +
-  // Skip using character 0, this allows lcd.print() to be used to +
-   +
-  // quickly draw multiple characters +
-   +
-  for (i = 0; i < 7; ++i) { +
-   lcd.createChar(i + 1, &​graphics[i * 8]); +
-  } +
-  for (i = 0; i < TERRAIN_WIDTH;​ ++i) { +
-    terrainUpper[i] = SPRITE_TERRAIN_EMPTY;​ +
-    terrainLower[i] = SPRITE_TERRAIN_EMPTY;​ +
-  } +
-+
- +
-// Slide the terrain to the left in half-character increments +
-// +
-void advanceTerrain(char* terrainbyte newTerrain){ +
-  for (int i = 0; i < TERRAIN_WIDTH;​ ++i) { +
-    char current = terrain[i];​ +
-    char next = (i == TERRAIN_WIDTH-1) ? newTerrain : terrain[i+1];​ +
-    switch (current){ +
-      case SPRITE_TERRAIN_EMPTY:​ +
-        terrain[i] = (next == SPRITE_TERRAIN_SOLID) ? SPRITE_TERRAIN_SOLID_RIGHT : SPRITE_TERRAIN_EMPTY;​ +
-        break; +
-      case SPRITE_TERRAIN_SOLID:​ +
-        terrain[i] = (next == SPRITE_TERRAIN_EMPTY) ? SPRITE_TERRAIN_SOLID_LEFT : SPRITE_TERRAIN_SOLID;​ +
-        break; +
-      case SPRITE_TERRAIN_SOLID_RIGHT:​ +
-        terrain[i] = SPRITE_TERRAIN_SOLID;​ +
-        break; +
-      case SPRITE_TERRAIN_SOLID_LEFT:​ +
-        terrain[i] = SPRITE_TERRAIN_EMPTY;​ +
-        break; +
-    } +
-  } +
-+
- +
-bool drawHero(byte position, char* terrainUpper,​ char* terrainLower,​ unsigned int score) { +
-  bool collide = false; +
-  char upperSave = terrainUpper[HERO_HORIZONTAL_POSITION];​ +
-  char lowerSave = terrainLower[HERO_HORIZONTAL_POSITION];​ +
-  byte upper, lower; +
-  switch (position) { +
-    case HERO_POSITION_OFF:​ +
-      upper = lower = SPRITE_TERRAIN_EMPTY;​ +
-      break; +
-    case HERO_POSITION_RUN_LOWER_1:​ +
-      upper = SPRITE_TERRAIN_EMPTY;​ +
-      lower = SPRITE_RUN1;​ +
-      break; +
-    case HERO_POSITION_RUN_LOWER_2:​ +
-      upper = SPRITE_TERRAIN_EMPTY;​ +
-      lower = SPRITE_RUN2;​ +
-      break; +
-    case HERO_POSITION_JUMP_1:​ +
-    case HERO_POSITION_JUMP_8:​ +
-      upper = SPRITE_TERRAIN_EMPTY;​ +
-      lower = SPRITE_JUMP;​ +
-      break; +
-    case HERO_POSITION_JUMP_2:​ +
-    case HERO_POSITION_JUMP_7:​ +
-      upper = SPRITE_JUMP_UPPER;​ +
-      lower = SPRITE_JUMP_LOWER;​ +
-      break; +
-    case HERO_POSITION_JUMP_3:​ +
-    case HERO_POSITION_JUMP_4:​ +
-    case HERO_POSITION_JUMP_5:​ +
-    case HERO_POSITION_JUMP_6:​ +
-      upper = SPRITE_JUMP;​ +
-      lower = SPRITE_TERRAIN_EMPTY;​ +
-      break; +
-    case HERO_POSITION_RUN_UPPER_1:​ +
-      upper = SPRITE_RUN1;​ +
-      lower = SPRITE_TERRAIN_EMPTY;​ +
-      break; +
-    case HERO_POSITION_RUN_UPPER_2:​ +
-      upper = SPRITE_RUN2;​ +
-      lower = SPRITE_TERRAIN_EMPTY;​ +
-      break; +
-  } +
-  if (upper != ' ') { +
-    terrainUpper[HERO_HORIZONTAL_POSITION] = upper; +
-    collide = (upperSave == SPRITE_TERRAIN_EMPTY) ? false : true; +
-  } +
-  if (lower != ' ') { +
-    terrainLower[HERO_HORIZONTAL_POSITION] = lower; +
-    collide |= (lowerSave == SPRITE_TERRAIN_EMPTY) ? false : true; +
-  } +
- +
-  byte digits = (score > 9999) ? 5 : (score > 999) ? 4 : (score > 99) ? 3 : (score > 9) ? 2 : 1; +
- +
-  // Draw the scene +
-   +
-  terrainUpper[TERRAIN_WIDTH] = '​\0';​ +
-   +
-  terrainLower[TERRAIN_WIDTH] = '​\0';​ +
-   +
-  char temp = terrainUpper[16-digits]; +
-   +
-  terrainUpper[16-digits] = '​\0';​ +
-   +
-  lcd.setCursor(0,​0);​ +
-   +
-  lcd.print(terrainUpper);​ +
-   +
-  terrainUpper[16-digits] = temp;  +
-    +
-  lcd.setCursor(0,​1);​ +
-   +
-  lcd.print(terrainLower);​ +
- +
-  lcd.setCursor(16 - digits,​0);​ +
-  lcd.print(score);​ +
-   +
- +
-  terrainUpper[HERO_HORIZONTAL_POSITION] = upperSave;​ +
-   +
-  terrainLower[HERO_HORIZONTAL_POSITION] = lowerSave;​ +
-   +
-  return collide; +
-+
- +
-// Handle the button push as an interrupt +
-void buttonPush() { +
-  buttonPushed = true; +
-+
- +
-void setup(){ +
-  pinMode(PIN_READWRITE,​ OUTPUT); +
-  digitalWrite(PIN_READWRITE,​ LOW); +
-  pinMode(PIN_CONTRAST,​ OUTPUT); +
-  digitalWrite(PIN_CONTRAST,​ LOW); +
-  pinMode(PIN_BUTTON,​ INPUT); +
-  digitalWrite(PIN_BUTTON,​ HIGH); +
-  pinMode(PIN_AUTOPLAY,​ OUTPUT); +
-  digitalWrite(PIN_AUTOPLAY,​ HIGH); +
- +
-  // Digital pin 2 maps to interrupt 0 +
-  attachInterrupt(0/​*PIN_BUTTON*/,​ buttonPush, FALLING); +
- +
-  initializeGraphics();​ +
- +
-  lcd.begin(16,​ 2); +
-+
- +
-void loop(){ +
-  static byte heroPos = HERO_POSITION_RUN_LOWER_1;​ +
-  static byte newTerrainType = TERRAIN_EMPTY;​ +
-  static byte newTerrainDuration = 1; +
-  static bool playing = false; +
-  static bool blink = false; +
-  static unsigned int distance = 0; +
- +
-  if (!playing) { +
-    drawHero((blink) ? HERO_POSITION_OFF : heroPos, terrainUpper,​ terrainLower,​ distance >> 3); +
-    if (blink) { +
-      lcd.setCursor(0,​0);​ +
-      lcd.print("​Game Over"​);​ +
-    } +
-    delay(250);​ +
-    blink = !blink; +
-    if (buttonPushed) { +
-      initializeGraphics();​ +
-      heroPos = HERO_POSITION_RUN_LOWER_1;​ +
-      playing = true; +
-      buttonPushed = false; +
-      distance = 0; +
-    } +
-    return; +
-  } +
- +
-  // Shift the terrain to the left +
-  advanceTerrain(terrainLower,​ newTerrainType == TERRAIN_LOWER_BLOCK ? SPRITE_TERRAIN_SOLID : SPRITE_TERRAIN_EMPTY);​ +
-   +
-  advanceTerrain(terrainUpper,​ newTerrainType == TERRAIN_UPPER_BLOCK ? SPRITE_TERRAIN_SOLID : SPRITE_TERRAIN_EMPTY);​ +
- +
-  // Make new terrain to enter on the right +
-  if (--newTerrainDuration == 0) { +
-    if (newTerrainType == TERRAIN_EMPTY) { +
-      newTerrainType = (random(3) == 0) ? TERRAIN_UPPER_BLOCK : TERRAIN_LOWER_BLOCK;​ +
-      newTerrainDuration = 2 + random(10);​ +
-    } else { +
-      newTerrainType = TERRAIN_EMPTY;​ +
-      newTerrainDuration = 10 + random(10);​ +
-    } +
-  } +
- +
-  if (buttonPushed) { +
-    if (heroPos <= HERO_POSITION_RUN_LOWER_2) heroPos = HERO_POSITION_JUMP_1;​ +
-    buttonPushed = false; +
-  }   +
- +
-  if (drawHero(heroPos,​ terrainUpper,​ terrainLower,​ distance >> 3)) { +
-    playing = false; // The hero collided with something. Too bad. +
-  } else { +
-    if (heroPos == HERO_POSITION_RUN_LOWER_2 || heroPos == HERO_POSITION_JUMP_8) { +
-      heroPos = HERO_POSITION_RUN_LOWER_1;​ +
-    } else if ((heroPos >= HERO_POSITION_JUMP_3 && heroPos <= HERO_POSITION_JUMP_5) && terrainLower[HERO_HORIZONTAL_POSITION] != SPRITE_TERRAIN_EMPTY) { +
-      heroPos = HERO_POSITION_RUN_UPPER_1;​ +
-    } else if (heroPos >= HERO_POSITION_RUN_UPPER_1 && terrainLower[HERO_HORIZONTAL_POSITION] == SPRITE_TERRAIN_EMPTY) { +
-      heroPos = HERO_POSITION_JUMP_5;​ +
-    } else if (heroPos == HERO_POSITION_RUN_UPPER_2) { +
-      heroPos = HERO_POSITION_RUN_UPPER_1;​ +
-    } else { +
-      ++heroPos;​ +
-    } +
-    ++distance;​ +
- +
-    digitalWrite(PIN_AUTOPLAY,​ terrainLower[HERO_HORIZONTAL_POSITION + 2] == SPRITE_TERRAIN_EMPTY ? HIGH : LOW); +
-  } +
-  delay(100);​ +
-}+
  
 +Acestea sunt cateva poze de pe parcursul realizarii acestui proiect:
 +{{ :​pm:​prj2022:​cstan:​whatsapp_image_2022-05-27_at_11.11.58.jpeg?​300 |}}
  
 +{{ :​pm:​prj2022:​cstan:​whatsapp_image_2022-05-27_at_11.11.59.jpeg?​300 |}}
  
 +A fost o reala provocare sa incerc sa modific proiectul din forma initiala gandita pentru a ajunge la aceasta forma finala, dar totul a meritat.
 +{{ :​pm:​prj2022:​cstan:​1.jpeg?​300 |}}
  
-</​note>​ 
- 
-===== Rezultate Obţinute ===== 
- 
-<note tip> 
-In urma realizarii proiectului,​rezultatele au fost cele dorite reusind sa  ma joc propriul meu joc Chrome Dino . 
- 
-{{ :​pm:​prj2022:​cstan:​whatsapp_image_2022-05-27_at_11.11.58.jpeg?​300 |}} 
- 
-{{ :​pm:​prj2022:​cstan:​whatsapp_image_2022-05-27_at_11.11.59.jpeg?​300 |}} 
 </​note>​ </​note>​
  
Line 436: Line 104:
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
 +
 +
  
pm/prj2022/cstan/endless_runner.1653639350.txt.gz · Last modified: 2022/05/27 11:15 by catalina.maftei
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0