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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.09.2010, 04:56
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 1  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Есть старый бок, что из-за особенностей строения клавиатуры на PC, если зажаты одновременно много (минимум 4, что-ли) клавиш, то есть нерешаемые проблемы с тем, чтобы узнать, какие именно и какие зажимаются ещё. Потому в мортал 4-й на пейси без джойстика нормально не порубиться =\ Но вродь с этими клавишами всё нормально работает.
Код в общем ничего, разве что если нажать что-то типа влево и вправо одновременно, то не напишет что надо. Что не так - не понятно. Если нажимали "влево, вниз, вверх" и не написался upPress, то не знаю, не смог воспроизвести.
Код AS3:
package {
    import flash.display.*;
    import flash.events.*;
    import flash.ui.*;
 
    public class Main extends Sprite {
 
        private var upPress:Boolean;
        private var leftPress:Boolean;
        private var rightPress:Boolean;
        private var downPress:Boolean;
        private var spacePress:Boolean;
 
        private var keysArr:Array = new Array();
        private var keysDesc:Array = new Array();
 
        public function Main() {
 
            stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDawnListener, false, 0, false);
            stage.addEventListener(KeyboardEvent.KEY_UP, KeyUpListener, false, 0, false);
 
            keysDesc[Keyboard.LEFT] = "leftPress";
            keysDesc[Keyboard.RIGHT] = "rightPress";
            keysDesc[Keyboard.DOWN] = "downPress";
            keysDesc[Keyboard.UP] = "upPress";
            keysDesc[Keyboard.SPACE] = "spacePress";
        }
 
        private function KeyDawnListener (e:KeyboardEvent):void {
            keysArr[e.keyCode] = true;
            var tracestr:String = "";
            for (var key:String in keysArr) {
                if (keysArr[key]) tracestr += keysDesc[key] + " ";
            }
            trace(tracestr);
        }
 
        private function KeyUpListener(e:KeyboardEvent):void {
            keysArr[e.keyCode] = false;
        }
    }
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 12.09.2010, 10:11
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 2  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Там нет никах проблем. Посмотрите
http://www.murmadillo.tut.su/html/co...n-attempt.html
Если накидаете много графики или сложные коллизии, то игруля начнет загружать проц на 100%, а это значит что ей надо еще больше, тк. проц же нельзя загрузить на 120 процентов к примеру, поэтому начнется проблемы с кадрами, а клава шлет события нормально, от этого получается не мгновенный отклик (бывают ситуации когда операционочка выделяет файл подкачки для плеера, когда игра использует много графики, этот файл образуется при нехватке оперативной памяти, и периодически файл как-бы разгружается и игра затормаживается не секунд 10-30), при тестировании игры попробуйте на старом компьютере добится загруза процессора не больше 90%.
__________________
Гоночка

Старый 12.09.2010, 10:39
gr_crd вне форума Посмотреть профиль Отправить личное сообщение для gr_crd Посетить домашнюю страницу gr_crd Найти все сообщения от gr_crd
  № 3  
Ответить с цитированием
gr_crd
 
Аватар для gr_crd

Регистрация: Mar 2009
Адрес: Kazakhstan, Almaty
Сообщений: 121
Вот решение:
Код AS3:
// эти 4 логические переменные укажут, нажата ли сейчас определенная клавиша
// влево, вправо, вверх, вниз
var leftIsDown:Boolean=false;
var rightIsDown:Boolean=false;
var upIsDown:Boolean=false;
var downIsDown:Boolean=false;
 
// три слушателя событий
// когда клавишу нажимают keyDown
// когда клавишу отпускают keyUp
// старый добрый enterFrame
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
stage.addEventListener(Event.ENTER_FRAME, enterFrame);
 
 
// функции keyDown и keyUp установят соответствующие значения логических переменных
// например - нажали клавишу влево - leftIsDown=true; - клавиша влево нажата = true
function keyDown(e:KeyboardEvent):void{
	if(e.keyCode==Keyboard.UP) upIsDown=true;
	if(e.keyCode==Keyboard.DOWN) downIsDown=true;
	if(e.keyCode==Keyboard.LEFT) leftIsDown=true;
	if(e.keyCode==Keyboard.RIGHT) rightIsDown=true;
}
// а когда отпустят leftIsDown=false; - клавиша влево нажата = false
function keyUp(e:KeyboardEvent):void{
	if(e.keyCode==Keyboard.UP) upIsDown=false;
	if(e.keyCode==Keyboard.DOWN) downIsDown=false;
	if(e.keyCode==Keyboard.LEFT) leftIsDown=false;
	if(e.keyCode==Keyboard.RIGHT) rightIsDown=false;
}
 
// а здесь проверяются переменные, если соответствующая клавиша нажата - выполняется действие
function enterFrame(e:Event):void
{
		if(upIsDown)man.y -= 5;
		if(downIsDown)man.y += 5;
		if(leftIsDown)man.x -= 5;
		if(rightIsDown)man.x += 5;
}
Эти логические переменные по сути и есть флаги.
Как пользователь нажал кнопку - ставим - нажато.
Как только отпустил - не нажато.
И при EnterFrame проверяем переменную - если нажато - движение.
И не будет никаких "заиканий", потомучто они возникают только если вешать движение на событие клавиатуры. В вашем коде причина именно в этом, т.к. он не может грузить процессор на 100+%
__________________
заткнись и делай

