2013-05-11 174 views
0

在我的cocos2d-android遊戲應用程序中,有一個子彈,目標和一艘船,如果子彈和目標相交會消失,這個工作正常,但是當目標墜落在船(相交)船沒有被刪除,我試圖在谷歌搜索,但無法解決問題,請幫助我,如果有人知道這一點。 這裏是它如何刪除與其他精靈相交的精靈cocos2d-android

public class GameL extends CCLayer{ 
protected LinkedList<CCSprite> _ships; 
protected LinkedList<CCSprite> _targets; 
protected LinkedList<CCSprite> _projectiles; 
//protected int _projectilesDestroyed; 
protected int _shipDestroyed; 
protected CCSprite _player; 
protected CCSprite _nextProjectile; 
protected CCSprite ship; 

public static CCScene scene() 
{ 
    CCScene scene = CCScene.node(); 
    CCLayer layer = new GameL(); 
    scene.addChild(layer); 
    return scene;  
} 


protected GameL() 
{ 
    this.setIsTouchEnabled(true); 
    _ships = new LinkedList<CCSprite>(); 
    _targets = new LinkedList<CCSprite>(); 
    _projectiles = new LinkedList<CCSprite>(); 
    //_projectilesDestroyed = 0; 
    _shipDestroyed = 0; 

    CCSprite background = CCSprite.sprite("bg.png"); 
    background.setTag(1); 
    background.setAnchorPoint(0, 0); 
    addChild(background); 

    Context context = CCDirector.sharedDirector().getActivity(); 

    CGSize winSize = CCDirector.sharedDirector().displaySize(); 
_player = CCSprite.sprite("gun2.png"); 
_player.setPosition(CGPoint.ccp(65,120)); 
// _player.setPosition(CGPoint.ccp(_player.getContentSize().width/2.0f, winSize.height/2.0f)); 
    addChild(_player); 

    CCSprite ship = CCSprite.sprite("ship150.png"); 
    ship.setPosition(CGPoint.ccp(25,100)); 
    ship.setAnchorPoint(CGPoint.ccp(0,0)); 
    ship.setTag(4); 
     addChild(ship); 

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


@Override 
public boolean ccTouchesEnded(MotionEvent event) 
{ 
    // Choose one of the touches to work with 
    CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY())); 

    // Set up initial location of projectile 
    CGSize winSize = CCDirector.sharedDirector().displaySize(); 
CCSprite _nextProjectile = CCSprite.sprite("firebl.png"); 

    //_nextProjectile.setPosition(20, winSize.height/2.0f); 
_nextProjectile.setPosition(CGPoint.ccp(65, 120)); 

    // Determine offset of location to projectile 
    int offX = (int)(location.x - _nextProjectile.getPosition().x); 
    int offY = (int)(location.y - _nextProjectile.getPosition().y); 

    // Bail out if we are shooting down or backwards 
    if (offX <= 0) 
     return true; 

    _nextProjectile.setTag(2); 

    // Determine where we wish to shoot the projectile to 
    int realX = (int)(winSize.width + (_nextProjectile.getContentSize().width/2.0f)); 
    float ratio = (float)offY/(float)offX; 
    int realY = (int)((realX * ratio) + _nextProjectile.getPosition().y); 
    CGPoint realDest = CGPoint.ccp(realX, realY); 

    // Determine the length of how far we're shooting 
    int offRealX = (int)(realX - _nextProjectile.getPosition().x); 
    int offRealY = (int)(realY - _nextProjectile.getPosition().y); 
    float length = FloatMath.sqrt((offRealX * offRealX) + (offRealY * offRealY)); 
    float velocity = 480.0f/1.0f; // 480 pixels/1 sec 
    float realMoveDuration = length/velocity; 

    // Move projectile to actual endpoint 
    _nextProjectile.runAction(CCSequence.actions(
      CCMoveTo.action(realMoveDuration, realDest), 
      CCCallFuncN.action(this, "spriteMoveFinished"))); 

