Skip to content

Latest commit

 

History

History
248 lines (171 loc) · 9.82 KB

File metadata and controls

248 lines (171 loc) · 9.82 KB

6. Ruby2d

Чему научитесь:

  • устанавливать библиотеки в ruby и использовать в своём коде
  • писать простые игры с помощью библиотеки ruby2d

Материалы для изучения

Библиотеки и RubyGems
О фреймворках

Вопросы

  • зачем нужны библиотеки в программировании?
  • если использовали менеджеры пакетов/системы управления библиотеками , расскажите о своём опыте
  • зачем нужны фреймворки? В чем отличие фреймворка от библиотеки?

Практика

Rubygems и Bundler

Пришло время устанавливать библиотеки:

Rubygems - gem hosting service
Bundler - provides a consistent environment for Ruby projects by tracking and installing the exact gems and versions that are needed.

rubygems должке быть установлен вместе с Ruby, проверим:

gem -v

Список установленных библиотек (гемов):

gem list

Ищем bundler:

gem list | grep "bundler"

Больше о grep

Ruby 2d

Фреймворк Ruby2d

Get started with Ruby 2d

Установка ruby2d

Для windows - в wsl устанавливаем пакеты, необходимые для ruby2d: (в ubuntu аналогично)

sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

Создание пространства для экспериментов

  • создаём отдельную директорию (обратите внимание, чтобы она не была внутри существующего репозитория)
  • создаём Gemfile, записываем туда:
source 'https://rubygems.org'

gem 'ruby2d'

Устанавливаем указанные в Gemfile гемы командой:

bundle install

Выполнять код будем:

bundle exec ruby файл.rb

Getting started with ruby2d

Hello world для ruby2d

Попробуем простой код с использованием ruby2d:

  • создадим файл
  • нарисуем треугольник
require 'ruby2d'

set title: "Hello Triangle"

Triangle.new(
  x1: 320, y1:  50,
  x2: 540, y2: 430,
  x3: 100, y3: 430,
  color: ['red', 'green', 'blue']
)

show

Изменение положения фигуры, управление с клавиатуры

Для слeдующего эксперимента создадим отдельный файл.
Нарисуем квадрат, которым мы сможем управлять с клавиатуры.

Ссылки:

on :key_down do |event|
  # здесь доступен объект event, можно изучить его свойства
  puts event
end

Действия

Возьмём пример.

Обратите внимание на: (найдите в коде примера и убедитесь, что понимаете принцип работы)

  • обработку клавиш
  • цикл update
  • изменение значений переменных @x_speed, @y_speed

Поменяем код:

  • изменим размеры, цвет, стартовую позицию квадрата

  • измените программу так, чтобы менялись не скорость движения, а координаты фигуры (@square.x, @square.y) (можно менять скорость с помощью одних клавиш, а координаты - с помощью других)

  • добавьте возвращение фигуры на исходное место (значение координат фигуры и скоростей - вернуть в исходные значения)

  • измените программу так, чтобы управлять другими клавишами

(клавишам направлений будут соответствовать строки 'left', 'right', 'up', 'down', пробел - 'space')

  • поэкспериментируйте с управлением и параметрами фигуры

  • используйте оператор case вместо множества if-else:

case fruit
when 'banana'
  puts "Это банан"
when 'apple'
  puts "Это яблоко"
when 'orange'
  puts "Это апельсин"
else
  puts "Это какой-то непонятный фрукт"
end

будет соответствовать коду с if-elsif:

if fruit == 'banana'
  puts "Это банан"
elsif fruit == 'apple'
  puts "Это яблоко"
elsif fruit == 'orange'
  puts "Это апельсин"
else
  puts "Это какой-то непонятный фрукт"
end

вариант готовой программы

Пишем игру "Попади по рубину":

Рубин меняет своё положение на экране, цель игры - попасть по рубину.
При попадании увеличивается счёт. При достижении целевого счёта (например, 10 попаданий) - игра завершается победой.

Скриншот игры

Какие задачи/знакомые концепции вы видите?
С чего бы начали разработку игры?

Прочитайте о спрайтах и их использовании

Мы будем использовать простой спрайт из двух кадров.
Вы можете использовать картинку или заменить на свою.

Если вы чувствуете себя уверенно, можете разрабатывать игру самостоятельно, опираясь на документацию фреймворка ruby2d.
Другой вариант - разработка по шагам, перечисленным ниже.
Ещё один вариант - писать код параллельно на встрече / по видео.

Шаги разработки:

  • задаём title и фон
  • создаём спрайт с loop false, он не будет меняться (на данном этапе это просто картинка)
  • спрайт двигается координаты рандомно меняются (Используйте метод rand) концепция tick
    (TODO: описать tick)
    update loop
  • будем "попадать" по рубину
    • обработка клика мышкой
    • проверка попадания (можно использовать метода contains?, но чтобы он работал, нужно, чтобы у спрайта были установлены значения width и height) => увеличиваем "счёт"
    • заводим "счёт"
  • проверка "максимальный счёт => завершение игры"
  • удаление спрайта при завершении игры
  • эффект разбивания рубина (sprite.play)
  • лупим молотком по рубину
    • создаём картинку "молоток", обрабатываем событие mouse_move и, т.о. меняем координаты картинки на координаты курсора.

Доработка:

  • "играть снова" после завершения игры
  • "анимация" при разбивании рубина
  • замена рубина на ваш объект, возможно, другого размера
    • замена анимации

вариант готовой программы

репозиторий с кодом упражнений

git

Закоммитьте и запушьте на гитхаб:

  • создайте репозиторий на гитхабе если создадите без ридми, то он напишет инструкцию
  • в своей директории git init
  • добавьте файлы - git add файлы (git add . - все файлы)
  • закоммитьте git commit -m "описание"
  • git remote add origin url_репозитория (ssh)
  • пушьте - git push origin main