Помогите разобраться со скетчем.

mikolka6
Offline
Зарегистрирован: 20.11.2019

Добрые люди помогите. С дочкой решили сделать пинпонг как в этой статье http://wiki.amperka.ru/projects:pong но при заливки скетча вылетает ошибка. 

Arduino: 1.8.13 (Windows 7), Плата:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

 
C:\Users\mikolka6\Desktop\gamePong\gamePong.ino: In function 'void loop()':
 
gamePong:66:10: error: 'class TVout' has no member named 'clearScreen'
 
       TV.clearScreen();
 
          ^~~~~~~~~~~
 
gamePong:68:10: error: 'class TVout' has no member named 'selectFont'; did you mean 'select_font'?
 
       TV.selectFont(font4x6);
 
          ^~~~~~~~~~
 
          select_font
 
gamePong:68:21: error: 'font4x6' was not declared in this scope
 
       TV.selectFont(font4x6);
 
                     ^~~~~~~
 
gamePong:73:10: error: 'class TVout' has no member named 'selectFont'; did you mean 'select_font'?
 
       TV.selectFont(font8x8);
 
          ^~~~~~~~~~
 
          select_font
 
gamePong:73:21: error: 'font8x8' was not declared in this scope
 
       TV.selectFont(font8x8);
 
                     ^~~~~~~
 
gamePong:85:10: error: 'class TVout' has no member named 'selectFont'; did you mean 'select_font'?
 
       TV.selectFont(font4x6);
 
          ^~~~~~~~~~
 
          select_font
 
gamePong:87:10: error: 'class TVout' has no member named 'clearScreen'
 
       TV.clearScreen();
 
          ^~~~~~~~~~~
 
gamePong:154:8: error: 'class TVout' has no member named 'delayFrame'; did you mean 'delay_frame'?
 
     TV.delayFrame(1);
 
        ^~~~~~~~~~
 
        delay_frame
 
gamePong:162:12: error: 'class TVout' has no member named 'delayFrame'; did you mean 'delay_frame'?
 
         TV.delayFrame(120);
 
            ^~~~~~~~~~
 
            delay_frame
 
gamePong:169:12: error: 'class TVout' has no member named 'delayFrame'; did you mean 'delay_frame'?
 
         TV.delayFrame(120);
 
            ^~~~~~~~~~
 
            delay_frame
 
gamePong:182:10: error: 'class TVout' has no member named 'clearScreen'
 
       TV.clearScreen();
 
          ^~~~~~~~~~~
 
C:\Users\mikolka6\Desktop\gamePong\gamePong.ino: In function 'void drawScores()':
 
gamePong:203:6: error: 'class TVout' has no member named 'printChar'; did you mean 'print_char'?
 
   TV.printChar((hres / 4), 4, '0' + playerScoreLeft);
 
      ^~~~~~~~~
 
      print_char
 
gamePong:204:6: error: 'class TVout' has no member named 'printChar'; did you mean 'print_char'?
 
   TV.printChar((hres / 4) + (hres / 2), 4, '0' + playerScoreRight);
 
      ^~~~~~~~~
 
      print_char
 
C:\Users\mikolka6\Desktop\gamePong\gamePong.ino: In function 'void drawPaddles()':
 
gamePong:211:6: error: 'class TVout' has no member named 'drawRect'; did you mean 'draw_rect'?
 
   TV.drawRect(0, 0, 1, vres, 0, 0);
 
      ^~~~~~~~
 
      draw_rect
 
gamePong:212:6: error: 'class TVout' has no member named 'drawRect'; did you mean 'draw_rect'?
 
   TV.drawRect(hres - 2, 0, 1, vres, 0, 0);
 
      ^~~~~~~~
 
      draw_rect
 
gamePong:215:6: error: 'class TVout' has no member named 'drawRect'; did you mean 'draw_rect'?
 
   TV.drawRect(0, leftPaddleY, 1, PADDLE_HEIGHT, WHITE, true);
 
      ^~~~~~~~
 
      draw_rect
 
gamePong:216:6: error: 'class TVout' has no member named 'drawRect'; did you mean 'draw_rect'?
 
   TV.drawRect(hres - 2, rightPaddleY, 1, PADDLE_HEIGHT, WHITE, true);
 
      ^~~~~~~~
 
      draw_rect
 
C:\Users\mikolka6\Desktop\gamePong\gamePong.ino: In function 'void drawBall()':
 
