2014-12-29 4 views
0

나는 box2d와 andEngine을 사용하는 법을 배우고있다. 나는 몸짓으로 내 스프라이트를 만들려고 노력하고있다. 전에 onCreateScene에서 모든 것을 코딩했을 때 작동하도록 만들었지 만 이제는 내 스프라이트에 대해 별도의 클래스를 만들고 싶습니다.andEngine : 터치 이벤트가 작동하지 않는 이유는 무엇입니까?

mScene = new Scene(); 
    mScene.registerUpdateHandler(physicsWorld); 
    Kapsel kapselBialy = new Kapsel(100, 100, 100, 100,  ResourceManager.getInstance().mBialyKapselRegion, getVertexBufferObjectManager(), physicsWorld); 
    mScene.registerTouchArea(kapselBialy); 
    mScene.setTouchAreaBindingOnActionDownEnabled(true); 
    mScene.attachChild(kapselBialy); 
    pOnCreateSceneCallback.onCreateSceneFinished(mScene); 

을 그리고 내 Kapsel 클래스는 다음과 같습니다 : 그래서 지금 내 onCreateScene은 다음과 같습니다

public class Kapsel extends Sprite { 

private Body body; 


public Kapsel(float pX, float pY, float pWidth, float pHeight, 
     ITextureRegion pTextureRegion, 
     VertexBufferObjectManager pVertexBufferObjectManager, PhysicsWorld physicsWorld) { 
    super(pX, pY, pWidth, pHeight, pTextureRegion, pVertexBufferObjectManager); 
    createPhysics(physicsWorld); 


} 
//definiowanie zahchowań po dotyku 
@Override 
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY){ 

    if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP){ 

     body.setLinearVelocity(-((pSceneTouchEvent.getX()/32 - body.getPosition().x) * 10), -((pSceneTouchEvent.getY()/32 - body.getPosition().y) * 10)); 

    } 

    return true; 
} 

//Tworzenie ciała i fizyki dla kapsla 
private void createPhysics(PhysicsWorld physicsWorld){ 
    body = PhysicsFactory.createCircleBody(physicsWorld, this, BodyType.DynamicBody, PhysicsFactory.createFixtureDef(1.0f, 0.5f, 0.5f)); 
    physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true)); 
} 
} 

내 스프라이트가 제대로 표시되지만 터치 이벤트가 작동하지 않습니다. 내가 놓친 게 있니?

답변

0

그래, 문제는 onPopulateScene()에 넣어 두지 않았기 때문에 pOnPopulateSceneCallback.onPopulateSceneFinished();입니다. 비록 당신이 onCreateScene()에서 장면과 스프라이트를 정의한다고해도 onPopulateScene()에 그 장면을 넣을 필요가 있음을 알 수 있습니다. 아직도 나는 이것을 '생성자'에 넣어서는 안된다는 것을 명심 할 것이다.

1

Kapsel에서 생성자 내에서 this을 참조하고 있습니다. 이는 생성자가 createPhysics을 호출하고 차례로 physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true))을 호출하기 때문에 발생합니다. 이 PhysicsConnector 생성자에 전달 될 때 참조되는 방법에 유의하십시오.

참조 : this 생성자에서 그런 식으로 말하는 것이 가장 좋은 방법은 아닙니다. 이 주제에 대한 자세한 내용은 here을 참조하십시오.

나는 이것이 당신이 문제를 겪고있는 이유라고 확신한다. 코드가 다시 정렬되지 않도록 시도하십시오. 이러한 상황을 해결하는 방법에 대한 몇 가지 제안을 살펴볼 수 있습니다. here

+0

그게 내가 의심 스럽지만 해결 방법에 대한 아이디어가 없었습니다. 나는 그것을 변경하려고 시도 할 것이다 –

+0

좋아, 그렇게 많이 성공하지 못한 후에 나는 생성자의 createPhysics를 사임하고 단지 'code'Kapsel kapsel = new Kapsel (...)과 kapsel.createphysics (physicsworld)와 같은 Kapsel을 inicializing 한 후에 사용한다. 하지만 여전히 작동하지 않습니다. 문제는 실제로 onAreaTouched 메서드에 있습니까? –

+0

시체를 제거해도 여전히 작동하지 않기 때문에 priblem이 onAreaTouched 메서드에있는 것처럼 보입니다. –