简体   繁体   English

如何在Andengine中添加OnClickListener?

[英]How to add OnClickListener in Andengine?

Can anyone help me out? 谁能帮我吗? I'm trying to implement an OnClickListener that let's my code go to the main game. 我正在尝试实现一个OnClickListener,让我的代码进入主游戏。 I don't know how to do the coding of the clicklistener in AndEngine. 我不知道如何在AndEngine中对clicklistener进行编码。

I'm stuck at the part where I am able to output the images only, not as clickable images. 我被困在只能输出图像而不是可单击图像的部分。

UPDATE: The Play image/button doesn't seem to function even after adding this code to it. 更新:即使将此代码添加到其中,“播放图像/按钮”似乎也不起作用。 Can anyone help? 有人可以帮忙吗?

Added Code for GameActivity: 为GameActivity添加了代码:

public boolean onAreaTouched(TouchEvent pSceneTouchEvent,float pTouchAreaLocalX, float pTouchAreaLocalY) {
         if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){
        // you can implement your action
             sceneManager.loadGameResources();
                sceneManager.createGameScene();
          sceneManager.setCurrentScene(AllScenes.GAME);
}

     return onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);

 }

Added Code for SceneManager: 为SceneManager添加了代码:

public Scene createMenuScene()
{
    menuScene = new Scene();
    menuScene.setBackground(new Background (0,0,0));

    Sprite icon = new Sprite (0,0, menuTR, engine.getVertexBufferObjectManager());
    icon.setPosition((camera.getWidth() - icon.getWidth()) /2, (camera.getHeight() - icon.getHeight()) /2 );
    menuScene.attachChild(icon);


    Sprite play = new Sprite (180, 350, playTR, engine.getVertexBufferObjectManager());

    this.menuScene.attachChild(play);
    this.menuScene.registerTouchArea(play);

    Sprite quit = new Sprite (500,350, quitTR, engine.getVertexBufferObjectManager());

    menuScene.attachChild(quit);
    return menuScene;
}
public Scene createGameScene()
{

return gameScene;   
}

Here's the code for my GameActivity: 这是我的GameActivity的代码:

public class GameActivity extends BaseGameActivity {

Scene scene;
protected static final int CAMERA_WIDTH = 800;
protected static final int CAMERA_HEIGHT = 480;
BitmapTextureAtlas playerTexture;
ITextureRegion playerTextureRegion;
PhysicsWorld physicsWorld;


SceneManager sceneManager;
Camera mCamera;

@Override
public EngineOptions onCreateEngineOptions() {

mCamera = new Camera (0,0, CAMERA_WIDTH, CAMERA_HEIGHT);
EngineOptions options = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy (CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);
return options;
}

@Override
public void onCreateResources(
        OnCreateResourcesCallback pOnCreateResourcesCallback)
        throws Exception {


    sceneManager = new SceneManager(this, mEngine, mCamera);
    sceneManager.loadSplashResources();

    pOnCreateResourcesCallback.onCreateResourcesFinished();
}


@Override
public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
        throws Exception {

    pOnCreateSceneCallback.onCreateSceneFinished(sceneManager.createSplashScene());

}

@Override
public void onPopulateScene(Scene pScene,
        OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {

    mEngine.registerUpdateHandler(new TimerHandler(3f, new ITimerCallback(){


        public void onTimePassed(TimerHandler pTimerHandler)
        {
            mEngine.unregisterUpdateHandler(pTimerHandler);
            // TODO Auto-generated method stub

            sceneManager.loadMenuResources();
            sceneManager.createMenuScene();
            sceneManager.setCurrentScene(AllScenes.MENU);
        }
    }));
    pOnPopulateSceneCallback.onPopulateSceneFinished();
}



}

and here's my code for the SceneManager: 这是我的SceneManager代码:

public class SceneManager {
private AllScenes currentScene;
private BaseGameActivity activity; // Name of other activity GameActivity
private Engine engine;
private Camera camera;
private BitmapTextureAtlas splashTA, menuTA, playTA, quitTA;
private ITextureRegion splashTR, menuTR, playTR , quitTR;
private Scene splashScene, gameScene, menuScene;

public enum AllScenes 
{
    SPLASH, MENU, GAME
}

public SceneManager(BaseGameActivity act, Engine eng, Camera cam)
{
// TODO Auto-generated constructor stub
    this.activity = act;
    this.engine = eng;
    this.camera = cam;
} 
public AllScenes getCurrentScene()
{
    return currentScene;
}

public void setCurrentScene(AllScenes currentScene)
{
    this.currentScene = currentScene;


    switch(currentScene)
    {
    case SPLASH:

        break;
    case MENU:
        engine.setScene(menuScene);

        break;
    case GAME:

        engine.setScene(gameScene);
        break;

    default:
        break;
    }
}

public void loadSplashResources() 
{
    BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
    splashTA = new BitmapTextureAtlas(this.activity.getTextureManager(), 256, 256);
    splashTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(splashTA, this.activity, "splash.png", 0,0);
    splashTA.load();
}

public void loadGameResources()
{

}

public void loadMenuResources()
{
    BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
    menuTA = new BitmapTextureAtlas(this.activity.getTextureManager(), 800, 480);
    menuTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(menuTA, this.activity, "menu.png", 0, 0);
    menuTA.load();

    playTA = new BitmapTextureAtlas(this.activity.getTextureManager(), 140, 42);
    playTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(playTA, this.activity, "play.png", 0, 0);
    playTA.load();

    quitTA = new BitmapTextureAtlas(this.activity.getTextureManager(), 140, 42);
    quitTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(quitTA, this.activity, "quit.png", 0, 0);
    quitTA.load();
}

public Scene createSplashScene()
{
    splashScene = new Scene();
    splashScene.setBackground(new Background(233,242,237));

    Sprite icon = new Sprite(0,0, splashTR, engine.getVertexBufferObjectManager());
    icon.setPosition((camera.getWidth()-icon.getWidth())/2, (camera.getHeight() - icon.getHeight()) /2 );
    splashScene.attachChild(icon);
    return splashScene;
}

public Scene createMenuScene()
{
    menuScene = new Scene();
    menuScene.setBackground(new Background (0,0,0));

    Sprite icon = new Sprite (0,0, menuTR, engine.getVertexBufferObjectManager());
    icon.setPosition((camera.getWidth() - icon.getWidth()) /2, (camera.getHeight() - icon.getHeight()) /2 );
    menuScene.attachChild(icon);


    Sprite play = new Sprite (0,0, playTR, engine.getVertexBufferObjectManager());
    play.setPosition(180, 350 );
    menuScene.attachChild(play);

    Sprite quit = new Sprite (0,0, quitTR, engine.getVertexBufferObjectManager());
    quit.setPosition(500, 350);
    menuScene.attachChild(quit);
    return menuScene;
}


}

I did not got what exactly you want.But you can implement onclick for sprite as follows: 我没有真正想要的东西,但是您可以如下实现sprite的onclick:

ButtonSprite mSoundButton  = new ButtonSprite(30, 30,
                                         ResourceManager.getSoundButtonTR(),
                                         ResourceManager.getEngine().getVertexBufferObjectManager(),
                                         new ButtonSprite.OnClickListener() {
                    @Override
                    public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) {


                    }
        });

