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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.11.2012, 14:00
Shaak вне форума Посмотреть профиль Отправить личное сообщение для Shaak Найти все сообщения от Shaak
  № 1  
Ответить с цитированием
Shaak

Регистрация: Feb 2008
Сообщений: 39
По умолчанию Движение объекта с клавиатуры

Добрый день!
Изучаю флеш и решил создать простенькие гоночки, реализовав движение машинки по вертикали и горизонтали обнаружил, что присутствуют рывки в движении, может кто-то может подсказать как с этим бороться или может у меня какие то непонятные для меня косяки в коде? Скрипт ниже. СВФ вкладываю.
Код AS3:
package src {
	import flash.display.*;
	import flash.events.*;
 
 
	public class Game extends Sprite{			
		//VARS
		public var playerCar:MovieClip;
 
		private var _universe:Universe;		
 
		public function Game() {
			// constructor code
			trace("Game.as initialized")
 
			_universe = new Universe();
			addChild(_universe);
 
			playerCar = new car_mc;
			addChild(playerCar);
			playerCar.x = playerCar.width;
			playerCar.y = App.SCR_H - playerCar.height;
 
			App.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyD);
			App.stage.addEventListener(KeyboardEvent.KEY_UP, keyU);		
		}
		private function keyD(e:KeyboardEvent):void {
 
 
			if (e.keyCode == 38) {
			stopMove()
			playerCar.addEventListener(Event.ENTER_FRAME, movCarTop);			
			}
			if (e.keyCode == 40) {
			stopMove()
			playerCar.addEventListener(Event.ENTER_FRAME, movCarBot);
			}
			if (e.keyCode == 39) {
			stopMove()				
			playerCar.addEventListener(Event.ENTER_FRAME, movCarRight);			
			}
			if (e.keyCode == 37) {
			stopMove()
			playerCar.addEventListener(Event.ENTER_FRAME, movCarLeft);
			}		
			trace(e);			
		}
 
//		playerCar.removeEventListener(Event.ENTER_FRAME, movCarTop);
		private function movCarTop(e:Event):void {			
			playerCar.y -= 3;			
		}		
		private function movCarBot(e:Event):void {						
			playerCar.y += 3;
		}
		private function movCarRight(e:Event):void {						
			playerCar.x += 3;
		}
		private function movCarLeft(e:Event):void {						
			playerCar.x -= 3;
		}
 
 
		private function keyU(e:KeyboardEvent):void {
			trace(e)
 
			if (e.keyCode == 38) {
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarTop);
			}
			if (e.keyCode == 40) {
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarBot);
			}
			if (e.keyCode == 39) {
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarRight);			
			}
			if (e.keyCode == 37) {
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarLeft);
			}				
 
		}
 
		private function stopMove():void {
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarTop);
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarBot);
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarRight);
			playerCar.removeEventListener(Event.ENTER_FRAME, movCarLeft);			
		}
 
	}
 
}
Вложения
Тип файла: swf Speed_Game.swf (1.9 Кб, 60 просмотров)


Последний раз редактировалось Shaak; 10.11.2012 в 16:06.
Старый 10.11.2012, 15:17
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 2  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
была минутка, я накидал вам пример, как примерно, сделал бы я