gamePong:222:6: error: 'class TVout' has no member named 'setPixel'; did you mean 'set_pixel'?
 
   TV.setPixel(ballX, ballY, INVERT);
 
      ^~~~~~~~
 
      set_pixel
 
C:\Users\mikolka6\Desktop\gamePong\gamePong.ino: In function 'void drawBox()':
 
gamePong:227:6: error: 'class TVout' has no member named 'clearScreen'
 
   TV.clearScreen();
 
      ^~~~~~~~~~~
 
gamePong:230:8: error: 'class TVout' has no member named 'drawLine'; did you mean 'draw_line'?
 
     TV.drawLine(hres / 2, i, hres / 2, i + 2, 1);
 
        ^~~~~~~~
 
        draw_line
 
gamePong:233:6: error: 'class TVout' has no member named 'drawLine'; did you mean 'draw_line'?
 
   TV.drawLine(0, 0, hres, 0, WHITE);
 
      ^~~~~~~~
 
      draw_line
 
gamePong:235:6: error: 'class TVout' has no member named 'drawLine'; did you mean 'draw_line'?
 
   TV.drawLine(0, vres - 2, hres, vres - 2, WHITE);
 
      ^~~~~~~~
 
      draw_line
 
exit status 1
 
'class TVout' has no member named 'clearScreen'
 
 
 
 
 
 
b707
Offline
Зарегистрирован: 26.05.2017

выкладывайте скетч по правилам форума, лазать по внешним ссылкам никто не будет

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да и спрашивать надо спервоначала у автора кода/статьи

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну и, вангую, ниасилишь ты пока это, ни один, ни с дочкой.  Начни с чегонить попроще. 

mikolka6
Offline
Зарегистрирован: 20.11.2019

Я это понимаю. Просто хотели поиграть. Но уже третий день бьемся.

mikolka6
Offline
Зарегистрирован: 20.11.2019

b707 пишет:

выкладывайте скетч по правилам форума, лазать по внешним ссылкам никто не будет

// библиотека для работы с композитным видео выходом
#include <TVout.h>

// создаём объект TV класса TVout
TVout TV;

// максимальное количесво очков
#define MAX_SCORE         7
// длина ракеток
#define PADDLE_HEIGHT     10
// невидимые боковые грани рекакетки
// для отбивания в крайних точках ракетки
#define PADDLE_OFFSET     2

// пины подключения джойстиков каждого игрока
#define PLAYER_LEFT_PIN   A5
#define PLAYER_RIGHT_PIN  A0

// переменные для хранения размеров экрана
int hres, vres;
// координаты шара
int ballX, ballY;
// направление шара
int ballDX = 1;
int ballDY = 1;
// очки игроков
int playerScoreLeft = 0;
int playerScoreRight = 0;
int leftPaddleY = 0;
int rightPaddleY = 0;

// состояния системы
enum State
{
    RESET_GAME,
    NEXT_LEVEL,
    PLAY_GAME,
    STATE_MISS,
};
 
// объявляем переменную state
State state;

bool missed = 0;

void setup()
{
  
  // инициализируем коммуникацию с телевизиром
  TV.begin(NTSC, 136, 96);
  // ждём 1 секунду
  delay(1000);
  // считываем размеры экрана
  hres = TV.hres();
  vres = TV.vres();
  // сбрасываем игру
  state = RESET_GAME;

}

