Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   обработка 3-х и более зажатых клавиш (http://www.flasher.ru/forum/showthread.php?t=208191)

neonoviiwolf 14.06.2014 18:55

обработка 3-х и более зажатых клавиш
 
Добрый день, я начинающий флешер, прошу сильно не пинать, а просто ткнуть в ошибку или решение. Вопрос собственно в чём, пишу небольшую игру, летает кораблик, стреляет. Всё далеко от завершения, но не могу решить одну проблему, управление полностью с клавиатуры. Если я начинаю управлять кораблём, зажимаю кнопки вперёд(стрелка)+поворот в право(стрелка)+огонь (пробел), то всё нормально, а вот если зажимаю вперёд+поворот влево+огонь, то корабль продолжает летать, но не стреляет, либо летит, стреляет, но не поворачивает, в общем обрабатывает только два события из трёх. При этом в колонках слышен звук, повествующий о том, что зажато много клавиш. Код ниже, пишу в одном кадре:

Код AS3:

AS 3.0
 
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.events.Event;
 
 
var ship: gl_ship = new gl_ship();
var strbtn: LibrarySymbol = new LibrarySymbol();
addChild(strbtn);//кнопка старта
strbtn.x = 800;
strbtn.y = 450;
strbtn.addEventListener(MouseEvent.CLICK, clickbtn);
function clickbtn(e: MouseEvent): void
{
        removeChild(strbtn);
        addChild(ship);
        ship.x = 800;
        ship.y = 450;
        ship.width = 100;
        ship.height = 90;
}
 
var upPressed: Boolean = false;
var downPressed: Boolean = false;
var leftPressed: Boolean = false;
var rightPressed: Boolean = false;
//управление кораблём
ship.rotation = 0;
var a: Number = 0.8; //ускорение
var s: Number = 0.7 //замедление
var radians: Number = ship.rotation * Math.PI / 180;
var vectorX: Number = 0;
var vectorY: Number = 0;
var speed: Number = 4;
 
ship.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);
function fl_MoveInDirectionOfKey(event: Event)
{
        if (ship.x > 1597)
        {
                ship.x = 3;
        }
        if (ship.x < 3)
        {
                ship.x = 1597;
        }
        if (ship.y > 897)
        {
                ship.y = 3;
        }
        if (ship.y < 3)
        {
                ship.y = 897;
        }
        if (rightPressed)
        {
                ship.rotation += 8;
        }
        if (leftPressed)
        {
                ship.rotation -= 8;
        }
        if (upPressed)
        {
                if (a <= 2)
                {
                        a+=0.2;
                }
                radians = ship.rotation * Math.PI / 180;
                vectorX = Math.cos(radians);
                vectorY = Math.sin(radians);
                ship.x -= speed * vectorX * a;
                ship.y -= speed * vectorY * a;
 
        }
}
function fl_SetKeyPressed(event: KeyboardEvent): void
{
        switch (event.keyCode)
        {
                case Keyboard.UP:
                        {
                                upPressed = true;
                                break;
                        }
                case Keyboard.LEFT:
                        {
                                leftPressed = true;
                                break;
                        }
                case Keyboard.RIGHT:
                        {
                                rightPressed = true;
                                break;
                        }
                case (event.keyCode = 32):
                        {
                                fireBoolean = true;
                        }
        }
}
 
function fl_UnsetKeyPressed(event: KeyboardEvent): void
{
        switch (event.keyCode)
        {
                case Keyboard.UP:
                        {
                                upPressed = false;
                                break;
                        }
                case Keyboard.LEFT:
                        {
                                leftPressed = false;
                                break;
                        }
                case Keyboard.RIGHT:
                        {
                                rightPressed = false;
                                break;
                        }
                case (event.keyCode = 32):
                        {
                                fireBoolean = false;
                                break;
                        }
        }
 
}
var fireBoolean: Boolean = false;
var bollF: boll_ms = new boll_ms();// снаряд
var speedboll: Number = 35;
 
 
var radiansBoll: Number = bollF.rotation * Math.PI / 180;
var vectorBollX: Number = Math.cos(radiansBoll);
var vectorBollY: Number = Math.sin(radiansBoll);
bollF.rotation = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_fire);
function fn_fire(e: KeyboardEvent): void
{
        if (fireBoolean)
        //if (e.keyCode == 32)
        {
                addChild(bollF);
                bollF.rotation = ship.rotation;
                radiansBoll = bollF.rotation * Math.PI / 180;
 
                vectorBollX = Math.cos(radiansBoll);
                vectorBollY = Math.sin(radiansBoll);
                bollF.x = ship.x;
                bollF.y = ship.y;
        }
        trace(e.keyCode);
}
bollF.addEventListener(Event.ENTER_FRAME, boll_action);
function boll_action(e: Event):void
{
        bollF.x -= speedboll * vectorBollX;
        bollF.y -= speedboll * vectorBollY;
}


