Android 使用AndEngine和Box2D制作英雄跳跃

Android 使用AndEngine和Box2D制作英雄跳跃,android,box2d,andengine,Android,Box2d,Andengine,我不熟悉汽车和发动机。目前我想让我的游戏英雄跳跃使用安引擎和Box2D。我已经尝试了很多方法来做到这一点。但是没有成功 下面是我的代码,让角色在触摸屏幕上显示的左右箭头时左右行走。现在我想让它跳上润色箭头。 这是我的密码 public jump(int pLayerCount, final BaseGameActivity game) { super(pLayerCount); this.game=game; gravity=new Vector2(0,SensorMa

我不熟悉汽车和发动机。目前我想让我的游戏英雄跳跃使用安引擎和Box2D。我已经尝试了很多方法来做到这一点。但是没有成功

下面是我的代码,让角色在触摸屏幕上显示的左右箭头时左右行走。现在我想让它跳上润色箭头。 这是我的密码

public jump(int pLayerCount, final BaseGameActivity game) {
    super(pLayerCount);
    this.game=game;

    gravity=new Vector2(0,SensorManager.GRAVITY_EARTH);
    physicsWorld=new PhysicsWorld(gravity, false);
    fixture=PhysicsFactory.createFixtureDef(1f, 1f, 1f);

    camera_height=game.getEngine().getCamera().getHeight();
    camera_width=game.getEngine().getCamera().getWidth();
    bottom=new Rectangle(0, camera_height-5,camera_width,3);

    PhysicsFactory.createBoxBody(physicsWorld, bottom,BodyType.StaticBody, fixture);
    this.registerUpdateHandler(physicsWorld);
    this.attachChild(bottom);

    //walking image
       texture=new Texture(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
        tiletextureRegion=TextureRegionFactory.createTiledFromAsset(texture,game, "images/walk_forward.png",0,90,5,1);
        game.getEngine().getTextureManager().loadTexture(texture);
        walk_forward=new AnimatedSprite(0.0f,160.0f,tiletextureRegion);

        this.attachChild(walk_forward);


    //Up_arrow
    texture=new Texture(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    textureRegion=TextureRegionFactory.createFromAsset(texture,game, "images/up_arrow.png",0,0);
    game.getEngine().getTextureManager().loadTexture(texture);
    Sprite up_arrow=new Sprite(30.0f,10.0f,textureRegion){
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
            float pTouchAreaLocalX, float pTouchAreaLocalY) 
    {   
            left_touch=false;
            right_touch=false;
            up_touch=true;
            return true;            
    }

};


    //Left Arrow
    texture=new Texture(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    textureRegion=TextureRegionFactory.createFromAsset(texture,game, "images/left_arrow.png",0,0);
    game.getEngine().getTextureManager().loadTexture(texture);
    Sprite left_arrow=new Sprite(2.0f,34.0f,textureRegion){
        public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                float pTouchAreaLocalX, float pTouchAreaLocalY) 
        {   
                left_touch=true;
                right_touch=false;
                walk_forward.animate(150);
                return true;            
        }

    };

    //right Arrow
    texture=new Texture(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    textureRegion=TextureRegionFactory.createFromAsset(texture,game, "images/right_arrow.png",0,0);
    game.getEngine().getTextureManager().loadTexture(texture);
    Sprite right_arrow=new Sprite(60.0f,34.0f,textureRegion){

        public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                float pTouchAreaLocalX, float pTouchAreaLocalY) 
        {   
                right_touch=true;
                left_touch=false;
                //walk_forward.animate(150);
                return true;            
            }
    };

    //Down Arrow
    texture=new Texture(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
    textureRegion=TextureRegionFactory.createFromAsset(texture,game, "images/down_arrow.png",0,0);
    game.getEngine().getTextureManager().loadTexture(texture);
    Sprite down_arrow=new Sprite(30.0f,60.0f,textureRegion);

    this.attachChild(up_arrow);
    this.attachChild(left_arrow);
    this.attachChild(right_arrow);
    this.attachChild(down_arrow);
    this.registerTouchArea(right_arrow);
    this.registerTouchArea(left_arrow);
    this.registerTouchArea(up_arrow);
    this.setTouchAreaBindingEnabled(true);  


    //jumping image_physics
     texture=new Texture(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
        textureRegion=TextureRegionFactory.createFromAsset(texture,game, "images/jump_up.png",0,90);
        game.getEngine().getTextureManager().loadTexture(texture);
        jump_up=new Sprite(0.0f,220.0f,textureRegion);
        this.attachChild(jump_up);  
        fixture_jump=PhysicsFactory.createFixtureDef(1f, 0f, 1f);
        jump_up_body=PhysicsFactory.createBoxBody(physicsWorld, jump_up,BodyType.DynamicBody, fixture_jump);
        //jump_up_body.fixedRotation=true;
        physicsWorld.registerPhysicsConnector(new PhysicsConnector(jump_up,jump_up_body));  
    //  physicsWorld.clearForces();
        hero_speed = 2; //just test and find values that work well
        hero_max_speed = 4;
        hero_normal = new Vector2(0, 0);
        jump_speed = 16;

}

protected void onManagedUpdate(float pSecondsElapsed)
{
    if(right_touch==true)
    {
        x=x+1f;
        walk_forward.setPosition(x, walk_forward.getY());
    }
    if(left_touch==true)
    {
        x=x-1f;
       walk_forward.setPosition(x, walk_forward.getY());
    }

    if(up_touch==true)
    {
        jump_up_body.applyLinearImpulse(new Vector2(0,  -jump_speed), jump_up_body.getWorldCenter());
        walk_forward.getY()+30);
    }
    super.onManagedUpdate(pSecondsElapsed);
}

特别是看看安德林的样品

从本质上讲,要跳跃,需要设置物理体的线速度

Vector2 velocity = new Vector2(0, -50); //experiment with the numbers!!
body.setLinearVelocity(velocity);
Animatedsprite yas = new Animatedsprite(XPosition,YPosition, (ITiledTextureRegion) this.yourspriteregion, this.getVertexBufferObjectManager());

Body yasbody;
this.physicsworld.registerPhysicsConnector(new PhysicsConnector(yas, yasbody, true, true));

yasbody.setLinearVelocity(velocity);

特别是看看安德林的样品

从本质上讲,要跳跃,需要设置物理体的线速度

Vector2 velocity = new Vector2(0, -50); //experiment with the numbers!!
body.setLinearVelocity(velocity);
Animatedsprite yas = new Animatedsprite(XPosition,YPosition, (ITiledTextureRegion) this.yourspriteregion, this.getVertexBufferObjectManager());

Body yasbody;
this.physicsworld.registerPhysicsConnector(new PhysicsConnector(yas, yasbody, true, true));

yasbody.setLinearVelocity(velocity);
运动员跳跃:

playerBody.setLinearVelocity(new Vector2(playerBody.getLinearVelocity().x+1,-10f));
playerBody.setLinearVelocity(new Vector2(2,playerBody.getLinearVelocity().y));
玩家移动:

playerBody.setLinearVelocity((int)5, 400);              
运动员跳跃:

playerBody.setLinearVelocity(new Vector2(playerBody.getLinearVelocity().x+1,-10f));
playerBody.setLinearVelocity(new Vector2(2,playerBody.getLinearVelocity().y));
玩家移动:

playerBody.setLinearVelocity((int)5, 400);              

首先创建精灵,然后将其添加到物理体中

Vector2 velocity = new Vector2(0, -50); //experiment with the numbers!!
body.setLinearVelocity(velocity);
Animatedsprite yas = new Animatedsprite(XPosition,YPosition, (ITiledTextureRegion) this.yourspriteregion, this.getVertexBufferObjectManager());

Body yasbody;
this.physicsworld.registerPhysicsConnector(new PhysicsConnector(yas, yasbody, true, true));

yasbody.setLinearVelocity(velocity);

首先创建精灵,然后将其添加到物理体中

Vector2 velocity = new Vector2(0, -50); //experiment with the numbers!!
body.setLinearVelocity(velocity);
Animatedsprite yas = new Animatedsprite(XPosition,YPosition, (ITiledTextureRegion) this.yourspriteregion, this.getVertexBufferObjectManager());

Body yasbody;
this.physicsworld.registerPhysicsConnector(new PhysicsConnector(yas, yasbody, true, true));

yasbody.setLinearVelocity(velocity);

您需要为正确跳跃设置实际速度x。 例如:

playerBody.setLinearVelocity(new Vector2(playerBody.getLinearVelocity().x,-jump_speed));

您需要为正确跳跃设置实际速度x。 例如:

playerBody.setLinearVelocity(new Vector2(playerBody.getLinearVelocity().x,-jump_speed));

我已经试过了,但角色并没有停止接触,而是继续跳跃。所以有没有办法让它停止接触地面。一点也不停止?还是经常反弹?如果是后者,请使用“恢复”设置以降低碰撞的弹性。还有人会说,你应该使用线性脉冲而不是速度,因为它更符合真实世界的物理,但速度会起作用。我尝试过这个方法,但角色不会停止触碰,而是继续跳跃。那么有没有办法让它停止触碰地面。一点也不停止?还是经常反弹?如果是后者,请使用“恢复”设置以降低碰撞的弹性。也有人会说,你应该应用线性脉冲而不是速度,因为这更符合真实世界的物理,但速度会起作用。