Показать сообщение отдельно
Старый 14.06.2014, 18:55
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 1  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
По умолчанию обработка 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;
}