void loop()
{
  switch (state) {
    case RESET_GAME:
      // очищаем экран
      TV.clearScreen();
      // выбираем шрифт «4×6»
      TV.selectFont(font4x6);
      // печатем на экране слово «Амперка»
      TV.print(55, 0, "Amperka");
      delay(1000);
      // выбираем шрифт «8×8»
      TV.selectFont(font8x8);
      // печатем на экране название игры «Arduino Pong"»
      TV.print(20, 30, "Arduino Pong");
      delay(1000);
      // на старт, внимание, вперёд
      for (int i = 3; i != 0; i-- ) {
        TV.print(hres / 2, 60, i);
        TV.tone(1000, 300);
        delay(1000);
      }
      TV.tone(2000, 300);
      // выбираем шрифт «4×6»
      TV.selectFont(font4x6);
      // очищаем экран
      TV.clearScreen();
      // обнуляем счёт обоих игроков
      playerScoreLeft = 0;
      playerScoreRight = 0;
      // переходим на следующий уровень
      state = NEXT_LEVEL;
      break;
    case NEXT_LEVEL:
      // сброс шарика и ракеток
      resetBallAndPaddles();
      // рисуем игровое поле на экране
      drawBox();
      // выводим очки игроков на экране
      drawScores();
      // рисуем игровые ракетки
      drawPaddles();
      // переходим в состояние игры
      state = PLAY_GAME;
      break;
    case PLAY_GAME:
    // если мяч достиг верхеней / нижней границицы поля
    if (ballY == vres || ballY == 0) {
      ballDY *= -1;
    }
    // если мяч приближается к правой стороне
    if (ballX >= hres - 2) { 
      // если мяч отбился правой ракеткой 
      if (ballY > rightPaddleY - PADDLE_OFFSET && 
          ballY < (rightPaddleY + PADDLE_HEIGHT + PADDLE_OFFSET) && ballDX > 0 ) {
        ballDX = -1;
      }
    }
    // если мяч достиг правой стены
    if (ballX == hres - 1) {
      missed = true;
      state = STATE_MISS;
      playerScoreLeft++;
      break;
    }
    
    // если мяч приближается к правой стороне
    if (ballX <= 2) {
      // если мяч отбился левой ракеткой
      if (ballY > leftPaddleY - PADDLE_OFFSET && 
          ballY < (leftPaddleY + PADDLE_HEIGHT + PADDLE_OFFSET) && ballDX < 0 ) {
        ballDX = 1;
      }
    }
    // если мяч достиг левой стены
    if (ballX == 0) {
      missed = false;
      state = STATE_MISS;
      playerScoreRight++;
      break;
    }
    
    // обновляем положения ракеток
    leftPaddleY =  map(analogRead(PLAYER_LEFT_PIN), 0, 1024, 0, vres - PADDLE_HEIGHT);
    rightPaddleY = map(analogRead(PLAYER_RIGHT_PIN), 0, 1024, 0, vres - PADDLE_HEIGHT);
    // обновляем положение шарика
    drawBall();
    // меням местоположение шарика на следущий шаг
    ballX += ballDX;
    ballY += ballDY;
    drawPaddles();
    // обновляем положение шарика
    drawBall();
    TV.delayFrame(1);
      break;
    
    case STATE_MISS:
      // если кто то пропустид мяч
      if (playerScoreLeft == MAX_SCORE) {
        TV.print(16, vres / 2, "Winner!");
        TV.tone(2000, 500);
        TV.delayFrame(120);
        state = RESET_GAME;
        while(1);
        break;
      } else if (playerScoreRight == MAX_SCORE) {
        TV.print(hres / 2 + 16, vres / 2, "Winner!");
        TV.tone(2000, 500);
        TV.delayFrame(120);
        state = RESET_GAME;
        while(1);
        break;
      }
      if (missed) {
        TV.print(hres / 2 + 16, vres / 2, "Missed!");
        TV.tone(500, 300);
      } else {
        TV.print(16, vres / 2, "Missed!");
        TV.tone(500, 300);
      }     
      delay(1000);
      TV.clearScreen();
      state = NEXT_LEVEL;
      break;
  }
}

// сброс шарика и ракеток
void resetBallAndPaddles() {
  randomSeed(analogRead(A2));
  int noise = random(vres);
  ballX = hres / 2;
  ballY = random(vres);
  ballDX = (noise & 0x01) ?  1 : -1;
  ballDY = (noise & 0x02) ? -1 :  1;

  leftPaddleY = vres / 2;
  rightPaddleY = vres / 2;
}

// вывод очков на дисплей
void drawScores() {
  TV.printChar((hres / 4), 4, '0' + playerScoreLeft);
  TV.printChar((hres / 4) + (hres / 2), 4, '0' + playerScoreRight);
}

// вывод ракеток на дисплей
void drawPaddles() {
  // стираем предыдущие ракетки
  // стираем всю возможную область их местоположения
  TV.drawRect(0, 0, 1, vres, 0, 0);
  TV.drawRect(hres - 2, 0, 1, vres, 0, 0);

  // выводим текущее положение ракеток
  TV.drawRect(0, leftPaddleY, 1, PADDLE_HEIGHT, WHITE, true);
  TV.drawRect(hres - 2, rightPaddleY, 1, PADDLE_HEIGHT, WHITE, true);
}

// вывод шарика
void drawBall() {
  // рисуем шарик
  TV.setPixel(ballX, ballY, INVERT);
}

