Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Курс Arduino - Processing

Processing

Хотелось ли вам сделать свою игру? А управлять собственной игрой с собственного джойстика?

Если да, то вы по адресу!

Что такое Processing? 

Processing – это язык программирования, основанный на Java. С помощью него легко можно “оживить” показания датчиков, а из скучных цифр устроить красочную анимацию.

Кстати, Arduino IDE написана на Processing.

Я не буду рассказывать об основах Processing. Если станет интересно – на сайте processing.org есть обучающие видео от Даниэля Шиффмана. Одна загвоздка – они на английском. Если языковой барьер мешает изучать Processing, то можно поискать в интернете обучающие видео. На helloprocessing.ru есть перевод уроков Шиффмана к часу кода.

Поехали!

Так как Processing не предназначен для создания игр, от сложных проектов придется отказаться.

А вот небольшую игру из 90ых накодить –  пожалуйста.

Этой игрой будет Арканоид. Если кто не помнит или не знает, Арканоид – это игра, цель которой сбить шариком все кирпичи сверху и при этом не дать мячу упасть ниже платформы.

Управлять платформой мы будем с джойстика. А играть будем на экране компьютера.
Примечание: В одном из последующих уроков джойстик станет беспроводным.

Начнем с необходимых сегодня компонентов. Их немного:

  • Arduino UNO – для считывания показаний с джойстика и передачи их в Processing через Serial port.
  • Модуль Джойстик – для управления платформой.
  • Компьютер с установленными Arduino IDE и Processing .

Схема джойстика

  • Vcc – подключается к выводу в 5V
  • VER или X – подключается к A0
  • HOR или Y – подключается к А1
  • SEL или SW – подключается к 2
  • Gnd – подключается к земле

Готовый джойстик

Сейчас нужно подумать, как же связать Arduino и компьютер. Для этого и существует Serial port. Помните – мы использовали Serial monitor в Arduino IDE для просмотра показаний с датчиков? Теперь с помощью передачи данных с джойстика в Serial мы сможем управлять платформой. Осталось разобраться с тем, каким образом мы будем это делать.

Алгоритм

  • Джойстик – пишем код на Arduino IDE, с помощью которого считываем показания с джойстика.
  • Serial – отправляем показания джойстика в Processing с помощью Serial.
  • Processing – обрабатываем поступившие показания и пишем код игры на Processing.

Джойстик и Serial

Открываем Arduino IDE и пишем код.

#define axisX A0 //Ось Х джойстика, отвечающая за движение вверх и вниз
#define axisY A1 //Ось Y джойстика, отвечающая за движение влево и вправо
#define buttion 2 //Кнопка на джойстике

void setup() 
{
  //Обозначим оси как выходы...
  pinMode(axisX, INPUT);
  pinMode(axisY, INPUT);
  //... а кнопку как выход с подтягивающим резистором
  pinMode(buttion, INPUT_PULLUP);
  //Установим соединение с Serial портом
  Serial.begin(9600);
}

void loop()
{
 //Переменные для передачи данных
 int Y = analogRead(axisY);
 int X = analogRead(axisX);
 int B = digitalRead(buttion);
 
//Протокол передачи данных
 Serial.print(Y);
 Serial.print(",");
 Serial.print(X);
 Serial.print(",");
 Serial.println(B);
}

Протокол?

Возможности Serial port ограничены передачей только одного показания, а показаний то у нас целых три – ось Х, ось Y и кнопка. Для этого и нужны протоколы связи. Что такое протокол?

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

Так и с устройствами. Они не могут понимать друг друга без протокола связи. Он устанавливает правила общения между устройствами и позволяет им понимать друг друга. Если хочется более полного и “мудреного” объяснения загляните в Википедию.

Вернемся к скетчу. Данные с джойстика отправляются в виде: 

ОсьY, ОсьX, Кнопка *Переход на другую строку*

Это и есть наш протокол. Осталось научить Processing его распознавать.

Processing

Теперь нужно открыть Processing.

Начнем с “дешифровки” нашего протокола.

Код

//Импортируем библиотеку для работы с Serial monitor

import processing.serial.*;

//Создаем объект класса Serial

Serial myPort; 

//Создаем переменные для полученных показаний

int reset, axisX, axisY;

//Создаем переменную для размера шрифта

int fontSize = 36;

