重力/速度和跳跃问题(AS3,平台游戏)

Gravity / velocity & jump issue (AS3, platformer)

我目前正在尝试为 Android 编写 Flash 游戏。

我有或多或少的工作重力和速度以及撞击测试 - 所以我不会从我的平台上掉下来。

现在的问题是,我一点击 "jump",点击测试就停止工作,我从平台上掉下来了。如果我把我的角色设置到一个不同的、更高的位置,我什至不会倒下。

谁能帮我解决这个问题?

这是我的代码:

import flash.events.MouseEvent;
import flash.events.Event;


var gravity:Number = 2;
var velocity:Number = 1.1;
var jumpPower:Number = 0;
var isJumping:Boolean = false;


stage.addEventListener(Event.ENTER_FRAME, touchPlatform);
player.addEventListener(Event.ENTER_FRAME, appeal);

function touchPlatform(e:Event):void
    {
        if(kurz.hitTestObject(player))
            {
                hitPlatform = true;
                }

        else if(kurz2.hitTestObject(player))
            {
                hitPlatform = true;
                }

        }

function appeal(e:Event):void                               
    {
        gravity *= velocity;    
        player.y += gravity;                                

        if(hitPlatform == true)
        {
            velocity = 0;
            }

    }


jump.addEventListener(MouseEvent.CLICK, doJump);
stage.addEventListener(Event.ENTER_FRAME, update);
function doJump(e:MouseEvent):void
{
    if(!isJumping)
    {
        jumpPower = 30;
        isJumping = true;
        }
    }

function update(e:Event):void
    {
        if(isJumping)
        {
            player.y -= jumpPower;
            jumpPower -= 2;

            }

        else
        {
            isJumping = false;
            }
        }

你的问题是,一旦你开始跳跃,你就永远不会停止!没有在哪里(可以到达)你把isJumping设置为false。此外,你的跳跃值和你的重力目前 运行 串联,你只希望其中一个或另一个在任何给定时间影响你的玩家。

尝试这样的事情(解释见代码注释)

import flash.events.MouseEvent;
import flash.events.Event;


var gravity:Number = 2;
var velocity:Number = 1.1;
var jumpPower:Number = 0;
var isJumping:Boolean = false;

jump.addEventListener(MouseEvent.CLICK, doJump);
function doJump(e:MouseEvent):void {
    if(!isJumping){
        jumpPower = 30;
        isJumping = true;
    }
}


//Just one ENTER_FRAME handler is better, 
//then you have more control over the order in which code gets run
//I've combined your three into one and called it gameLoop
stage.addEventListener(Event.ENTER_FRAME, gameLoop);

function gameLoop(e:Event):void {
    //this is the same, I just combined your 2 if's into one.
    if(kurz.hitTestObject(player) || kurz2.hitTestObject(player)){
        hitPlatform = true;
    }                             

    //you should set the velocity before assigning it to the player
    if(hitPlatform == true){
        velocity = 0;
        gravity = 2; //you probably want to reset gravity to default too
        isJumping = false; //SET isJumping to false now that you've hit a platform!  <-------------
    }else{
        velocity = 1.1; //you need to reset velocity when not on a platform
    }


    //Now that we've determined the velocity and if we're jumping, let's move the player the appropriate amount

    if(isJumping){
        //Since we're currently jumping, use the jumpPower instead of gravity
        player.y -= jumpPower;
        jumpPower -= 2;
    }else{
        if(!hitPlatform){
            //Since we're NOT JUMPING, and not on a platform, use gravity.
            gravity *= velocity;    
            player.y += gravity;  
        }
    }
}