Bletraut 15.06.2014 00:56

Цитата:

Если я начинаю управлять кораблём, зажимаю кнопки вперёд(стрелка)+поворот в право(стрелка)+огонь (пробел), то всё нормально, а вот если зажимаю вперёд+поворот влево+огонь, то корабль продолжает летать, но не стреляет, либо летит, стреляет, но не поворачивает
Это не ваша ошибка, это проблема клавиатуры. Я такое в своих играх тоже замечал, что сочетания стрелок + другие кнопки корректно не работают, но такое не на всех компах. В качестве решения могу вам предложить перенести управление со стрелок на WASD, тогда такой проблемы не будет.

Добавлено через 2 минуты
Зато будет работать вверх+вправо+кнопка, влево+вниз+кнопка. А вот вправо+вниз+кнопка или влево+вверх+кнопка работать уже будет не правильно, но бывает по разному либо так, либо так не работает.

neonoviiwolf 15.06.2014 02:50

Спасибо, значит я делал почти всё правильно. Тест в итоге простой, зажимаем интересующие нас сочетание клавишь, если писка из колонок нет - будет работать, я уже нашёл сочетание из 6-ти зажатых клавишь

in4core 15.06.2014 03:53

Я до сих пор не понимаю, как в 21 веке создают игры в кадрах... это кощунство

neonoviiwolf 15.06.2014 03:56

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

Добавлено через 27 минут
Ещё вопрос, а то опять 1-2 дня протуплю. Кораблик стреляет при нажатии клавиши, у меня появляется только один снаряд, при повторном нажатии первый исчезает, появляется новый. Как размножить мувиклип, что бы появлялся для каждого нажатия свой снаряд, при этом нужно оставить возможность работать с ним, т.е. хиттест например. Решение загуглил, но не понимаю логику, какие-то ссылки отвязать нужно. Хотелось бы разобрать, а не тупо на угад подставлять значения в чужой код

код ниже взят со стороннего сайта
Код AS3:

var _mc:YouObject = new YouObject();//создали объект
addChild(_mc);//добавили его на сцену
addChild(_mc);//опять его добавили на сцену, объектов больше не стало, т.к. больше объектов мы не создавали
_mc = new YouObject();//создали еще один экземпляр, при этом _mc - ссылка уже на новый экземпляр
addChild(_mc);//добавили новый экземпляр на сцену
new YouObject();//создали еще один экземпляр без сохранения ссылки на него - он будет автоматически уничтожен сразу после того, как закончит работу метод, где он был создан, т.к. на него не осталось никаких ссылок (на самый 1й объект ссылка остается, т.к. он находится на сцене, т.е. "сцена знает")
addChild(new YouObject());//помещаем объект на сцену без сохранения на него ссылок, т.е. ссылка есть, но она не является созданной нами переменной - это 3й объект, который добавится у нас на сцену.


Bletraut 15.06.2014 18:13

Шта у тебя там вообще за херня, каждый раз надо создавать новую ссылку на пулю и новый экземпляр. Либо все пули хранить в контейнере, либо в массиве. И ваще это лучше всё делать в функции, например:

Код AS3:

private function fire():void
{
var bull:Bullet = new Bullet();
bull.x = player.x;
bull.y = player.y;
bulletsContainer.addChild(bull); // или bulletsArr.push(bull);
}

Затем перебираем пули:
Код AS3:

//для контейнера
var i:int = bulletsContainer.length;
while(i--)
{
var j:Bullet = bulletsContiner.getChildAt(i) as Bullet; // твоя пуля
}
 
//для массива
var i:int = bulletsArr.length;
while(i--)
{
var j:Bullet = bulletsArr[i]; // твоя пуля
}

Добавлено через 2 минуты
Цитата:

какие-то ссылки отвязать нужно. Хотелось бы разобрать, а не тупо на угад подставлять значения в чужой код
Там скорее всего написано, что при удалении объекта нужно обнулить на него ссылку, это не обязательно делать.


Часовой пояс GMT +4, время: 02:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.