0

私は解決策のためにこれを試しました...。

public void update(float dt)
{ 
    CGRect targetRect = CGRect.make(target.getPosition().x -(target.getContentSize().width),target.getPosition().y - (target.getContentSize().height),target.getContentSize().width,target.getContentSize().height);
    if (CGRect.containsPoint(targetRect, location))
    {
       spriteMoveFinished(target);
    }
}

しかし、私は結果を得ることができません。

4

4 に答える 4

2

コードを確認しましたメソッドの更新をスケジュールしていません。更新メソッドのコーディングをtouchメソッドに移動したので、スケジュールを更新する必要はありません。以下は私の最後でうまく機能している更新されたコードです..タッチは正しく機能しています

import java.util.ArrayList;

import org.cocos2d.actions.instant.CCCallFuncN;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.layers.CCColorLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGRect;
import org.cocos2d.types.CGSize;
import org.cocos2d.types.ccColor4B;

import android.view.MotionEvent;

public class as extends CCColorLayer{
protected CCSprite target;
protected ArrayList<CCSprite> _targets;
CGPoint location;

public static CCScene scene(){
    CCScene scene = CCScene.node();
    CCColorLayer layer = new as(ccColor4B.ccc4(255, 255, 255, 255));
    scene.addChild(layer);
    return scene;
}
protected as(ccColor4B color){
    super(color);
    this.setIsTouchEnabled(true);
    _targets = new ArrayList<CCSprite>();
    this.schedule("gameLogic", 3.0f);
}       
@Override
public boolean ccTouchesBegan(MotionEvent event) {
     location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY()));

     ArrayList<CCSprite> targetsToDelete = new ArrayList<CCSprite>();
     for (CCSprite target : _targets){
         if(CGRect.containsPoint((target.getBoundingBox()), location))
                      targetsToDelete.add(target);
     }
     for (CCSprite target : targetsToDelete){
         _targets.remove(target);
         removeChild(target, true);
     }

     return true;
}


//public void update(float dt){
//
//}

public void gameLogic(float dt)
{
    addTarget();
}

protected void addTarget()
{
    CGSize winSize = CCDirector.sharedDirector().displaySize();
    target = CCSprite.sprite("bee_160.png");
    target.setPosition(CGPoint.ccp(target.getContentSize().width / 2.0f, winSize.height / 2.0f));
    addChild(target);    
    _targets.add(target);

    CCMoveTo actionMove = CCMoveTo.action(3, CGPoint.ccp(winSize.getWidth(), winSize.getHeight()/2.0f));
    CCCallFuncN actionMoveDone = CCCallFuncN.action(this, "spriteMoveFinished");
    CCSequence actions = CCSequence.actions(actionMove, actionMoveDone);

    target.runAction(actions);
}

public void spriteMoveFinished(Object sender)
{
    CCSprite sprite = (CCSprite)sender;
    this.removeChild(sprite, true);
}
}
于 2013-02-26T07:30:48.577 に答える
1
public class as extends CCColorLayer{
protected CCSprite target;
protected ArrayList<CCSprite> _targets;
CGPoint location;

public static CCScene scene(){
    CCScene scene = CCScene.node();
    CCColorLayer layer = new as(ccColor4B.ccc4(255, 255, 255, 255));
    scene.addChild(layer);
    return scene;
}
protected as(ccColor4B color){
    super(color);
    this.setIsTouchEnabled(true);
    _targets = new ArrayList<CCSprite>();
    this.schedule("gameLogic", 3.0f);
            this.schedule("update");
}       
@Override
public boolean ccTouchesBegan(MotionEvent event) {
     location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY()));
     return true;
}

public void update(float dt){
    ArrayList<CCSprite> targetsToDelete = new ArrayList<CCSprite>();
    for (CCSprite target : _targets){
        if(CGRect.containsPoint((target.getBoundingBox()), location))
                     targetsToDelete.add(target);
    }
    for (CCSprite target : targetsToDelete){
        _targets.remove(target);
        removeChild(target, true);
    }
}

public void gameLogic(float dt)
{
    addTarget();
}

protected void addTarget()
{
    CGSize winSize = CCDirector.sharedDirector().displaySize();
    target = CCSprite.sprite("RedX.gif");
    target.setPosition(CGPoint.ccp(target.getContentSize().width / 2.0f, winSize.height / 2.0f));
    addChild(target);    
    _targets.add(target);

    CCMoveTo actionMove = CCMoveTo.action(3, CGPoint.ccp(winSize.getWidth(), winSize.getHeight()/2.0f));
    CCCallFuncN actionMoveDone = CCCallFuncN.action(this, "spriteMoveFinished");
    CCSequence actions = CCSequence.actions(actionMove, actionMoveDone);

    target.runAction(actions);
}

public void spriteMoveFinished(Object sender)
{
    CCSprite sprite = (CCSprite)sender;
    this.removeChild(sprite, true);
}

}

于 2013-02-21T12:36:00.817 に答える
0

デフォルトのcocosメソッドを呼び出すことで、スプライトのタッチを確認できます

まず、タッチを有効にします(Cocos2D Touch HELP

isTouchEnabled_=true;

その後、ccToucesBeganメソッドで、どのスプライトのタッチを確認できます

(getBoundingBox()はCGRectを返します)

      @Override
      public boolean ccTouchesBegan(MotionEvent event) {

 CGPoint convertedLocation = CCDirector.sharedDirector()
                    .convertToGL(CGPoint.make(event.getX(), event.getY()));

if(sprite.getBoundingBox().contains(convertedLocation.x,convertedLocation.y))
{
removeChild(sprite, true);
}
}

プログラムと同様に、スプライト画像を指定していません。これは、タッチが適切に機能するレイヤークラスの例です。

public class TestLayer extends CCColorLayer{ 

    protected CCSprite target; protected CGPoint location;

    public static CCScene scene(){
        CCScene scene = CCScene.node();
        CCColorLayer layer = new TestLayer(ccColor4B.ccc4(0, 0, 255, 255));

        scene.addChild(layer);

        return scene;
    }

    protected TestLayer(ccColor4B color){
        super(color);
        this.setIsTouchEnabled(true);

        target=CCSprite.sprite("bee_120.png");

        addChild(target);
        target.setPosition(100, 100);

//      this.schedule("game", 3.0f);


    }       
    @Override
    public boolean ccTouchesBegan(MotionEvent event) {
    location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY()));
        if(CGRect.containsPoint(target.getBoundingBox(), location));
            {
                removeChild(target, true);
            }
        return true;
    }
//  public void game(float dt){
//      addTarget();
//  }
//  protected void addTarget(){
//      //some code of add the "target"
//  }
}

上記のコードでは、1つのスプライトのみを使用しています。複数のスプライトを使用するには、これまでと同じようにメソッドをスケジュールする必要がありますが、生成したすべてのスプライトのタッチを確認する必要があります。その目的でArrayListを使用できます。

于 2013-02-21T11:15:12.263 に答える
0

これを使用して、クリックしたときに画像を削除します。

//rect1 and rect2 are two rectangles of two different images
CCRect.intersect(rect1,rect2))

//Remove the image when it intersects
于 2014-06-14T06:53:23.617 に答える