void setup()
{
  //Определяем размер окна
  
  size(480, 480);
  
  //Выводим список COM портов и берем тот,
  //к которому подключен микроконтроллер
  //У Windows обычно 1 порт, а у MAC - 0
  
  println(Serial.list()) ;
  String portName = Serial.list()[1];
  
  //Открываем последовательный порт
  
  myPort = new Serial(this, portName, 9600);
  
  //Считываем приходящие данные, пока не дойдем до символа 
  //перевода строки
  
  myPort.bufferUntil('\n');
}
 //Этот метод вызывается тогда, когда в буффер пришло
 //значение перевода строки

void serialEvent(Serial myPort)
{
  //Считываем данные из буффера
  
  String inputString = myPort.readStringUntil('\n');
  
  //Отбрасываем ненужные символы(возврат каретки и перевод строки)
  
  inputString = trim(inputString);
  
  //Разделяем полученную строку по запятым и задаем переменным
  //нужные значения
  
  int axises[] = int(split(inputString, ','));
  if(axises.length == 3)
  {
    axisY = axises[0];
    axisX = axises[1];
    reset = axises[2];  
  }
}

//Этот метод рисует показания датчиков на экране
//В процессе дешифровки протокола участия не принимает

void draw()
{ 
 //Задаем цвет фона в кодировке rgb или html, если не задать - будет черный
 
 background(#044f6f); 
 
 //Задаем цвет заполнения в кодировке rgb или html, если не задать - будт белый
 
 fill (#ffffff);
 
 //Создаем шрифт - его размер, стиль
 
 PFont myFont = createFont(PFont.list () [2], fontSize);
 
 //Задаем шрифт
 
 textFont(myFont);
 
 //Выводим показания датчиков на экран
 
 text(axisY, width / 2, height/ 2);
 text(axisX, width / 2, height / 2 + 40);
 text(reset, width / 2, height / 2 - 40);
}

Полученные показания записываются в соответствующие переменные и выводятся на экран. Правда вывод значений на экран не нужен и служит только для наглядности.

Игра

Теперь можно начинать делать игру. Так как код достаточно большой, я не буду писать его. Код можно найти в прикрепленных файлах под именем  Game.pde.

Пояснения

Структура игры состоит из методов или функций, которые взаимодействуя друг с другом, создают игру. А метод draw выводит на экран картинку производимых действий.

Так как Processing не предназначен для создания игр, в нем нет функции о соприкосновении объектов друг с другом, поэтому пришлось определять момент столкновения по координатам, что несколько сложнее.

Каждое действие должно подлежать описанию, а для того чтобы определить действия используются переменные, которые меняют свое значение в соответствии с выполняемым сейчас действием. К примеру – при запуске игры значение переменной start равно нулю, в это время на экране мы видим надпись “Press the button!”, а при нажатии кнопки, значение переменной  start становится равным единице и начинается игра.

Итог

Ура! Получился Арканоид V1.0. Я собираюсь дальше улучшать его и привести к канонам настоящего Арканоида с бонусами и уровнями, с кирпичами и блоками.

Геймплей Арканоида можно посмотреть на видео.

Как вторая версия будет готова, обязательно поделюсь, а пока – можно двигаться дальше.

Прикрепленные файлы:

Теги:

Опубликована: 0 1
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.5 Проголосовало: 1 чел.

Комментарии (4) | Я собрал (0) | Подписаться

+1
Kamikadza #
Все классно, но мне кажется интересней сделать все это с выводом на внешний дисплей, а то не совсем понятно применение "мозгов" ардуинки, только в качестве джойстика. Хотя возможность импорта в processing интересная нужно почитать, спасибо!
Ответить
0

[Автор]
Симилячник #
Про экран это вы в точку. Его и хотел подключать в "Версии 2"
А в этом уроке я показывал, как работать с процессингом и передавать в него показания с датчиков, в частности - с джойстика.
Ответить
0
AlexGames #
Не получается processing пишет
java.lang.ArrayIndexOutOfBoundsException: 1
at arduino198_Game.setup(arduino198_Game.java:80)
at processing.core.PApplet.handleDraw(PApplet.java:2387)
at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1540)
at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)
Ответить
0

[Автор]
Симилячник #
Код копировали или писали?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Конструктор - темброблок на LM1036 Регулятор мощности 2 кВт
вверх