If you want to add click listener to Scene it self you can do as follows: 如果要将点击侦听器自身添加到Scene中,可以执行以下操作:

public class MenuScrollerActivity extends SimpleBaseGameActivity implements  IClickDetectorListener{
  private ClickDetector mClickDetector;

MenuScrollerActivity(){
this.mClickDetector = new ClickDetector(this);
}

@Override
    public void onClick(ClickDetector arg0, int arg1, float arg2, float arg3) {
        // TODO Auto-generated method stub

    }

 @Override
        public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
                this.mClickDetector.onTouchEvent(pSceneTouchEvent);

                return true;
        }

} 

You can also do in this way for those functionalities: 您还可以通过以下方式实现这些功能:

      Sprite playSprite = new Sprite(0, CAMERA_HEIGHT/2, mFruitTiledTextureRegion3, this.getVertexBufferObjectManager()){
                    @Override
                    public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                            float pTouchAreaLocalX, float pTouchAreaLocalY) {
                            if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){
                           // you can implement your action
                                      sceneManager.setCurrentScene(AllScenes.GAME);
}

                        return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
                    }
                };

                this.mScene.registerTouchArea(playSprite);
                this.mScene.attachChild(playSprite);
public Scene createMenuScene()
{
    menuScene = new Scene();
    menuScene.setBackground(new Background (0,0,0));

    Sprite icon = new Sprite (0,0, menuTR, engine.getVertexBufferObjectManager());
    icon.setPosition((camera.getWidth() - icon.getWidth()) /2, (camera.getHeight() - icon.getHeight()) /2 );
    menuScene.attachChild(icon);


  Sprite playSprite = new Sprite(0, 0, playTR, this.getVertexBufferObjectManager()){
                    @Override
                    public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                            float pTouchAreaLocalX, float pTouchAreaLocalY) {
                            if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){
                           // you can implement your action
                                      sceneManager.setCurrentScene(AllScenes.GAME);
}

                        return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
                    }
                };

                menuScene.registerTouchArea(playSprite);
              play.setPosition(180, 350 );
               menuScene.attachChild(playSprite);




  Sprite quitSprite = new Sprite(0, 0, quitTR, this.getVertexBufferObjectManager()){
                    @Override
                    public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
                            float pTouchAreaLocalX, float pTouchAreaLocalY) {
                            if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){
                           // you can implement your action to quit

}

                        return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
                    }
                };
                 quitSprite.setPosition(500, 350);
                menuScene.registerTouchArea(quitSprite);
               menuScene.attachChild(quitSprite);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM