content( flash, ios, …rest );

FlashPunk. 3.События клавиатуры и мыши.

Привет!

В этом уроке мы узнаем как помочь игровым объектам узнавать о нажатии клавиш. Надеюсь , что вы прочитали предыдущие уроки, и знаете как создать мир и добавить в него объекты. Поехали.

  1. Простое отслеживание нажатий.
    Самый простой и быстрый путь — использование классов Input и Key библиотеки FlashPunk. Посмотрите пример:

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.utils.Input;
    	import net.flashpunk.utils.Key;
    
    	public class MyEntity extends Entity
    	{
    		public function MyEntity()
    		{
    
    		}
    
    		override public function update():void
    		{
    			if (Input.check(Key.SPACE))
    			{
    				// Клавиша ПРОБЕЛ находится в нажатом состоянии.
    			}
    
    			if (Input.check(Key.RIGHT))
    			{
    				// Стрелка ВПРАВО находится в нажатом состоянии.
    			}
    
    			if (Input.check(Key.G))
    			{
    				// Клавиша с буквой G находится в нажатом состоянии
                }
    		}
    	}
    }

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

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.utils.Input;
    	import net.flashpunk.utils.Key;
    
    	public class MyEntity extends Entity
    	{
    		public function MyEntity()
    		{
    
    		}
    
    		override public function update():void
    		{
    			if (Input.check(Key.LEFT))
    			{
    				x -= 5;
    			}
    
    			if (Input.check(Key.RIGHT))
    			{
    				x += 5;
    			}
    
    			if (Input.check(Key.UP))
    			{
    				y -= 5;
    			}
    
    			if (Input.check(Key.DOWN))
    			{
    				y += 5;
    			}
    		}
    	}
    }

    Функция check() класса Input возвращает true, если указанная клавиша нажата.

  2. Специфические состояния клавиш.
    Иногда требуется узнать не только то, что клавиша уже нажата, но и то, когда именно она была нажата или отпущена. Это можно сделать используя функции pressed() и released():

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.utils.Input;
    	import net.flashpunk.utils.Key;
    
    	public class MyEntity extends Entity
    	{
    		public function MyEntity()
    		{
    
    		}
    
    		override public function update():void
    		{
    			if (Input.pressed(Key.SPACE))
    			{
    				// Клавиша ПРОБЕЛ была нажата в ТЕКУЩЕМ кадре.
    			}
    
    			if (Input.released(Key.SPACE))
    			{
    				// Клавиша ПРОБЕЛ была отпущена в ТЕКУЩЕМ кадре.
    			}
    		}
    	}
    }

    Функция pressed() вернет значение true, если данная клавиша была нажата в текущем кадре. Соответственно и функция released(). Например, в текущем кадре была нажата клавиша ПРОБЕЛ и тогда в текущем кадре функция pressed() вернет true, но уже в следующем кадре состояние клавиши ПРОБЕЛ изменится с «pressed» на «held», соответственно pressed() вернет false.

  3. Назначение клавиш.
    Возможность задать одну и ту же реакцию нескольким клавишам бывает полезна, ведь гораздо лучше иметь возможность управлять и стрелками и WASD, вместо чего-то одного, ведь у всех игроков разные предпочтения к управлению. FlashPunk предоставляет нам хорошую возможность привязать к разным клавишам одну и ту же функциональность:

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.utils.Input;
    	import net.flashpunk.utils.Key;
    
    	public class MyEntity extends Entity
    	{
    		public function MyEntity()
    		{
    			Input.define("Jump", Key.Z, Key.UP);
    			Input.define("Shoot", Key.SPACE, Key.X, Key.C);
    		}
    
    		override public function update():void
    		{
    			if (Input.pressed("Jump"))
    			{
    				// Одна или несколько клавиш, привязанных к "Jump" были нажаты в ТЕКУЩЕМ кадре.
    			}
    
    			if (Input.check("Shoot"))
    			{
    				// Одна или несколько клавиш, привязанных к "Shoot" были нажаты в ТЕКУЩЕМ кадре.
    			}
    		}
    	}
    }

    Функции класса Input — check(), pressed() и released() могут принимать как значение класса Key, так и назначенные имена.

  4. События мыши.
    Также как мы определяли состояние клавиатуры, мы можем определить состояние мыши.

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.utils.Input;
    
    	public class MyEntity extends Entity
    	{
    		public function MyEntity()
    		{
    
    		}
    
    		override public function update():void
    		{
    			if (Input.mouseDown)
    			{
    				// Кнопка мыши находится в нажатом состоянии в ТЕКУЩЕМ кадре.
    			}
    
    			if (Input.mousePressed)
    			{
    				// Кнопка мыши была нажата в ТЕКУЩЕМ кадре.
    			}
    
    			if (Input.mouseReleased)
    			{
    				// Кнопка мыши была отпущена в ТЕКУЩЕМ кадре.
    			}
    		}
    	}
    }

    Если требуется узнать текущее положение курсора, то это можно сделать очень легко:

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.utils.Input;
    	import net.flashpunk.FP;
    
    	public class MyEntity extends Entity
    	{
    		public function MyEntity()
    		{
    
    		}
    
    		override public function update():void
    		{
    			x = Input.mouseX;
    			y = Input.mouseY;
    
    			x = FP.world.mouseX;
    			y = FP.world.mouseY;
    		}
    	}
    }

    На этом урок окончен, до новых встреч! :-)

This entry was posted in FlashPunk. Bookmark the permalink.

11 Responses to FlashPunk. 3.События клавиатуры и мыши.

  1. farmonol says:

    хороший труд! спасибо

  2. Dan4ez says:

    Подписался на ваш блог, продолжайте в том-же духе! :)
    Давненько уже поглядываю в сторону Flixel, и очень интересно было бы узнать чем FlashPunk лучше?

    • zakhej says:

      Дело в том, что я пока сам разбираюсь с FlashPunk, а с Flixel дела не имел. Сам автор FlashPunk говорит, что если вам по какой-нибудь причине FlashPunk не понравится, то попробуйте Flixel :-)
      На данном этапе я в свободное время (которого мало) перевожу туториалы, но в последующем думаю на примере конкретной игры разобрать пример работы с движком.

      • Dan4ez says:

        Ок. Буду следить с огромным интересом! )

  3. юРИЙ says:

    Внимание вопрос!))
    Сделал всё по данному описанию и вот.. Вобщем для обьекта Entity обработка нажатия кнопки мыши просходит независимо от того где находится курсор. Т.е. даже при щелчке мимо обьекта код после
    if (Input.mouseDown) { …
    все-равно выполняется. Так и должно быть? И как сделать чтобы этого не происходило.
    Спасибо.

    • zakhej says:

      Конечно, так быть не должно.
      Попробуйте сделать ещё раз. У меня таких ситуаций не возникало.

      • Юрий says:

        странь какая-то…
        ниче не меняется((

      • zakhej says:

        Юрий, я тебя может быть не правильно понял в прошлый раз, давай уточним. Input.mouseDown возвращает true когда кнопка мыши нажата, неважно где. Если ты хочешь проверить нажатие на объект, то должен делать примерно так:
        if(Input.mouseDown)
        {
        // Здесь мы должны взять координаты мыши (вроде бы из Inputa, я сейчас к сожалению не помню)
        // и проверить пересекаются ли они с данным объектом
        }
        Примерно так.

  4. Юрий says:

    спасибо)) это как-раз было непонятно!

  5. Rianon says:

    Скажите, а чем в данном примере отличается взятие координат мыши из Input и из FP.world? Т.е. в первом случае они берутся тупо «из-под курсора», а во втором?

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