Уползай с аркадной консолью .NET Gadgeteer и игрой «Змейка»

Грэг Дункан

Сегодняшний пост посвящен той же теме .Net Gadgeteer, о которой шла речь совсем недавно, я это знаю. Через неделю я покопаюсь в своем архиве историй и найду что-то другое, но будучи дитём 80-х, я не могу сопротивляться этому проекту. Я всегда хотел иметь собственную аркадную консоль, хотя бы это и не было Астероидами или PacMan. Факт того, что ты сам сделал электронику и закодировал ее «с нуля» всегда делает ее лучше… (да…почти clip_image002).

Аркадная консоль на .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

Фрагмент дизайна аппаратуры:

clip_image004

И кусок кода:

 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;
                    }
                }
            }
        }

Это просто другой пример создания аппаратной части, которую можно закодировать, или кода, для которого можно построить аппаратную часть. Все это можно сделать просто, быстро и с большим удовольствием, чем вы это себе представляете.