Урок 2.3. Создание простой компьютерной игры

Базовый курс "Программирование микроконтроллеров"
Модуль 2. Создание интерактивных интерфейсов в среде Processing

Что такое Processing?

Помимо художественных анимаций и научных моделей, на Processing можно писать игры! Напишем простую игру по мотивам известного произведения Анджея Сапковского “Ведьмак”. В этой игре нам нужно будет собирать монетки, которыми щедро осыпают кошелек Геральта из Ривии.

Начнём с того, что научимся работать с изображениями. Для удобства, скачайте архив и переместите папку Witcher на рабочий стол, ссылка на скачивание архива:

Откройте папку и запустите файл Witcher.pde.

В нём Вы обнаружите наш стартовый код с пояснениями, запустив который, Вы увидите на своём экране Ведьмака, устало сидящего на Плотве, и Лютика, сочинившего в честь Геральта хвалебную оду.

void loop() {
  int duration;
  float cm;
  // генерируем на выводе Trig положительный импульс длиной 10 мкс
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // считываем длительность импульса, т.е. время между испусканием УЗ волны и её возвратом
  duration = pulseIn(echoPin, HIGH);
  // вычисляем расстояние
  cm = (float)duration / 58;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Dist = " + String(cm) + " cm");
  delay(200);
}

По такому же принципу добавим еще два объекта, кошелек, которым будем ловить монетки, и сами монетки:

// Создание объекта класса "Изображение"
PImage bg; // объект фон окна
PImage coin; // объект монетки
PImage wallet; //объект кошелька
float x_w, w_w, h_w, y_w; // координаты, ширина и высота кошелька
float w_c, h_c; // ширина и высота монетки
int N=5; // количество монет, их координаты и скорости
float x_c[] = new float[N];
float y_c[] = new float[N];
float Vy[] = new float[N];

void setup()
{
  fullScreen(); // полноэкранный режим
  bg = loadImage("witcher.jpg");
  bg.resize(width, height);
  coin = loadImage("coin.png");
  // задаем размеры монетки как 1/20 от ширины и высоты экрана
  w_c = width/20;
  h_c = height/20;
  coin.resize(int(w_c), int(h_c));
  wallet = loadImage("wallet.png");
  // задаем размеры кошелька как 1/10 от ширины и высоты экрана
  h_w = height/10;
  w_w = width/10;
  wallet.resize(int(w_w), int(h_w));
  // генерируем параметры монеток
  for (int i=0; i<N; i++)
  {
    x_c[i]=random(w_c, width - w_c);
    y_c[i]=h_c;
    Vy[i]=random(1, 5);
  }
  // задаём положение кошелька
  y_w=height-100;
  x_w=width/2;
}

void draw()
{
  background(bg); // устанавливаем в качестве заднего фона объект bg
  image(wallet, x_w, y_w); // располагаем изображение кошелька в координатах x_w и y_w
  // рисуем монетки в сгенерированных позициях
  for (int i=0; i<N; i++)
  {
    y_c[i]=y_c[i]+Vy[i];
    image(coin, x_c[i], y_c[i]);
  }
}