![]() |
|
||||||||||
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Есть старый бок, что из-за особенностей строения клавиатуры на PC, если зажаты одновременно много (минимум 4, что-ли) клавиш, то есть нерешаемые проблемы с тем, чтобы узнать, какие именно и какие зажимаются ещё. Потому в мортал 4-й на пейси без джойстика нормально не порубиться =\ Но вродь с этими клавишами всё нормально работает.
Код в общем ничего, разве что если нажать что-то типа влево и вправо одновременно, то не напишет что надо. Что не так - не понятно. Если нажимали "влево, вниз, вверх" и не написался upPress, то не знаю, не смог воспроизвести. 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; } } }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Там нет никах проблем. Посмотрите
http://www.murmadillo.tut.su/html/co...n-attempt.html Если накидаете много графики или сложные коллизии, то игруля начнет загружать проц на 100%, а это значит что ей надо еще больше, тк. проц же нельзя загрузить на 120 процентов к примеру, поэтому начнется проблемы с кадрами, а клава шлет события нормально, от этого получается не мгновенный отклик (бывают ситуации когда операционочка выделяет файл подкачки для плеера, когда игра использует много графики, этот файл образуется при нехватке оперативной памяти, и периодически файл как-бы разгружается и игра затормаживается не секунд 10-30), при тестировании игры попробуйте на старом компьютере добится загруза процессора не больше 90%.
__________________
Гоночка |
|
|||||
|
Регистрация: Mar 2009
Адрес: Kazakhstan, Almaty
Сообщений: 121
|
Вот решение:
// эти 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+%
__________________
заткнись и делай |
|
|||||
|
Цитата:
И вот спустя 24 часа с красными глазами и не полностью функционированием мозга я пришёл к такому решению, сделать всё это за счёт скорости. Типа как "Мук" пишет "Анимация построенная на скорости" Вот теперь появилась другая проблема, как это реализовать? Вот собственно и сама идея: Есть объект на сцене (Box), заставляю его вдвигаться по оси "y" с интервалом установленным в "Timer" т.е. сам таймер и сдвигает объект по оси "y". Чего добиться хочу я: нажали клавишу, "Вох" рванул с интервалом в "20" после, интервал медленно увеличивается до "100" что и заставляет объект плавно снижать скорость. Естественно если достигли нужного нам интервала, выключаем "таймер" или попросту перестаём сдвигать объект. Т.е. я так понял что моя проблема была не в отклике клавиш а в плавности объекта. Если кто знаком с таким методом, может поделитесь, а то я себе уже всю голову взорвал. Добавлю, пока скорость объекта плавно достигает нуля, у нас как раз остаётся время на обработку следующих событий. Есть ещё вопрос, если кто делал игры основаны на скорости: Какое количество кадров вы выставляете или обновляете экран после каждого действия? Добавлено через 8 минут Цитата:
НАРОД!!! ПРОШУ, НЕ ОСТАВЛЯЙТЕ ЭТУ ТЕМУ!! Очень важно её правильное решение, это будет полезно всем! Добавлено через 39 минут Вот привожу малость от своей идеи. При нажатие на "stage" указателем мыши объект ускоряется. Помогите додумать плавное поведение объекта. Не отрицаю, ещё немного и я сам додумаю, просто уже на столько измотался, ппц. Игра уже почти готова, а мозгов не осталось. 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; } } } } } Придумал вот такую вставку, а вот как правильно её использовать? эх... Последний раз редактировалось stweet; 12.09.2010 в 19:50. |
|
|||||
|
Чет не понятно, вы сами себе противоречите, вам надо мнгновенный отклик и плавное поведение объекта, не парьте себе мозг, вам прямая дорога на jiglibflash, в гугл, ребята все уже закодили и дали примеры, вот в свою гоночку, что в подписи, вставил эти классы, ниче так, однако нафик ни кому не нужно, не заработал ни копейки на этом.
__________________
Гоночка |
|
|||||
|
так я же не к копеечкам стремлюсь а к познанию языка или этот форум не в образовательных целях сделан?
Я хочу сделать тот же велосипед но своими руками! А ездить на нём не зная как он устроен, на фиг. Да, в инете Adobe-вских кривых решений море. А по девелопу 0. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:49. |
|
|
« Предыдущая тема | Следующая тема » |
|
|