|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Banned
[+5 04.06.13]
[+1 08.06.13] Регистрация: May 2013
Сообщений: 52
|
Как сделать прыжок при нажатии вверх?
Добрый день, уважаемые форумцы. Я пытаюсь написать свою первую игру и никак не могу придумать, как заставить кружок прыгать. Помогите, пожалуйста. Буду весьма благодарен. Мой код показан ниже. Спасибо за внимание.
package { import flash.display.MovieClip; import flash.display.Shape; import flash.events.Event; import flash.events.KeyboardEvent; import flash.geom.Point; public class Main extends MovieClip { private var _heroShape:Shape; private var _heroSpeed:Point = new Point(0, 0); private var _isLefting:Boolean = false; private var _isRighting:Boolean = false; private var _isUping:Boolean = false; private static const FLOOR:Number = 400; private static const SPEED_DELTA:Number = 1; private static const SPEED_DAMPING:Number = 0.9; private static const SPEED_MAX:Number = 5; public function Main() { drawHero(); drawFloor(); stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); } //------------------------------------------------------------- // // Methods // //------------------------------------------------------------- private function drawHero():void { _heroShape = new Shape(); _heroShape.graphics.lineStyle(2); _heroShape.graphics.drawCircle(0, -30, 30); _heroShape.x = 275; _heroShape.y = FLOOR; this.addChild(_heroShape); } private function drawFloor():void { this.graphics.lineStyle(2); this.graphics.drawPath(new <int>[ 1, 2 ], new <Number>[ 0, FLOOR, 550, FLOOR ]); } //------------------------------------------------------------- // // Event handlers // //------------------------------------------------------------- private function enterFrameHandler(event:Event):void { _heroShape.x += _heroSpeed.x; _heroShape.y += _heroSpeed.y; if (_isLefting == true && Math.abs(_heroSpeed.x) < SPEED_MAX) { _heroSpeed.x += -SPEED_DELTA; if (_heroSpeed.x < -SPEED_MAX) { _heroSpeed.x = -SPEED_MAX; } } else if (_isRighting == true) { _heroSpeed.x += SPEED_DELTA; if (_heroSpeed.x > SPEED_MAX) { _heroSpeed.x = SPEED_MAX; } } else { _heroSpeed.x *= SPEED_DAMPING; } } private function keyDownHandler(event:KeyboardEvent):void { switch (event.keyCode) { case 37: { _isLefting = true; break; } case 39: { _isRighting = true; break; } case 38: { _isUping = true; break; } } } private function keyUpHandler(event:KeyboardEvent):void { switch (event.keyCode) { case 37: { _isLefting = false; break; } case 39: { _isRighting = false; break; } case 38: { _isUping = false; break; } } } } } |
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
Не знаю насчёт того лучший ли это вариант. Но можете попробовать этот способ.
Поясню, способ основан на формуле h = at*t + v0*t; Где: 1. h(t) - высота объекта в момент времени t. 2. a - вектор ускорения.(в нашем случае он положителен, чтобы тянуть объект вниз). 3. v0 - начальная скорость объекта, тот же вектор, направленный вверх при прыжке объекта. Регулировать скорость прыжка и тому подобное Вы можете через vFirst = v0 и a. Можно и через startUp, прибавляя больше или меньше к нему, собственно, если будет желание, то найдете оптимальную скорость движения объекта. Если же Вы хотите, чтобы движение занимало определенный промежуток времени, то можете просто замерить расстояние(S = (конечная точка - начальная)) и время продолжения(t). А по Event'у в таймере находить отношение времени: k = (сколько прошло)/(сколько всего двигаться). Ну и вот это отношение (K) умножать на длину всего пути(S). Можно еще разделить на 2 пути, до верхней точки и до нижней, думаю особых проблем это не вызовет у Вас. Удачи! Надеюсь всё понятно, если что - спрашивайте. package { import flash.display.InteractiveObject; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.display.Shape; /** * ... * @author Vulcan */ public class Main extends Sprite { private var vFirst:Number = 2; private var startUp:Number = 1; private var a:Number = .5; private var circle:Sprite = new Sprite(); private var groundPos:Number; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); circle.graphics.lineStyle(1); circle.graphics.drawCircle(300, 450, 50); groundPos = 500; addChild(circle); //circle.tabEnabled = true; stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener); graphics.lineStyle(1); graphics.moveTo(0, 500); graphics.lineTo(500, 500); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point } private function keyDownListener(e:KeyboardEvent):void { trace("UP!"); addEventListener(Event.ENTER_FRAME, enterFrameListener); stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownListener); } private function enterFrameListener(e:Event):void { startUp += .1; circle.y += (a * startUp * startUp) - vFirst * startUp; if (circle.y >= 0) { trace(circle.y); circle.y = 0; removeEventListener(Event.ENTER_FRAME, enterFrameListener); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener); startUp = 1; } } } } Последний раз редактировалось Idon'tKnow; 28.05.2013 в 17:51. |
Часовой пояс GMT +4, время: 16:17. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|