Код AS3:
package {
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
 
	public class Main extends Sprite {
 
		private var _speedsX:Object;
		private var _speedsY:Object;
		private var _car:Sprite;
		private var _speedOfCarX:int;
		private var _speedOfCarY:int;
 
		public function Main() {
			super();
 
			//{определяем скорость для соответствующих клавиш
			//для оси x
			this._speedsX = { };
			this._speedsX[Keyboard.RIGHT] = 3;
			this._speedsX[Keyboard.LEFT] = -3;
 
			//для оси у
			this._speedsY = { };
			this._speedsY[Keyboard.UP] = -3;
			this._speedsY[Keyboard.DOWN] = 4;
			//}
 
			//{рисуем тестовую машинку
			this._car = new Sprite();
			const g:Graphics = this._car.graphics
			g.beginFill(0x000000, 1.0);
			g.drawRect(0, 0, 50, 50);
			g.endFill();
			super.addChild(this._car);
			//}
 
			if (super.stage) {
				this.super_addedToStageHandler();
			} else {
				super.addEventListener(Event.ADDED_TO_STAGE, this.super_addedToStageHandler);
			}
		}
 
		private function super_addedToStageHandler(event:Event = null):void {
			super.removeEventListener(Event.ADDED_TO_STAGE, this.super_addedToStageHandler);
			super.addEventListener(Event.REMOVED_FROM_STAGE, this.super_removedFromStageHandler)
 
			super.stage.addEventListener(KeyboardEvent.KEY_DOWN, this.stage_keyDownHandler);
			super.stage.addEventListener(KeyboardEvent.KEY_UP, this.stage_keyUpHandler);
 
			//Запускаем общеигровой цикл
			super.addEventListener(Event.ENTER_FRAME, this.super_enterFrameHandler);
		}
 
		private function super_removedFromStageHandler(event:Event):void {
			this.removeEventListener(Event.REMOVED_FROM_STAGE, super_removedFromStageHandler);
 
			super.stage.removeEventListener(KeyboardEvent.KEY_DOWN, this.stage_keyDownHandler);
			super.stage.removeEventListener(KeyboardEvent.KEY_UP, this.stage_keyUpHandler);
 
			super.removeEventListener(Event.ENTER_FRAME, this.super_enterFrameHandler);
		}
 
		private function stage_keyDownHandler(event:KeyboardEvent):void {
			const keyCode:uint = event.keyCode;
 
			if (keyCode in this._speedsX) {
				this._speedOfCarX = this._speedsX[keyCode];
			} else {
				this._speedOfCarX = 0;
			}
 
			if (keyCode in this._speedsY) {
				this._speedOfCarY = this._speedsY[keyCode];
			} else {
				this._speedOfCarY = 0;
			}
		}
 
		private function stage_keyUpHandler(event:KeyboardEvent):void {
			this._speedOfCarX = 0;
			this._speedOfCarY = 0;
		}
 
		private function super_enterFrameHandler(event:Event):void {
			//обновляем позицию "авто"
			this._car.x += this._speedOfCarX;
			this._car.y += this._speedOfCarY;
		}
	}
}
но идея такого перемещения не самая удачная
__________________
местонахождение

Старый 10.11.2012, 15:30
Shaak вне форума Посмотреть профиль Отправить личное сообщение для Shaak Найти все сообщения от Shaak
  № 3  
Ответить с цитированием
Shaak

Регистрация: Feb 2008
Сообщений: 39
Ой, попробовал ваш скрипт, это действительно не самая удачная идея такого перемещения, в моем случае подергивания происходят из-за взаимодействия слушателя клавиатуры с фрейм рейтом, у вас же сама реализация тормозит ))

Однако что касается реализации - я вот думал попробовать через таймеры, однако прочел, что это не самая лучшая реализации для игр вообще.

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Вы меня не поняли, по поводу
Цитата:
но идея такого перемещения не самая удачная
Я говорил об управлении, оно неудобное, можно ехать лишь в одну сторону. Моя реализация отличается от вашей, лишь тем, что рывков в ней не будет.

A вот это мне уже интересно
Цитата:
у вас же сама реализация тормозит ))
на выполнения всего кода уходит 1ms на кадр
__________________
местонахождение

Старый 10.11.2012, 16:02
Shaak вне форума Посмотреть профиль Отправить личное сообщение для Shaak Найти все сообщения от Shaak
  № 5  
Ответить с цитированием
Shaak

Регистрация: Feb 2008
Сообщений: 39
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Вы меня не поняли, по поводу Я говорил об управлении, оно неудобное, можно ехать лишь в одну сторону. Моя реализация отличается от вашей, лишь тем, что рывков в ней не будет.

A вот это мне уже интересно
на выполнения всего кода уходит 1ms на кадр
во время движения в одну сторону - рывки теже самые что у меня, вы б запустили мою флешку, которую прикрепил к теме и заметили б это. В Вашем коде происходят н6еудобные остановки во время движения при переключении направления и т.п. но не суть важно, проблема визуальных рывков не решена

П.С. прошу простить, похоже флешка не вложилась изначально ><

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

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

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


 


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


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