Ключевой элемент игры -- игровой фрейм, через который осуществляется взаимодействия игрока с игрой.
Необходимые возможности:
- инициализация,
- отображение изображения в заданной позиции и очистка,
- воспроизведение звуков,
- слежение за состоянием контроллеров и проверка текущего состояния.
Так же необходимы объекты для хранения и манипулирования ресурсами:
- картинки,
- аудио-семплы,
- состояние контролла.
Для демонстрации будем использовать javascript c html5, так как у него есть все необходимые возможности и не надо организовывать среду для сборки проекта. Демка проверялась на firefox 52.
Для хранения картинок и семплов используем стандартные теги <img> и <audio>.
TODO в дальнейшем лучше перейти на ImageData и AudioBuffer -- для создания спецэффектов (physics/spec.effects)
??? к сожалению нет способа взаимного преобразования <audio> и AudioBuffer
Состояния контроллов -- либо единственное значение, либо структура с соответствующими полями.
Для вывода изображения во фрейме используется метод Canvas -- drawImage(image, x, y), а для очистки -- clearRect(0,0,WIDTH, HEIGHT);
!!! можно использовать стили для размещения в нужной позиции, но для множества мелких повторяющихся изображений это не эффективно
Используя <audio> воспроизвести звук можно с помощью метода play().
!!! повторный вызов, до завершения предыдущего, будет проигнорирован, поэтому нужен метод перезагрузки -- load()
!? из-за защиты в браузере, без инициации воспроизведения пользователем, семплы не будут воспроизводиться
TODO необходимо переделать на вывод по каналам, и цикличное воспроизведение
Слежение за вводом можно осуществить с помощью запоминания событий от контроллов в ассоциативном массиве -- input[{ctr:va}l]. Проверка состояния -- проверка значения соответствующего контролла -- input[ctr].
!!! Подробнее в (framework/controllers)
Для инициализации фрема задаются размеры канвы, отслеживаемые контроллы. При инициализации создается <canvas> заданного размера и устанавливаются обработчики на нужные события -- addEventListener(event, handler()). После инициализации
TODO в дальнейшем добавить инициализацию звуковых каналов
Для проверки сделаем демку -- вывод изображения со звуком.
<html> <head> <meta charset="utf-8"> <script type="text/javascript"> const WIDTH = 640; const HEIGHT = 480; var gp_Inputs = { }; function gp_input(ctr, val){ if(gp_Inputs[ctr] !== undefined){ gp_Inputs[ctr] = val; } } var gp_CanvasContex; function gp_draw(image, x, y){ gp_CanvasContex.drawImage(image, x, y); } function gp_clear(){ gp_CanvasContex.clearRect(0,0,WIDTH, HEIGHT); } function gp_play(sound){ sound.load(); sound.play(); } function gp_init(){ var gp = document.getElementById("gamePanel"); //init event listeners var canvas = document.createElement("canvas"); canvas.id = "gameCanvas"; canvas.width = WIDTH; canvas.height = HEIGHT; canvas.style="background-color:black;"; gp.appendChild(canvas); gp_CanvasContex = canvas.getContext('2d'); } function main(){ gp_init(); //resource load document.getElementById('snd1').load(); gp_clear(); var x=10,y=10; window.setInterval(()=>{ gp_draw(document.getElementById('img1'),x,y); gp_play(document.getElementById('snd1')); x+=10;y+=10; if(x > WIDTH || y > HEIGHT){ gp_clear(); x=10;y=10; } },1000); } </script> </head> <body> <button onclick="main();">start</button> <div class="gamepanel" id="gamePanel"> <img id="img1" style="display:none;" src="http://vt.chuvsu.ru/misc/favicon.ico"> <audio id="snd1" src="http://www.sounds.beachware.com/2illionzayp3may/ovbzl/PIECES.mp3"></audio> </div> </body> </html>
TODO оформить в виде модуля
TODO отделить вывод изображений, звуков, инициализация ресурсов