[英]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.