java - AndEngine如何让 Sprite 在调用jump方法时不跳转

标签 java android andengine

所以我有这个方法,当我触摸屏幕时,我的 Sprite 会跳跃。现在的问题是,当我连续触摸屏幕时, Sprite 会一次又一次地跳跃。我想做的是,如果它跳跃,除非我的 Sprite 落地,否则无法调用跳跃方法。

这是代码。

public class PhyiscsActivity extends BaseGameActivity implements IAccelerometerListener, IOnSceneTouchListener{

private static final int CAMERA_WIDTH = 720; private static final int CAMERA_HEIGHT = 480; private Camera mCamera; private BitmapTextureAtlas mBitmapTextureAtlas; private TiledTextureRegion mTextureRegion; private Scene mScene; private FixtureDef mFixtureDef = PhysicsFactory.createFixtureDef(1,-10f, 0.5f); private PhysicsWorld mPhysicsWorld; private Body body; private AnimatedSprite facebox; private FixtureDef wallfixture = PhysicsFactory.createFixtureDef(-1,0.5f, 0.5f); @Override public Engine onLoadEngine() { // TODO Auto-generated method stub this.mCamera = new Camera(0,0,CAMERA_WIDTH, CAMERA_HEIGHT); final EngineOptions mEngineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),this.mCamera); mEngineOptions.getTouchOptions().setRunOnUpdateThread(true); return new Engine(mEngineOptions); } @Override public void onLoadResources() { // TODO Auto-generated method stub this.mBitmapTextureAtlas = new BitmapTextureAtlas(128,128, TextureOptions.BILINEAR_PREMULTIPLYALPHA); this.mTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mBitmapTextureAtlas, this, "gfx/face_box_tiled.png", 0, 0, 2, 1); this.mEngine.getTextureManager().loadTexture(this.mBitmapTextureAtlas); } @Override public Scene onLoadScene() { // TODO Auto-generated method stub this.mEngine.registerUpdateHandler(new FPSLogger()); this.mScene = new Scene(); this.mScene.setBackground(new ColorBackground(1,1,1)); this.mPhysicsWorld = new PhysicsWorld(new Vector2(0,SensorManager.GRAVITY_EARTH),false); // This is the walls final Shape roof = new Rectangle(0, 0, CAMERA_WIDTH, 2); final Shape ground = new Rectangle(0,CAMERA_HEIGHT - 2,CAMERA_WIDTH,2); final Shape left = new Rectangle(0,0,2,CAMERA_HEIGHT); final Shape right = new Rectangle(CAMERA_WIDTH -2, 0,2,CAMERA_HEIGHT); PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallfixture); PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallfixture); PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallfixture); PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallfixture); // This is the Sprite facebox = new AnimatedSprite(30,(CAMERA_HEIGHT - 2) - this.mTextureRegion.getHeight() ,this.mTextureRegion); body = PhysicsFactory.createBoxBody(this.mPhysicsWorld, facebox, BodyType.DynamicBody, mFixtureDef); this.mScene.attachChild(facebox); this.mScene.registerUpdateHandler(this.mPhysicsWorld); this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(facebox,body,true,true)); this.mScene.setOnSceneTouchListener(this); return this.mScene; } @Override public void onLoadComplete() { // TODO Auto-generated method stub } //Accelerometer @Override public void onAccelerometerChanged(AccelerometerData pAccelerometerData) { // TODO Auto-generated method stub final Vector2 gravity = Vector2Pool.obtain(pAccelerometerData.getX()* 3, 10); this.mPhysicsWorld.setGravity(gravity); Vector2Pool.recycle(gravity); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); this.enableAccelerometerSensor(this); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); this.disableAccelerometerSensor(); } //This is where i make the sprite jump @Override public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { pSceneTouchEvent.isActionDown();{ this.jump(facebox); } return false; } public void jump(AnimatedSprite sprite){ boolean jumping = false; if(!jumping ){ body.setLinearVelocity(new Vector2(body.getLinearVelocity().x,-8f)); } } public void jump(AnimatedSprite sprite){ if(!jumping){ body.setLinearVelocity(new Vector2(body.getLinearVelocity().x,-10)); jumping = true; } } @Override public void beginContact(Contact contact) { // TODO Auto-generated method stub jumping = true; } @Override public void endContact(Contact contact) { // TODO Auto-generated method stub jumping = false; }

我不知道为什么 beginContact 和 endContact 没有初始化。我应该做些什么来初始化它吗?例如更新处理程序?联系人监听器?

最佳答案

你需要有一个方法来告诉你你的玩家是否在跳跃。

public void jump(AnimatedSprite sprite){

    if( isJumping(sprite)){
        body.setLinearVelocity(new Vector2(body.getLinearVelocity().x,-8f));        
        }

在此方法中,您应该输入计算玩家是否跳跃的方法。就像他正在触摸墙壁一样(如果玩家的 body (x,y) 在墙壁(矩形)中)

好吧,你正在使用 box2d 来制裁剪理 =)

你必须创建一个ContactListener,你必须实现这个类和你想要添加的函数。 http://code.google.com/p/andenginephysicsbox2dextension/source/browse/src/com/badlogic/gdx/physics/box2d/ContactListener.java?r=1605f6e82f710ef9ebbe07632d6b055239d3b520

public void beginContact (Contact contact);
public void endContact (Contact contact);

接触对象将计算正在接触的对象(夹具)。你只需要在 body 接触时检查并将jump设置为false,在调用jump时将jump设置为true,然后你就可以跳跃,将jump设置为true;

可以吗?

@Override
public void beginContact(Contact contact) {
    // TODO Auto-generated method stub
    jumping = true;
}

@Override
public void endContact(Contact contact) {
    // TODO Auto-generated method stub
jumping = false;
}

这是错误的..我只会这样认为:

@Override
public void beginContact(Contact contact) {
    jumping = false; //you touched ground so you aren't jumping anymore
}

@Override
public void endContact(Contact contact) {
jumping = true; //you leave ground so you're jumping
}

以及一种跳转方法(不是两种):

   public void jump(AnimatedSprite sprite){
        if(!jumping ){
            jumping = true;
            body.setLinearVelocity(new Vector2(body.getLinearVelocity().x,-8f));        
            }
        }

你看到了吗?;

关于java - AndEngine如何让 Sprite 在调用jump方法时不跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086503/

相关文章:

java - 在 Android 中使用 HttpPost 发送对象数组

java - 该 list 从我的 Android 工作室中消失了。我找不到 list

android - 错误 :Cannot fit requested classes in a single dex file. 尝试提供 main-dex 列表。 # 方法:72477 > 65536

android - Andengine中的动画背景

android - box2d 角速度

Java监视器实现

java - 如何在 android 中构建和使用 ffmpeg

java - 使用有效的算法从数组中获取缺失的数字?‽?

Android/C++数据序列化

android - 无法将 AndEngine 添加到 Android Studio