// отрисовка игрового поля на экране
void drawBox() {
  TV.clearScreen();
  // середина поля
  for (int i = 0; i < vres; i += 6) {
    TV.drawLine(hres / 2, i, hres / 2, i + 2, 1);
  }
  // верхняя граница поля
  TV.drawLine(0, 0, hres, 0, WHITE);
  // нижняя граница поля
  TV.drawLine(0, vres - 2, hres, vres - 2, WHITE);
}

 

mikolka6
Offline
Зарегистрирован: 20.11.2019

DetSimen пишет:

Да и спрашивать надо спервоначала у автора кода/статьи

Статья и код вроде в свободном доступе. 

sadman41
Offline
Зарегистрирован: 19.10.2016

В лесу грибы растут для любого. Это повод для просьб ко всем окружающим быстренько сбегать и набрать для вас с дочкой груздей, потому что очень вам их хочется, но отличить нормальные грибы от поганок не умеете?

Хотите, чтобы кто-то помог - принимайте участие в решении _своей_, а не нашей проблемы. Или форум вам очень сильно задолжал когда-то?

sadman41
Offline
Зарегистрирован: 19.10.2016

Исходя из текста ошибок - использована какая-то сторонняя библиотека TVOut, несовместимая с той, что применялась при разработке скетча его автором.

b707
Offline
Зарегистрирован: 26.05.2017

mikolka6 пишет:

Статья и код вроде в свободном доступе. 

в этой же статье есть прямая ссылка на библиотеку. И с ней, насколько я вижу - таких ошибок быть не должно. Удалите неправильную библиотеку со своего компа, поставьте библиотеку по ссылке из статьи и все будет хорошо.

mikolka6
Offline
Зарегистрирован: 20.11.2019

b707 пишет:

mikolka6 пишет:

Статья и код вроде в свободном доступе. 

в этой же статье есть прямая ссылка на библиотеку. И с ней, насколько я вижу - таких ошибок быть не должно. Удалите неправильную библиотеку со своего компа, поставьте библиотеку по ссылке из статьи и все будет хорошо.

Я пробовал оба скетча. ошибка одна и таже.

Ладно ребят вопрос снят. Спасибо всем. Буду сам разбираться.

b707
Offline
Зарегистрирован: 26.05.2017

mikolka6 пишет:

Я пробовал оба скетча. ошибка одна и таже.

какие оба? в статье только один скетч.

Там есть ссылка на библиотеку TVOut . Вы ее скачали? Установили?

mikolka6
Offline
Зарегистрирован: 20.11.2019

b707 пишет:

mikolka6 пишет:

Я пробовал оба скетча. ошибка одна и таже.

какие оба? в статье только один скетч.

Там есть ссылка на библиотеку TVOut . Вы ее скачали? Установили?

Там скетч выложенный текстом и ссылка на скачивание. Я пробовал оба варианта. Библиотеку установил изначально. Более ссылок я не нашел.

b707
Offline
Зарегистрирован: 26.05.2017

mikolka6 пишет:

Библиотеку установил изначально. Более ссылок я не нашел.

Николка, заканчивайте тупить. Я вас спрашиваю, вы библиотеку установили именно ту, что по ссылке из статьи? Или какую-то другую с таким же названием, например из Ардуин ИДЕ?

Вам надо взять именно ту, что в статье

Надо войти на гитхаб, скачать ZIP-архив, а потом разархивировать его в свою папку libraries в том кактлоге, где у вас установлена Ардуино

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

Надо войти на гитхаб, скачать ZIP-архив, а потом разархивировать его в свою папку libraries в том кактлоге, где у вас установлена Ардуино

А ту, которая установлена сейчас, удалить

mikolka6
Offline
Зарегистрирован: 20.11.2019

b707 пишет:

mikolka6 пишет:

Библиотеку установил изначально. Более ссылок я не нашел.

Николка, заканчивайте тупить. Я вас спрашиваю, вы библиотеку установили именно ту, что по ссылке из статьи? Или какую-то другую с таким же названием, например из Ардуин ИДЕ?

Вам надо взять именно ту, что в статье

Надо войти на гитхаб, скачать ZIP-архив, а потом разархивировать его в свою папку libraries в том кактлоге, где у вас установлена Ардуино

Вы оказались правы. Я установил библиотеку из самого приложения ардуино. А нужно было скачать и добавить с сайта. Всё залилось. Спасибо Вам огромное!!! Тема закрыта. Спасибо ещё раз. Буду учить матчасть.