2013-05-07 2 views
0

Я разрабатываю приложение для Android-игр, используя движок игры Cocos2d-android, в моей игре есть пушка, когда игрок нажимает на игровой «снаряд», срабатывает, но в соответствии с моими требованиями при нажатии на наконечник пушки «снаряд» должен выходить, это можно сделать, используя задание пушки, но здесь пушки вращаются, поэтому застрял в задании. Вот кодКак сделать «снарядом» (пули), чтобы он срабатывал при касании или касании наконечника пушки в cocos2d android

public class GameL extends CCLayer{ 

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(); 
    CCLayer layer = new GameL(); 

    scene.addChild(layer); 

    return scene;  
} 


protected GameL() 
{ 
    this.setIsTouchEnabled(true); 

    _targets = new LinkedList<CCSprite>(); 
    _projectiles = new LinkedList<CCSprite>(); 
    _projectilesDestroyed = 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); 

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

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

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

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

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

Не могли бы вы пытаетесь сказать нам, что вы видите на экране? И что происходит, когда вы касаетесь кнопки? Чем больше информации вы предоставляете, тем лучше мы можем вам помочь. –

+0

На экране есть пушка на изображении корабля, когда я прикасаюсь к любому месту на экране, пуля вылетает из пушки, но я хочу, чтобы пули срабатывали только при касании пушки нигде на экране @ChristianVeenman –

ответ

1

Вероятно, вы должны добавить состояние спрайта и сенсорным место канонического заменить код ниже с touchBegan

public boolean ccTouchesBegan(MotionEvent event) 
    { 
     CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY())); 

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

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


     for (CCSprite target : targets) 
      { 

       if (CGRect.containsPoint((target.getBoundingBox()), location)) 
        { 

         // 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 

         _nextProjectile.setTag(3); 
         // 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; 
         System.out.println(" - t tag!!!!!!!!!!!!!!!!!!!!! - "); 
         _nextProjectile.runAction(CCSequence.actions(CCMoveTo.action(realMoveDuration, realDest), 
           CCCallFuncN.action(this, "spriteMoveFinished"))); 
         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); 

         target.runAction(CCSequence.actions(
           CCRotateTo.action((float) rotationDuration, (float) cocosAngle), 
           CCCallFunc.action(this, "finishShoot"))); 
         break; 
        } 
      } 


     return true; 
    } 
+0

это работает благодаря alot :) @ Гаджини –

1

Я честно признаю, что я никогда не использовал Cocos2d-андроид игры двигатель, , но я надеюсь, что я могу предоставить некоторую помощь.

Сначала вы упомянули в комментарии следующее: вы касаетесь в любом месте экрана, а затем пушечные огни, но то, что вы хотите, должно только выстрелить снарядом при касании пушки.

Каждый раз, когда вы касаетесь экрана public boolean ccTouchesEnded (событие MotionEvent). Если вы добавляете оператор if в верхней части функции ccTouchesEnded, которая проверяет, находится ли касание в пределах области размещения пушки, это может сделать трюк. Координаты, в которых коснулся экран, предположительно находятся в объекте MotionEvent, предоставляемом функцией.

Так следующее псевдокода может сделать трюк:

ПРИМЕЧАНИЯ: Я предполагаю, что координаты изображения является слева под угловой

public boolean ccTouchesEnded(MotionEvent event) 
{ 
    if(event.isTouchedOnX() < CannonX 
    || event.isTouchedOnX() > CannonX + horizontalSizeOfCannonImage 
    || event.isTouchedOnY() < CannonY 
    || event.isTouchedOnY() > CannonY + verticalsizeOfCannonImage) 
    { 
     // Don't do a thing and see the event as processed 
     return true; // You might want to check what the boolean returning the function really means but it might presumably mean that the event does not need further processing by the window. 
    } 

    ... The rest of the code. 
} 

Я действительно надеюсь, что это поможет!

Christian

Смежные вопросы