如何在cocos2d-android中检测精灵与其他精灵是否发生碰撞?

3

我在谷歌和stackoverflow网站上进行了大量搜索,希望能找到cocos2d-android中使精灵(_player)被检测到并与另一个精灵(target)发生碰撞,并在碰撞后被移除的解决方案,但是没有找到。虽然我能够在cocos2d-iphone上找到很多信息,但在android上并不行,即使我已经将我的代码与iphone代码进行比较,但仍然无法理解。

public class GameLayer extends CCColorLayer
 {
protected LinkedList<CCSprite> _targets;
protected LinkedList<CCSprite> _projectiles;
protected int _projectilesDestroyed;
protected CCSprite _player;
protected CCSprite _nextProjectile;

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

    scene.addChild(layer);

    return scene;
}


protected GameLayer(ccColor4B color)
{
    super(color);

    this.setIsTouchEnabled(true);

    _targets = new LinkedList<CCSprite>();
    _projectiles = new LinkedList<CCSprite>();
    _projectilesDestroyed = 0;

    CGSize winSize = CCDirector.sharedDirector().displaySize();

    _player = CCSprite.sprite("Player2.png");
    _player.setPosition(CGPoint.ccp(_player.getContentSize().width / 2.0f, winSize.height / 2.0f));

    addChild(_player);


    this.schedule("gameLogic", 1.0f);
    this.schedule("update");
}

更新方法
public void update(float dt)
{
    LinkedList<CCSprite> projectilesToDelete = new LinkedList<CCSprite>();

    for (CCSprite projectile : _projectiles)
    {
        CGRect projectileRect = CGRect.make(projectile.getPosition().x - (projectile.getContentSize().width / 2.0f),
                                            projectile.getPosition().y - (projectile.getContentSize().height / 2.0f),
                                            projectile.getContentSize().width,
                                            projectile.getContentSize().height);

        LinkedList<CCSprite> targetsToDelete = new LinkedList<CCSprite>();

        for (CCSprite target : _targets)
        {
            CGRect targetRect = CGRect.make(target.getPosition().x - (target.getContentSize().width),
                                            target.getPosition().y - (target.getContentSize().height),
                                            target.getContentSize().width,
                                            target.getContentSize().height);



            _player = CCSprite.sprite("Player2.png");
            _player.setPosition(CGPoint.ccp(50,100));
            CGRect playerRect = CGRect.make(_player.getPosition().x - (_player.getContentSize().width / 2.0f),
                    _player.getPosition().y - (_player.getContentSize().height / 2.0f),
                    _player.getContentSize().width,
                    _player.getContentSize().height);

            if (CGRect.intersects(projectileRect, targetRect))
                targetsToDelete.add(target);


            else if (CGRect.intersects(playerRect, targetRect))
                _player.remove(_player);
            removeChild(_player, true);

        }

        for (CCSprite target : targetsToDelete)
        {
            _targets.remove(target);
            removeChild(target, true);
        }

        if (targetsToDelete.size() > 0)
            projectilesToDelete.add(projectile);
    }

你是在使用Dan Clarke的示例还是其他的? - Akarsh M
是的,我只是在使用那个教程 @user2078315 - DD.
所以,当两个精灵发生碰撞时,代码运行良好。你遇到了什么错误? - Akarsh M
我没有收到任何错误信息,精灵们互相穿过了,但是没有发生碰撞并删除@user2078315。 - DD.
我已经下载了代码... 在我的情况下工作得很好... 我会再次使用你的代码进行检查,尽快回复... - Akarsh M
下载的代码没有问题,它可以正常工作。但是我添加了一个带有炮台的单独船只精灵,当火球落在船上时,船只不会被删除。 - DD.
1个回答

0
为了找到这个答案的解决方案,花了一个星期:( 当游戏中添加新的精灵时,首先应该在addsomefunction()方法中声明它,我的错误是在构造函数中声明了ship(sprite)的值而不是在addTarget()中,并且要在碰撞后移除精灵,则代码必须在public void spriteMoveFinished(Object sender)中给出。
if (sprite.getTag() == 25)
_ships.remove(sprite);

由于我在这个方法中有一个目标(sprite),所以我很困惑应该在哪里添加代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接