Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Сегодняшний пост посвящен той же теме .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;
}
}
}
}
Это просто другой пример создания аппаратной части, которую можно закодировать, или кода, для которого можно построить аппаратную часть. Все это можно сделать просто, быстро и с большим удовольствием, чем вы это себе представляете.