Программируем игры на XNA и MonoGame для Windows 8. Часть 5. Управление.

С выходом новой версии MonoGame 3.0.1 информация из статьи могла устареть. Смотрите новые статьи в постах выше.

В этот раз мы будем делать поддержку пользовательского ввода. Причем, поскольку Windows 8 поддерживает различные виды устройств ввода (клавиатура, мыши, касания), мы реализуем поддержку сразу нескольких устройств ввода, а именно клавиатуры, мыши и касаний.

При помощи мыши и касаний мы будем уничтожать астероиды, а кнопка Esc будет переключать режим игры (В Игре/Пауза).

Для тестирования можно будет использовать встроенный в Visual Studio 2012 симулятор, в нем можно симулировать касания.

На самом деле, решить поставленную задачу будет очень легко так как MonoGame реализует уже привычные нам типы MouseState, KeyboardState, TouchPanel и т.д.

Для обработки событий с мыши напишем такой код в методе Update:

            var mouse = Mouse.GetState();

 

            if (mouse.LeftButton == ButtonState.Pressed)

            {

                for (int i = asteroids.Count — 1; i >= 0; i—)

                {

                    var r = asteroids[i].Rect;

                    r.Offset(-r.Width / 2, -r.Height / 2);

                    if (r.Contains(mouse.X, mouse.Y))

                    {

                        asteroids.RemoveAt(i);

                    }

                }

            }

Обработка касаний не отличается от той, к которой мы привыкли на Windows Phone 7:

 

            foreach (var touch in touches)

            {

                if (touch.State == TouchLocationState.Pressed)

                {

                    for (int i = asteroids.Count — 1; i >= 0; i—)

                    {

                        var r = asteroids[i].Rect;

                        r.Offset(-r.Width / 2, -r.Height / 2);

                        if (r.Contains((int)touch.Position.X, (int)touch.Position.Y))

                        {

                            asteroids.RemoveAt(i);

                        }

                    }

                }

            }

Вот так просто мы добавили поддержку мыши и касаний.

Работа с клавиатурой также не изменилась, однако мне придется приложить чуть больше усилий из-за того, что я не хочу, чтобы игрок мог поменять режим игры в Snap виде.

Можно сделать это так:

            var keyState = Keyboard.GetState();

 

            if (keyState.IsKeyDown(Keys.Escape) && !oldState.IsKeyDown(Keys.Escape))

            {

                if (state == EGameState.Game)

                    state = EGameState.Pause;

                else if (state == EGameState.Pause && WindowState._windowState == EWindowState.Full)

                    state = EGameState.Game;

            }

            oldState = keyState;

Весь код метода Update сейчас выглядит так:

        protected override void Update(GameTime gameTime)

        {

            var keyState = Keyboard.GetState();

 

            if (keyState.IsKeyDown(Keys.Escape) && !oldState.IsKeyDown(Keys.Escape))

            {

                if (state == EGameState.Game)

                    state = EGameState.Pause;

                else if (state == EGameState.Pause && WindowState._windowState == EWindowState.Full)

                    state = EGameState.Game;

            }

 

            if (state == EGameState.Game)

            {

 

                // TODO: Add your update logic here

                foreach (var asteroid in asteroids)

                {

                    asteroid.Update(gameTime);

                }

 

                var touches = TouchPanel.GetState();

                var mouse = Mouse.GetState();

 

                if (mouse.LeftButton == ButtonState.Pressed)

                {

                    for (int i = asteroids.Count — 1; i >= 0; i—)

                    {

                        var r = asteroids[i].Rect;

                        r.Offset(-r.Width / 2, -r.Height / 2);

                        if (r.Contains(mouse.X, mouse.Y))

                        {

                            asteroids.RemoveAt(i);

                        }

                    }

                }

 

                foreach (var touch in touches)

                {

                    if (touch.State == TouchLocationState.Pressed)

                    {

                        for (int i = asteroids.Count — 1; i >= 0; i—)

                        {

                            var r = asteroids[i].Rect;

                            r.Offset(-r.Width / 2, -r.Height / 2);

                            if (r.Contains((int)touch.Position.X, (int)touch.Position.Y))

                            {

                                asteroids.RemoveAt(i);

                            }

                        }

                    }

                }

            }

 

            oldState = keyState;

 

            base.Update(gameTime);

        }

