проблема с игрой pong для spi oled дисплея

Тема в разделе "Arduino & Shields", создана пользователем CurlyBrace, 13 фев 2016.

Метки:
  1. CurlyBrace

    CurlyBrace Нуб

    на данный момент я подготовил логику движения мяча и его отскока от границ дисплея,но при отскоке от верхней границы он пролетает пару пикселей в нужном направлении,и опять летит к верхней границе
    Код (C++):
    #include <U8glib.h>
    U8GLIB_SSD1306_128X64 u8g(10, 9, 12);
    int bVector = 4; //векторы я использую для задания движения мяча. их всего пока 4
    const int r = 2;
    int x = 64;
    int y = 34;

    void draw(void) {

      u8g.drawCircle(x, y, r); //шарик
      u8g.drawFrame(0, 20, 128, 44); //для обозначения границы экрана
    }


    void setup() {
    }

    void loop(void) {

      if (bVector == 1) { //при направлении вектора = 1 шарик движется вправо вниз
        x = x + 1;
        y = y + 1;
      }
      else if (bVector == 2) { //влево вниз
        x = x - 1;
        y = y + 1;
      }
      else if (bVector == 3) { //влево вверх
        x = x - 1;
        y = y - 1;
      }
      else if (bVector == 4) { //вправо вверх
        x = x + 1;
        y = y - 1;
      }


      if (x <= 5 and bVector == 2) { //отскок при столкновении с левой границей
        bVector = 1;
      }
      else if (x <= 5 and bVector == 3) {
        bVector = 4;
      }


      if (x >= 123 and bVector == 4) { //с правой
        bVector = 3;
      }
      else if (x >= 123 and  bVector == 1) {
        bVector = 2;
      }


      if (y <= 25 and bVector == 3) { //с верхней. именно на этом месте шарик застревает наверху,пока снова не отскочит от боковой границы
        bVector = 2;
      }
      else if (y <= 25 and  bVector == 4) {
        bVector = 1;
      }

      if (y >= 59 and bVector == 1) { //с нижним
        bVector = 4;
      }
      else if (y >= 25 and bVector == 2) {
        bVector = 3;
      }

      // picture loop
      u8g.firstPage();
      do {
        draw();
      } while ( u8g.nextPage() );



      // rebuild the picture after some delay
      delay(24);

    }
     
    малые размеры игрового поля обусловлены тем,что я использую монохромный сине-желтый дисплей,разделенный на две части
     
  2. CurlyBrace

    CurlyBrace Нуб

    все нормально заработало,как только я переписал код таким образом:
    Код (C++):
    #include <U8glib.h>
    U8GLIB_SSD1306_128X64 u8g(10, 9, 12);
    int bVector = 4; //векторы я использую для задания движения мяча
    const int r = 2;
    int x = 64;
    int y = 34;

    void draw(void) {

      u8g.drawCircle(x, y, r); //тот свмый "шарик"
      u8g.drawFrame(0, 20, 64, 44); //для обозначения границы экрана
      u8g.drawFrame(63, 20, 64, 44);
    }


    void setup() {
    }

    void loop(void) {
    switch ( bVector ) {
    case 1:
        x = x + r;
        y = y + r;
        if (y >= 62) {
          bVector = 4;
        }
        if (x >= 126) {
          bVector = 2;
        }
      break;
    case 2:
        x = x - r;
        y = y + r;
        if ( y >=62 ) {
          bVector = 3;
        }
        if ( x<= 2 ) {
          bVector = 1;
        }
      break;
    case 3:
        x = x - r;
        y = y - r;
        if ( y <=22 ) {
          bVector = 2;
        }
        if ( x<= 2 ) {
          bVector = 4;
        }
      break;
    case 4:
        x = x + r;
        y = y - r;
        if ( y<= 22) {
          bVector = 1;
        }
        if ( x >= 126) {
         bVector = 3;
        }
      break;
    }
     

      // picture loop
      u8g.firstPage();
      do {
        draw();
      } while ( u8g.nextPage() );



      // rebuild the picture after some delay
      delay(24);

    }