Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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;
}

Старый 15.06.2014, 00:56
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 2  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Если я начинаю управлять кораблём, зажимаю кнопки вперёд(стрелка)+поворот в право(стрелка)+огонь (пробел), то всё нормально, а вот если зажимаю вперёд+поворот влево+огонь, то корабль продолжает летать, но не стреляет, либо летит, стреляет, но не поворачивает
Это не ваша ошибка, это проблема клавиатуры. Я такое в своих играх тоже замечал, что сочетания стрелок + другие кнопки корректно не работают, но такое не на всех компах. В качестве решения могу вам предложить перенести управление со стрелок на WASD, тогда такой проблемы не будет.

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

Старый 15.06.2014, 02:50
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

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

Старый 15.06.2014, 03:53
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Я до сих пор не понимаю, как в 21 веке создают игры в кадрах... это кощунство
__________________
Марк Tween

Старый 15.06.2014, 03:56
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 5  
Ответить с цитированием
neonoviiwolf

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

Добавлено через 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й объект, который добавится у нас на сцену.

Старый 15.06.2014, 18:13
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 6  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Шта у тебя там вообще за херня, каждый раз надо создавать новую ссылку на пулю и новый экземпляр. Либо все пули хранить в контейнере, либо в массиве. И ваще это лучше всё делать в функции, например:

Код 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 минуты
Цитата:
какие-то ссылки отвязать нужно. Хотелось бы разобрать, а не тупо на угад подставлять значения в чужой код
Там скорее всего написано, что при удалении объекта нужно обнулить на него ссылку, это не обязательно делать.
__________________
Я заклинаю вас действовать иначе.


Последний раз редактировалось Bletraut; 22.06.2014 в 20:08.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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