Espruino:Примеры/Игра Flappy Bird
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Игра Flappy Bird[1]
Make a portable Flappy Bird game from scratch!
В этом руководстве мы создадим упрощённую версию Flappy Bird (сразу с монитором). Для тех, кто не в курсе – суть этой игры заключается в том, чтобы не дать управляемой вами птичке упасть или врезаться в препятствия.
Более подробное описание процесса смотрите в видео выше.
Нам понадобятся
Или:
- Espruino Pixl.js
Код
Более подробно то, что происходит в коде, рассказывается в видео выше, но если вам нужен лишь код – безо всяких объяснений – то вот он:
Для Espruino Pico и PCD8544
// Для Pico и LCD-дисплея:
A5.write(0); // контакт GND
A7.write(1); // контакт VCC
var BUTTON = B3;
pinMode(BUTTON,"input_pulldown");
var g;
var SPEED = 0.5;
// В Espruino v2.00 изображения можно добавлять вот так:
var BIRDIMG = Graphics.createImage(`
####
# #
# ### #
# # #
# #
####
`);
BIRDIMG.transparent=0;
/* В ранних версиях Espruino нужно было делать вот так:
var BIRDIMG = {
width : 8, height : 8, bpp : 1,
transparent : 0,
buffer : new Uint8Array([
0b00000000,
0b01111000,
0b10000100,
0b10111010,
0b10100100,
0b10000100,
0b01111000,
0b00000000,
]).buffer
};
*/
var birdy, birdvy;
var wasPressed = false;
var running = false;
var barriers;
var score;
function newBarrier(x) {
barriers.push({
x1 : x-5,
x2 : x+5,
y : 10+Math.random()*28,
gap : 8
});
}
function gameStart() {
running = true;
birdy = 48/2;
birdvy = 0;
barriers = [];
for (var i=42;i<g.getWidth();i+=42)
newBarrier(i);
score = 0;
}
function gameStop() {
running = false;
}
function draw() {
var buttonState = BUTTON.read();
g.clear();
if (!running) {
g.drawString("Конец игры!",25,10);
g.drawString("Очки",10,20);
g.drawString(score,10,26);
g.flip();
if (buttonState && !wasPressed)
gameStart();
wasPressed = buttonState;
return;
}
if (buttonState && !wasPressed)
birdvy -= 2;
wasPressed = buttonState;
score++;
birdvy += 0.2;
birdvy *= 0.8;
birdy += birdvy;
if (birdy > g.getHeight())
gameStop();
// Рисуем птицу:
//g.fillRect(0,birdy-3,6,birdy+3);
g.drawImage(BIRDIMG, 0,birdy-4);
// Рисуем препятствия:
barriers.forEach(function(b) {
b.x1-=SPEED;
b.x2-=SPEED;
var btop = b.y-b.gap;
var bbot = b.y+b.gap;
g.drawRect(b.x1+1, -1, b.x2-2, btop-5);
g.drawRect(b.x1, btop-5, b.x2, btop);
g.drawRect(b.x1, bbot, b.x2, bbot+5);
g.drawRect(b.x1+1, bbot+5, b.x2-1, g.getHeight());
if (b.x1<6 && (birdy-3<btop || birdy+3>bbot))
gameStop();
});
while (barriers.length && barriers[0].x2<=0) {
barriers.shift();
newBarrier(g.getWidth());
}
g.flip();
}
// Для Pico и LCD-дисплея:
function onInit() {
// Настраиваем SPI:
var spi = new SPI();
spi.setup({ sck:B1, mosi:B10 });
// Инициализируем LCD-дисплей:
g = require("PCD8544").connect(spi,B13,B14,B15, function() {
//g.setContrast(0.43);
gameStart();
setInterval(draw, 50);
});
}
// Наконец, запускаем игру:
onInit();
Для Pixl.js
var BUTTON = BTN1;
var SPEED = 0.5;
var BIRDIMG = {
width : 8, height : 8, bpp : 1,
transparent : 0,
buffer : new Uint8Array([
0b00000000,
0b01111000,
0b10000100,
0b10111010,
0b10100100,
0b10000100,
0b01111000,
0b00000000,
]).buffer
};
var birdy, birdvy;
var wasPressed = false;
var running = false;
var barriers;
var score;
function newBarrier(x) {
barriers.push({
x1 : x-5,
x2 : x+5,
y : 10+Math.random()*28,
gap : 8
});
}
function gameStart() {
running = true;
birdy = 48/2;
birdvy = 0;
barriers = [];
for (var i=42;i<g.getWidth();i+=42)
newBarrier(i);
score = 0;
}
function gameStop() {
running = false;
}
function draw() {
var buttonState = BUTTON.read();
g.clear();
if (!running) {
g.drawString("Конец игры!",25,10);
g.drawString("Очки",10,20);
g.drawString(score,10,26);
g.flip();
if (buttonState && !wasPressed)
gameStart();
wasPressed = buttonState;
return;
}
if (buttonState && !wasPressed)
birdvy -= 2;
wasPressed = buttonState;
score++;
birdvy += 0.2;
birdvy *= 0.8;
birdy += birdvy;
if (birdy > g.getHeight())
gameStop();
// Рисуем птицу:
//g.fillRect(0,birdy-3,6,birdy+3);
g.drawImage(BIRDIMG, 0,birdy-4);
// Рисуем препятствия:
barriers.forEach(function(b) {
b.x1-=SPEED;
b.x2-=SPEED;
var btop = b.y-b.gap;
var bbot = b.y+b.gap;
g.drawRect(b.x1+1, -1, b.x2-2, btop-5);
g.drawRect(b.x1, btop-5, b.x2, btop);
g.drawRect(b.x1, bbot, b.x2, bbot+5);
g.drawRect(b.x1+1, bbot+5, b.x2-1, g.getHeight());
if (b.x1<6 && (birdy-3<btop || birdy+3>bbot))
gameStop();
});
while (barriers.length && barriers[0].x2<=0) {
barriers.shift();
newBarrier(g.getWidth());
}
g.flip();
}
function onInit() {
gameStart();
setInterval(draw, 50);
}
// Наконец, запускаем игру:
onInit();
См.также
Внешние ссылки