    // Determine angle to face 
    double angleRadians = Math.atan((double)offRealY/(double)offRealX); 
    double angleDegrees = Math.toDegrees(angleRadians); 
    double cocosAngle = -1 * angleDegrees; 
    double rotationSpeed = 0.5/Math.PI; 
    double rotationDuration = Math.abs(angleRadians * rotationSpeed); 
    _player.runAction(CCSequence.actions(
      CCRotateTo.action((float)rotationDuration, (float)cocosAngle), 
      CCCallFunc.action(this, "finishShoot"))); 

    // Pew! 
    Context context = CCDirector.sharedDirector().getActivity(); 
    SoundEngine.sharedEngine().playEffect(context, R.raw.pew_pew_lei); 

    return true; 
} 

public void finishShoot() 
{ 
    addChild(_nextProjectile); 
    _projectiles.add(_nextProjectile); 
} 

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

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); 

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

     LinkedList<CCSprite> shipsToDelete = new LinkedList<CCSprite>(); 
     for (CCSprite ship : _ships) 
     { 
       CGRect shipRect = CGRect.make(ship.getPosition().x - (ship.getContentSize().width), 
              ship.getPosition().y - (ship.getContentSize().height), 
              ship.getContentSize().width,ship.getContentSize().height); 


       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); 


        if (CGRect.intersects(targetRect, shipRect)) 
         { 
           shipsToDelete.add(ship); 
           break; 
         } 
       }      
     } 

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

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

     for (CCSprite ship : shipsToDelete) 
     { 
      _ships.remove(ship); 
      removeChild(ship, true); 
     } 
    } 

    for (CCSprite projectile : projectilesToDelete) 
    { 
     _projectiles.remove(projectile); 
     removeChild(projectile, true); 

     if (_shipDestroyed > 0) 
     { 
      _shipDestroyed = 0; 
      CCDirector.sharedDirector().replaceScene(Gameoverlayer.scene("You Win!")); 
     } 
    } 

} 

protected void addTarget() 
{ 
    Random rand = new Random(); 
    CCSprite target = CCSprite.sprite("fireball.png"); 

    // Determine where to spawn the target along the Y axis 
    CGSize winSize = CCDirector.sharedDirector().displaySize(); 
    int minX = (int)(target.getContentSize().width/2.0f); 
    int maxX = (int)(winSize.width - target.getContentSize().width/2.0f); 
    int rangeX = maxX - minX; 
    int actualX = rand.nextInt(rangeX) + minX; 
    // Create the target slightly off-screen along the right edge, 
    // and along a random position along the Y axis as calculated above 
// target.setPosition(getContentSize().width + (target.getContentSize().width/2.0f), actualX); 
    target.setPosition(actualX, winSize.height + target.getContentSize().height); 
    addChild(target); 
    target.setTag(1); 
    _targets.add(target); 

    // Determine speed of the target 
    int minDuration = 2; 
    int maxDuration = 4; 
    int rangeDuration = maxDuration - minDuration; 
    int actualDuration = rand.nextInt(rangeDuration) + minDuration; 

    // Create the actions 
    //CCMoveTo actionMove = CCMoveTo.action(actualDuration, CGPoint.ccp(-target.getContentSize().width/2.0f, actualX)); 
    CCMoveTo actionMove = CCMoveTo.action(actualDuration, CGPoint.ccp(actualX, - target.getContentSize().height)); 
    CCCallFuncN actionMoveDone = CCCallFuncN.action(this, "spriteMoveFinished"); 
    CCSequence actions = CCSequence.actions(actionMove, actionMoveDone); 

    target.runAction(actions); 
} 

public void spriteMoveFinished(Object sender) 
{ 
    CCSprite sprite = (CCSprite)sender; 

    if (sprite.getTag() == 1) 
    { 
     _targets.remove(sprite); 

     _shipDestroyed = 0; 
     //CCDirector.sharedDirector().replaceScene(Gameoverlayer.scene("You Lose :(")); 
    } 
    else if (sprite.getTag() == 2) 
     _projectiles.remove(sprite); 

    this.removeChild(sprite, true); 
} 
    } 

回答

0

你確定你用它來檢測碰撞rects是正確的代碼?據我所知,精靈的默認定位點是{0.5; 0.5},因此rect計算更像:

CGRect shipRect = CGRect.make(ship.getPosition().x - (ship.getContentSize().width/2), 
              ship.getPosition().y - (ship.getContentSize().height/2), 
              ship.getContentSize().width,ship.getContentSize().height);