![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Добрый день, я начинающий флешер, прошу сильно не пинать, а просто ткнуть в ошибку или решение. Вопрос собственно в чём, пишу небольшую игру, летает кораблик, стреляет. Всё далеко от завершения, но не могу решить одну проблему, управление полностью с клавиатуры. Если я начинаю управлять кораблём, зажимаю кнопки вперёд(стрелка)+поворот в право(стрелка)+огонь (пробел), то всё нормально, а вот если зажимаю вперёд+поворот влево+огонь, то корабль продолжает летать, но не стреляет, либо летит, стреляет, но не поворачивает, в общем обрабатывает только два события из трёх. При этом в колонках слышен звук, повествующий о том, что зажато много клавиш. Код ниже, пишу в одном кадре:
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; } |
|
|||||
|
Цитата:
Добавлено через 2 минуты Зато будет работать вверх+вправо+кнопка, влево+вниз+кнопка. А вот вправо+вниз+кнопка или влево+вверх+кнопка работать уже будет не правильно, но бывает по разному либо так, либо так не работает.
__________________
Я заклинаю вас действовать иначе. |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Спасибо, значит я делал почти всё правильно. Тест в итоге простой, зажимаем интересующие нас сочетание клавишь, если писка из колонок нет - будет работать, я уже нашёл сочетание из 6-ти зажатых клавишь
|
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
в первый раз что-то пишу на экшене, мне бы вообще хоть что-то правильно написать, для себя, ради удобства, просто создаю слои, где работаю с кодом для каждого объекта
Добавлено через 27 минут Ещё вопрос, а то опять 1-2 дня протуплю. Кораблик стреляет при нажатии клавиши, у меня появляется только один снаряд, при повторном нажатии первый исчезает, появляется новый. Как размножить мувиклип, что бы появлялся для каждого нажатия свой снаряд, при этом нужно оставить возможность работать с ним, т.е. хиттест например. Решение загуглил, но не понимаю логику, какие-то ссылки отвязать нужно. Хотелось бы разобрать, а не тупо на угад подставлять значения в чужой код код ниже взят со стороннего сайта var _mc:YouObject = new YouObject();//создали объект addChild(_mc);//добавили его на сцену addChild(_mc);//опять его добавили на сцену, объектов больше не стало, т.к. больше объектов мы не создавали _mc = new YouObject();//создали еще один экземпляр, при этом _mc - ссылка уже на новый экземпляр addChild(_mc);//добавили новый экземпляр на сцену new YouObject();//создали еще один экземпляр без сохранения ссылки на него - он будет автоматически уничтожен сразу после того, как закончит работу метод, где он был создан, т.к. на него не осталось никаких ссылок (на самый 1й объект ссылка остается, т.к. он находится на сцене, т.е. "сцена знает") addChild(new YouObject());//помещаем объект на сцену без сохранения на него ссылок, т.е. ссылка есть, но она не является созданной нами переменной - это 3й объект, который добавится у нас на сцену. |
|
|||||
|
Шта у тебя там вообще за херня, каждый раз надо создавать новую ссылку на пулю и новый экземпляр. Либо все пули хранить в контейнере, либо в массиве. И ваще это лучше всё делать в функции, например:
private function fire():void { var bull:Bullet = new Bullet(); bull.x = player.x; bull.y = player.y; bulletsContainer.addChild(bull); // или bulletsArr.push(bull); } //для контейнера 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]; // твоя пуля } Цитата:
__________________
Я заклинаю вас действовать иначе. Последний раз редактировалось Bletraut; 22.06.2014 в 20:08. |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:43. |
|
|
« Предыдущая тема | Следующая тема » |
|
|