Старый 12.09.2010, 19:31
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 4  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Цитата:
Сообщение от zurkis Посмотреть сообщение
ты не жди пока тебе ответят, пробуй сам разбираться, а будет ответ тогда и применяй к себе
я так и делаю.

И вот спустя 24 часа с красными глазами и не полностью функционированием мозга я пришёл к такому решению, сделать всё это за счёт скорости. Типа как "Мук" пишет "Анимация построенная на скорости" Вот теперь появилась другая проблема, как это реализовать?

Вот собственно и сама идея:

Есть объект на сцене (Box), заставляю его вдвигаться по оси "y" с интервалом установленным в "Timer" т.е. сам таймер и сдвигает объект по оси "y". Чего добиться хочу я:
нажали клавишу, "Вох" рванул с интервалом в "20" после, интервал медленно увеличивается до "100" что и заставляет объект плавно снижать скорость. Естественно если достигли нужного нам интервала, выключаем "таймер" или попросту перестаём сдвигать объект. Т.е. я так понял что моя проблема была не в отклике клавиш а в плавности объекта. Если кто знаком с таким методом, может поделитесь, а то я себе уже всю голову взорвал.

Добавлю, пока скорость объекта плавно достигает нуля, у нас как раз остаётся время на обработку следующих событий.

Есть ещё вопрос, если кто делал игры основаны на скорости: Какое количество кадров вы выставляете или обновляете экран после каждого действия?

Добавлено через 8 минут
Цитата:
Сообщение от gr_crd Посмотреть сообщение
Вот решение:
Код AS3:
// эти 4 логические переменные укажут, нажата ли сейчас определенная клавиша
// влево, вправо, вверх, вниз
var leftIsDown:Boolean=false;
var rightIsDown:Boolean=false;
var upIsDown:Boolean=false;
var downIsDown:Boolean=false;
 
//.......... .......... ............. ......... 
}
Эти логические переменные по сути и есть флаги.
Как пользователь нажал кнопку - ставим - нажато.
Как только отпустил - не нажато.
И при EnterFrame проверяем переменную - если нажато - движение.
И не будет никаких "заиканий", потомучто они возникают только если вешать движение на событие клавиатуры. В вашем коде причина именно в этом, т.к. он не может грузить процессор на 100+%
По сути я привёл тот же пример, но всё равно спс.


НАРОД!!! ПРОШУ, НЕ ОСТАВЛЯЙТЕ ЭТУ ТЕМУ!! Очень важно её правильное решение, это будет полезно всем!

Добавлено через 39 минут
Вот привожу малость от своей идеи. При нажатие на "stage" указателем мыши объект ускоряется. Помогите додумать плавное поведение объекта. Не отрицаю, ещё немного и я сам додумаю, просто уже на столько измотался, ппц.
Игра уже почти готова, а мозгов не осталось.

Код AS3:
package {
 
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
 
	public class Main extends Sprite {
 
		private var f:int = 100;
		private var n:int = 0;
 
		private var time:Timer;
		private var Box:Sprite;
 
		public function Main() {
 
			time = new Timer(2, 0);
			time.addEventListener(TimerEvent.TIMER, timerBox);
			time.start();
 
			stage.addEventListener(MouseEvent.MOUSE_DOWN, speedBox);
 
			Box = new Sprite();
			Box.graphics.lineStyle(1);
			Box.graphics.beginFill(0x0000ff, 1);
			Box.graphics.drawRect(100, 0, 50, 50);
			addChild(Box);
		}
 
		private function speedBox(e:MouseEvent):int {
			f = f - 10;
			return f;
		}
 
		private function timerBox(e:TimerEvent):void {
 
			n++;
 
			if (n >= f){
				if (Box.y == 150) {
					Box.y = 0;
					n = 0;
				} else {
					Box.y ++;
					n = 0;
				}
			}
		}
	}
}
Добавлено через 47 минут
Придумал вот такую вставку, а вот как правильно её использовать? эх...

Код AS3:
			if (f >= 100) {
				f = 100;
			} else {
				f = f + 5;
			}
 
			return f;


Последний раз редактировалось stweet; 12.09.2010 в 19:50.
Старый 12.09.2010, 22:11
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 5  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Чет не понятно, вы сами себе противоречите, вам надо мнгновенный отклик и плавное поведение объекта, не парьте себе мозг, вам прямая дорога на jiglibflash, в гугл, ребята все уже закодили и дали примеры, вот в свою гоночку, что в подписи, вставил эти классы, ниче так, однако нафик ни кому не нужно, не заработал ни копейки на этом.
__________________
Гоночка

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

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
так я же не к копеечкам стремлюсь а к познанию языка или этот форум не в образовательных целях сделан?

Я хочу сделать тот же велосипед но своими руками! А ездить на нём не зная как он устроен, на фиг. Да, в инете Adobe-вских кривых решений море. А по девелопу 0.

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

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

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


 


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


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