В этот раз мы будем делать поддержку пользовательского ввода. Причем, поскольку Windows 8 поддерживает различные виды устройств ввода (клавиатура, мыши, касания), мы реализуем поддержку сразу нескольких устройств ввода, а именно клавиатуры, мыши и касаний.

При помощи мыши и касаний мы будем уничтожать астероиды, а кнопка Esc будет переключать режим игры (В Игре/Пауза).

Для тестирования можно будет использовать встроенный в Visual Studio 2012 симулятор, в нем можно симулировать касания.

На самом деле, решить поставленную задачу будет очень легко так как MonoGame реализует уже привычные нам типы MouseState, KeyboardState, TouchPanel и т.д.

Для обработки событий с мыши напишем такой код в методе Update:

            var mouse = Mouse.GetState();

 

            if (mouse.LeftButton == ButtonState.Pressed)

            {

                for (int i = asteroids.Count — 1; i >= 0; i—)

                {

                    var r = asteroids[i].Rect;

                    r.Offset(-r.Width / 2, -r.Height / 2);

                    if (r.Contains(mouse.X, mouse.Y))

                    {

                        asteroids.RemoveAt(i);

                    }

                }

            }

Обработка касаний не отличается от той, к которой мы привыкли на Windows Phone 7:

 

            foreach (var touch in touches)

            {

                if (touch.State == TouchLocationState.Pressed)

                {

                    for (int i = asteroids.Count — 1; i >= 0; i—)

                    {

                        var r = asteroids[i].Rect;

                        r.Offset(-r.Width / 2, -r.Height / 2);

                        if (r.Contains((int)touch.Position.X, (int)touch.Position.Y))

                        {

                            asteroids.RemoveAt(i);

                        }

                    }

                }

            }

Вот так просто мы добавили поддержку мыши и касаний.

Работа с клавиатурой также не изменилась, однако мне придется приложить чуть больше усилий из-за того, что я не хочу, чтобы игрок мог поменять режим игры в Snap виде.

Можно сделать это так:

            var keyState = Keyboard.GetState();

 

            if (keyState.IsKeyDown(Keys.Escape) && !oldState.IsKeyDown(Keys.Escape))

            {

                if (state == EGameState.Game)

                    state = EGameState.Pause;

                else if (state == EGameState.Pause && WindowState._windowState == EWindowState.Full)

                    state = EGameState.Game;

            }

            oldState = keyState;

Весь код метода Update сейчас выглядит так:

        protected override void Update(GameTime gameTime)

        {

            var keyState = Keyboard.GetState();

 

            if (keyState.IsKeyDown(Keys.Escape) && !oldState.IsKeyDown(Keys.Escape))

            {

                if (state == EGameState.Game)

                    state = EGameState.Pause;

                else if (state == EGameState.Pause && WindowState._windowState == EWindowState.Full)

                    state = EGameState.Game;

            }

 

            if (state == EGameState.Game)

            {

 

                // TODO: Add your update logic here

                foreach (var asteroid in asteroids)

                {

                    asteroid.Update(gameTime);

                }

 

                var touches = TouchPanel.GetState();

                var mouse = Mouse.GetState();

 

                if (mouse.LeftButton == ButtonState.Pressed)

                {

                    for (int i = asteroids.Count — 1; i >= 0; i—)

                    {

                        var r = asteroids[i].Rect;

                        r.Offset(-r.Width / 2, -r.Height / 2);

                        if (r.Contains(mouse.X, mouse.Y))

                        {

                            asteroids.RemoveAt(i);

                        }

                    }

                }

 

                foreach (var touch in touches)

                {

                    if (touch.State == TouchLocationState.Pressed)

                    {

                        for (int i = asteroids.Count — 1; i >= 0; i—)

                        {

                            var r = asteroids[i].Rect;

                            r.Offset(-r.Width / 2, -r.Height / 2);

                            if (r.Contains((int)touch.Position.X, (int)touch.Position.Y))

                            {

                                asteroids.RemoveAt(i);

                            }

                        }

                    }

                }

            }

 

            oldState = keyState;

 

            base.Update(gameTime);

        }

 

Реклама
Запись опубликована в рубрике Компьютерная графика с метками , , , , , , . Добавьте в закладки постоянную ссылку.

3 комментария на «Программируем игры на XNA и MonoGame для Windows 8. Часть 5. Управление.»

  1. Несколько недель назад Keyboard.GetState() и Mouse.GetState() в MonoGame.develop3d ничего не делали совсем, только возвращали заглушечные данные. Уже исправили это безобразие?

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s