Уползай с аркадной консолью .NET Gadgeteer и игрой «Змейка»
Сегодняшний пост посвящен той же теме .Net Gadgeteer, о которой шла речь совсем недавно, я это знаю. Через неделю я покопаюсь в своем архиве историй и найду что-то другое, но будучи дитём 80-х, я не могу сопротивляться этому проекту. Я всегда хотел иметь собственную аркадную консоль, хотя бы это и не было Астероидами или PacMan. Факт того, что ты сам сделал электронику и закодировал ее «с нуля» всегда делает ее лучше… (да…почти ).
Аркадная консоль на .NET Gadgeteer
Оживи дни классических аркадных игр с вычурной миниатюрной самодельной консолью. Она оснащена сенсорным экраном, джойстиком и портом Ethernet для многопользовательского режима! Отдай дань любимым классическим играм или изобрети собственную!
Аркадная консоль реализует видеоигру «Змейка». Есть множество версий этой игры. В этой используются модуль дисплея .NET Gadgeteer Display T35 и таймер для отображения змеи и кусочков пищи и для ее передвижения по экрану. Джойстик посылает команды управления движением змеи. Цель игры – собирать куски пищи, которые способствуют росту змеи.
Код консоли демонстрирует возможности модуля дисплея T35, классов .NET Gadgeteer WPF Window и .NET Micro Framework Canvas. Реализация классов GameEngine, GameCanvas и Sprite иллюстрирует использование растровых ресурсов и прорисовку холста. Во время игры работают два таймера. По одному из них случайным образом появляются кусочки пищи, а по другому осуществляется движение змеи, задаваемое пользователем с джойстика. Математические классы используются для расчета спрайтов.
Программа, написанная на C#, работает на плате GHI Electronics Fez Spider, питаемой модулем двойного питания, который можно использовать вместе с аккумулятором или USB-портом. Первоначально разъем USB должен быть подсоединен, чтобы развернуть сборки на плате. Модуль Ethernet включен для поддержки многопользовательского режима игры.
Код для игры MicroSnake: MicroSnake.zip
Выкройка для корпуса (в формате Ponoko): Arcade_Cabinet_Enclosure.zip
https://www.youtube.com/watch?v=pscenYHbOJ8&feature=player_detailpage
Фрагмент дизайна аппаратуры:
И кусок кода:
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;
using Microsoft.SPOT.Touch;
using Gadgeteer.Networking;
using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using Gadgeteer.GameEngine;
using Gadgeteer.Modules.GHIElectronics;
namespace MicroSnake
{
public partial class Program
{
const int GAME_GRID_SIZE = 20;
Window mainWindow;
GameEngine gameEngine;
Gadgeteer.Timer drawTimer;
Gadgeteer.Timer inputTimer;
Sprite food = new Sprite(Resources.GetBitmap(Resources.BitmapResources.Food_20x20), 160, 200, true);
SpriteCollection snake = new SpriteCollection();
Bitmap snakeBitmap = Resources.GetBitmap(Resources.BitmapResources.SnakeBlueBody_20x20);
void ProgramStarted()
{
// Initialize event handlers here.
// e.g. button.ButtonPressed += new GTM.MSRC.Button.ButtonEventHandler(button_ButtonPressed);
mainWindow = display.WPFWindow;
gameEngine = new GameEngine(mainWindow);
drawTimer = new GT.Timer(new TimeSpan(0, 0, 0, 0, 400));
drawTimer.Tick += new GT.Timer.TickEventHandler(drawTimer_Tick);
inputTimer = new GT.Timer(new TimeSpan(0, 0, 0, 0, 100));
inputTimer.Tick += new GT.Timer.TickEventHandler(inputTimer_Tick);
CurrentDirection = Direction.Right;
SetupGame();
inputTimer.Start();
drawTimer.Start();
// Do one-time tasks here
Debug.Print("Program Started");
}
void inputTimer_Tick(GT.Timer timer)
{
GTM.GHIElectronics.Joystick.Position jPos = joystick.GetJoystickPostion();
if (0.3 < jPos.Y && jPos.Y < 0.7)
{
if (jPos.X > 0.8)
{
if (CurrentDirection != Direction.Left)
{
CurrentDirection = Direction.Right;
}
}
else if (jPos.X < 0.2)
{
if (CurrentDirection != Direction.Right)
{
CurrentDirection = Direction.Left;
}
}
}
if (0.3 < jPos.X && jPos.X < 0.7)
{
if (jPos.Y > 0.8)
{
if (CurrentDirection != Direction.Down)
{
CurrentDirection = Direction.Up;
}
}
else if (jPos.Y < 0.2)
{
if (CurrentDirection != Direction.Up)
{
CurrentDirection = Direction.Down;
}
}
}
}
Это просто другой пример создания аппаратной части, которую можно закодировать, или кода, для которого можно построить аппаратную часть. Все это можно сделать просто, быстро и с большим удовольствием, чем вы это себе представляете.