2015-02-28 1 views
0

Из моего поиска я нашел методы, подобные onUpdate- и onUpdateManager, но я должен делать это неправильно, потому что не могу найти. Я использую .runOnUpdateThread(Runabale);, но он не работаетНепрерывное касание в Andengine

Если это помогает, это часть моего кода:

public class GameActivity extends SimpleBaseGameActivity { 
private boolean action_up ,action_down; 
Sprite eliSprite; 
Runnable runabale=new Runnable() { 
    @Override 
    public void run() { 
     Log.d("UPDATE","OnUpdate"); 
     if (action_down){ 
      eliSprite.setY(eliSprite.getY()-10); 
     } 
    } 
}; 

защищены Scene onCreateScene() { Сцены з = новая сцена();

PhysicsWorld mWorld =new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH),true); 
    eliSprite = new Sprite(400, 240, james_walking[3], getVertexBufferObjectManager()); 
    final Sprite eliSprite2 = new Sprite(400, 370, james_walking[0], getVertexBufferObjectManager()); 

    eliSprite.setScale(0.5f); 
    eliSprite2.setScale(0.5f); 

    FixtureDef characteristics= PhysicsFactory.createFixtureDef(1,0,.5f); 
    final Body b= PhysicsFactory.createBoxBody(mWorld, eliSprite, BodyDef.BodyType.DynamicBody,characteristics); 
    mWorld.registerPhysicsConnector(new PhysicsConnector(eliSprite,b)); 

    FixtureDef characteristics2= PhysicsFactory.createFixtureDef(1,.90f,1); 
    final Body b2= PhysicsFactory.createCircleBody(mWorld,eliSprite2, BodyDef.BodyType.StaticBody,characteristics2); 
    mWorld.registerPhysicsConnector(new PhysicsConnector(eliSprite2,b2)); 


    s.attachChild(eliSprite); 
    s.attachChild(eliSprite2); 

    s.registerUpdateHandler(mWorld); 
    s.setTouchAreaBindingOnActionDownEnabled(true); 

    s.setOnSceneTouchListener(new IOnSceneTouchListener() { 
     @Override 
     public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
      action_down = pSceneTouchEvent.isActionDown(); 
      action_up = pSceneTouchEvent.isActionUp(); 
      return true; 
     } 
    }); 
    this.getEngine().runOnUpdateThread(runabale); 
    return s; 
} 

EDIT

@Override 
public void runOnUpdateThread(Runnable pRunnable) { 
    super.runOnUpdateThread(pRunnable); 
    if(action_down) { 
     Log.d("UPDATE","ActionDown pressed"); 
     b.setTransform(b.getPosition().x,b.getPosition().y-10,0); 

    } 

} 

@Override 
protected Scene onCreateScene() { 
    Scene s = new Scene(); 

    PhysicsWorld mWorld =new PhysicsWorld(new Vector2(0, 0),true); 
    eliSprite = new AnimatedSprite(400,240,james_walking,getVertexBufferObjectManager()); 

    eliSprite.setScale(0.5f); 
    eliSprite.animate(200,true); 

    FixtureDef characteristics= PhysicsFactory.createFixtureDef(1,0,.5f); 
    b= PhysicsFactory.createBoxBody(mWorld, eliSprite, BodyDef.BodyType.DynamicBody,characteristics); 

    mWorld.registerPhysicsConnector(new PhysicsConnector(eliSprite,b)); 

    s.attachChild(eliSprite); 
    s.setOnSceneTouchListener(new IOnSceneTouchListener() { 
     @Override 
     public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { 
      action_down= pSceneTouchEvent.isActionDown(); 
      return true; 
     } 
    }); 

    s.registerUpdateHandler(mWorld); 
    s.setTouchAreaBindingOnActionDownEnabled(true); 

    return s; 
} 

ответ

0

Я использовал это для своей игры. Примените его для своего кода.

В вашем onAreaTouched или onSceneTouchedEvent вашей сцены:

@Override 
     public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY){ 
      if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){ 
       leftPressed = true; 
       //rightPressed = false; 
      } 
      if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP){ 
       leftPressed = false; 
      } 
      return true; 
     } 

В onManagedUpdate() метод вашего спрайта сайте:

@Override 
     protected void onManagedUpdate(float pSecondsElapsed){ 
      super.onManagedUpdate(pSecondsElapsed); 
      if(leftPressed == true){ 
       playerCar.setPosition(playerCar.getX() - 4f, playerCar.getY()); 
      } 
      if(rightPressed == true){ 
       playerCar.setPosition(playerCar.getX() + 4f, playerCar.getY()); 
      } 

     } 

Это перемещает свой спрайт влево, как бревно, как мои buutons нажимаются. Таким образом, вы изменяете логическое значение true на TouchEvent == Action_Down и false на Action_UP. onManagedUpdate перемещает ваш спрайт, когда это логическое значение истинно.

+0

Вы повсюду! Во всяком случае, теперь у меня непрерывное касание, но, как ни странно, он просто перемещается один раз (althoe logcat показывает, что 'eliSprite.setPosition (eliSprite.getX(), eliSprite.getY() - 10f);' выполняется каждый раз и когда я реализую палец он возвращается к тому, где он был раньше. Почему? –

+0

Можете ли вы опубликовать свои onmanagedupdate и onareatouched методы в исходном сообщении вопроса. На данный момент нам ничего не нужно. –

+0

Дело в том, что мы перемещаем спрайт, если он связан с телом, мы должны переместить тело вместо этого. Sprite будет следовать. –

0

Вы должны переопределить onAreaTouched метод вашего объекта спрайтов, так и внутри, что это лучшее место, чтобы поместить свои коды.

eliSprite = new Sprite(400, 240, james_walking[3], getVertexBufferObjectManager()){ 
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { 
     if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){ 
      setY(getY() - 10); 
     } 
    } 
}; 

И вы должны зарегистрировать свой спрайт в качестве слушателя прикосновения.

s.registerTouchArea(eliSprite); 

Обратите внимание, что если вы хотите, чтобы ваши коды, которые будут выполняться до тех пор, пользователь палец не движется, вы должны использовать вместо TouchEvent.ACTION_MOVE.

 Смежные вопросы

  • Нет связанных вопросов^_^