ActionScript 3, Как заставить персонажа прыгать дольше
Я делаю платформерную игру во Flash (AS3), и приведенный ниже код работает. Я хочу, чтобы мой персонаж прыгал достаточно высоко, чтобы дать ему время достичь платформы. Единственная проблема с кодом ниже - это скорость, с которой он прыгает вверх и вниз, и высота прыжка. Пробел - это то, что запускает функцию.
Пожалуйста, помогите, так как я был бы очень признателен!:)
Player.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 (spacePressed){
var gravity:Number = 9.8;
var jumping:Boolean = false;
var jumpVar:Number = 0;
if(jumping != true)
{
jumpVar = -70;
jumping = true;
}
if(jumping)
{
spacePressed = false;
Player.y += jumpVar;
jumpVar += gravity;
}
Player.addEventListener(Event.ENTER_FRAME, drop);
function drop(event:Event)
{
Player.y -= jumpVar;
jumpVar -= gravity;
if(Player.y > 350){
Player.y = 350;
}
}
Player.removeEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
Player.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
/*var frameNumb:Number = 0;
Player.addEventListener(Event.ENTER_FRAME, jumpup);
spacePressed = false;
function jumpup(event:Event)
{
while(frameNumb < 30){
spacePressed = false;
Player.y -= 1;
frameNumb += 0.5;
}
Player.removeEventListener(Event.ENTER_FRAME, jumpup);
Player.addEventListener(Event.ENTER_FRAME, jumpdown);
function jumpdown(){
while(frameNumb > 0){
spacePressed = false;
Player.y += 1;
frameNumb -= 0.5;
}
}
}*/
}
if (leftPressed)
{
Player.x -= speed;
Player.gotoAndStop("left");
}
if (rightPressed)
{
Player.x += speed;
Player.gotoAndStop("right");
}
}
Спасибо
1 ответ
Вы используете 9,8 для гравитации - метры в секунду в секунду. Поскольку drop() выполняется каждый кадр, вы получите серьезную ускоренную гравитацию, если только программа не выполняет только 1 кадр / с. Итак, если вы хотите больше текучести, чем 1 FPS, подумайте
jumpVar += gravity/fps;
Однако, чтобы получить точную скорость, необходимую для поднятия вас на высоту, я думаю, что расчет...
initialVelocityInMetersPerSecond = Math.sqrt( 2 * gravity * metersToJump )
Так что вместо jumpVar = -70 вы бы сделали что-то вроде...
// get posititive distance since we'll use to get a square root
var metersToJump:Number = Player.y - platform.y;
jumpVar = -Math.sqrt( 2 * gravity * metersToJump );
... а затем в обработчике ENTER_FRAME...
Player.y += jumpVar / fps;
jumpVar += gravity / fps;
Из вашего примера это не тот случай, но если вы поместите платформу ниже проигрывателя, она не будет работать, так как вы не можете получить корень отрицательного числа!
В моем примере кода я не фиксирую высоту платформы, поэтому то, как вы выбираете целевую платформу, является совершенно отдельным вопросом.