2 Stimmen

Cocos2d-Android CCMenu reagiert nicht auf Berührung

import org.cocos2d.events.CCTouchDispatcher;
import org.cocos2d.layers.CCColorLayer;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.menus.CCMenu;
import org.cocos2d.menus.CCMenuItem;
import org.cocos2d.menus.CCMenuItemImage;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.types.ccColor4B;
import android.view.MotionEvent;

public class MenuLayer extends CCColorLayer {

public static CCScene scene() {
    // Create the scene
    CCScene scene = CCScene.node();
    // Create a background layer.
    CCLayer background = new MenuLayer(ccColor4B.ccc4(255, 255, 255, 255));
    scene.addChild(background);
    return scene;
}

protected MenuLayer(ccColor4B colour) {
    super(colour);

    // Create a menu items.
    CCMenuItem start = CCMenuItemImage.item("Start.png", "Start.png",
             this, "startTouched"); 
    CCMenuItem options = CCMenuItemImage.item("Options.png",
            "Options.png", this, "optionsTouched");
    CCMenuItem help = CCMenuItemImage.item("Help.png", "Help.png", this,
            "helpTouched");
    // Create array of CCMenuItem object to add to CCMenu
    CCMenuItem[] items = { start, options, help };
    // Add menu items to menu
    CCMenu menu = CCMenu.menu(items);
    // Align items with 150px adding
    menu.alignItemsVertically(150);
    // Add menu to the scene
    addChild(menu);
    CCTouchDispatcher.sharedDispatcher().addTargetedDelegate(this, 0, true);
    this.setIsTouchEnabled(true);
}

@Override
public boolean ccTouchesBegan(MotionEvent event) {
    return true;
}

@Override
public boolean ccTouchesEnded(MotionEvent event) {
    return super.ccTouchesEnded(event);
}

/**This method is called when the start menu item is touched**/
public void startTouched() {
    CCScene scene = GameLayer.scene();
    CCDirector.sharedDirector().pushScene(scene);
}

/**This method is called when the options menu item is touched**/
public void optionsTouched() {
    CCScene scene = OptionsLayer.scene();
    CCDirector.sharedDirector().replaceScene(scene);
}

/**This method is called when the help menu item is touched**/
public void helpTouched() {
    CCScene scene = HelpLayer.scene();
    CCDirector.sharedDirector().replaceScene(scene);
}
}

Ich fange gerade mit cocos2d-Android an und habe Probleme, ein Menü auf Berührungsereignisse reagieren zu lassen.

Die Szene wird geladen und läuft gut, sie reagiert nur nicht auf Berührungsereignisse. Wenn ich einen Haltepunkt in ccTouchesEnded setze, kann ich das Ereignis abfangen, aber startTouched, optionsTouched und helpTouched werden nie aufgerufen. Soweit ich gelesen habe, sollte CCMenu diese Funktionalität eingebaut haben.

cocos2d-Android ist eine Portierung von cocos2d-iphone.

Kann mir jemand den richtigen Weg weisen?

UPDATE:

07-21 13:31:17.933: WARN/System.err(6660): java.lang.NoSuchMethodException: startTouched
07-21 13:31:17.933: WARN/System.err(6660): at
java.lang.ClassCache.findMethodByName(ClassCache.java:247)
07-21 13:31:17.933: WARN/System.err(6660): at
java.lang.Class.getMethod(Class.java:962)
07-21 13:31:17.933: WARN/System.err(6660): at org.cocos2d.menus.CCMenuItem.<init>
(CCMenuItem.java:54)
...
// The errors repeat for optionsTouched and helpTouched

Es sieht so aus, als ob der Selektorparameter nicht in die richtige Methode aufgelöst wird. Kann jemand sehen, etwas falsch mit startTouched oder die anderen?

4voto

Nick Rempel Punkte 2982

Ich habe das Problem durch Hinzufügen eines Parameters zu den Callback-Methoden behoben.

Beispiel:

public void startTouched(Object sender) {
    CCScene scene = GameLayer.scene();
    CCDirector.sharedDirector().pushScene(scene);
}

Ich habe noch nicht herausgefunden, warum das erforderlich war, aber es hat funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X