如何使用暗中操纵杆发射子弹(iphone的cocos2d)?

如何使用暗中操纵杆发射子弹(iphone的cocos2d)?,iphone,objective-c,cocos2d-iphone,joystick,Iphone,Objective C,Cocos2d Iphone,Joystick,我想用一个偷偷摸摸的操纵杆来射击子弹。每次操纵杆处于激活状态时,它都应该向操纵杆指向的方向发射一颗子弹 我该怎么做 PS:如果有人能解释代码那就太好了。我想了解它;) 编辑: static CGPoint applyVelocity(CGPoint velocity, CGPoint position, float delta){ return CGPointMake(position.x + velocity.x * delta, position.y + velocity.y * d

我想用一个偷偷摸摸的操纵杆来射击子弹。每次操纵杆处于激活状态时,它都应该向操纵杆指向的方向发射一颗子弹

我该怎么做

PS:如果有人能解释代码那就太好了。我想了解它;)

编辑

static CGPoint applyVelocity(CGPoint velocity, CGPoint position, float delta){
    return CGPointMake(position.x + velocity.x * delta, position.y + velocity.y * delta);
}
-(void)canShootWithRightJoystick { //called in tick method
    if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0) {

        CCSprite* sp = [CCSprite spriteWithFile:@"red.png"];
        sp.position = player.position;
        [self addChild:sp z:10];

        CGPoint vel = hudLayer.rightJoystick.velocity;
        CCLOG(@"%.5f //// %.5f",vel.x,vel.y);
        vel = ccpMult(ccpNormalize(vel), 50);
        sp.position = applyVelocity(vel,player.position, 50);

    }
}

但是什么也没发生:(

你想理解上面写的代码吗?如果是,那么这里有一些描述

上面的代码中有两个函数。第一个函数“applyVelocity”接受“速度”、“当前位置”和“dela”,并在将速度和delta添加到当前位置后返回一个新位置

请注意,鬼鬼祟祟的操纵杆给你速度(方向和大小),你必须使用它来查看移动的方向和移动的幅度

 if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0)
上一行检查速度的X和Y分量是否不为零,这意味着操纵杆处于活动状态并且正在移动

CCSprite* sp = [CCSprite spriteWithFile:@"red.png"];
sp.position = player.position;
[self addChild:sp z:10];
在这里,您创建了一个子弹精灵“sp”,并将其位置设置为与玩家相同的位置,然后将该精灵添加到图层中,使其可见

现在你的子弹精灵被创建了,你必须移动它

CGPoint vel = hudLayer.rightJoystick.velocity;
CCLOG(@"%.5f //// %.5f",vel.x,vel.y);
vel = ccpMult(ccpNormalize(vel), 50);
sp.position = applyVelocity(vel,player.position, 50);
在上面的代码中,您从操纵杆获得速度,它给出操纵杆的当前状态,然后将该速度向量乘以50(您的选择),然后调用“applyVelocity”函数来计算子弹精灵的新位置,并将该新位置指定给子弹“sp.position”


现在我假设您正在tick()中调用“canshootwithrightcoogle”函数方法。因此,此函数将按照您在日程选择器中指定的时间间隔一次又一次地调用。每当调用此函数时,它都会检查操纵杆速度并创建新的子弹精灵并更新其位置

但问题是,您正在位置a创建一个精灵,然后立即将其位置更改为B。因此,您不会看到子弹从a移动到B。如果您的计算点B远离屏幕,那么您将什么也看不到

在应用velocity之前和应用velocity之后,检查控制台日志并添加新日志以查看“sp.position”的值,如

CCLOG(@"Postion of bullet before: %.5f //// %.5f",sp.position.x,sp.position.y);
sp.position = applyVelocity(vel,player.position, 50);
CCLOG(@"Postion of bullet after: %.5f //// %.5f",sp.position.x,sp.position.y);
用上面的代码替换最后一行“CanShootWithRightGamego”功能,并查看控制台中的输出

我希望有帮助


编辑:CCMoveBy解决方案用于使用SleekyInput操纵杆设置子弹的动画。下面是更新的“CanshootWithRight操纵杆”功能



嗯……子弹总是立刻从屏幕上消失:子弹之前的位置:240.00000///160.00000 2011-04-11 16:06:53.632 MusicSpawnTest[659:207]子弹之后的位置:443.06921///616.90576我如何解决这个问题?有什么想法吗?这取决于你根据需要想怎么做……例如,你可以减少增量……使用“1”而不是“50”,然后检查其他值,看看它的行为如何,它如何适合…但我认为如果你试图制造子弹是错误的…子弹在我看来应该旅行…但在你的情况下,它只是传送到一个新的地方…你可以通过调用“runAction”尝试CCMoveBy action方法来设置子弹的动画。哦,我真的忘了CCMoveBy。谢谢你这么做!:)你能用这个编辑你的答案吗?谢谢:CCSprite*sp=[CCSprite spriteWithFile:@“red.png”];sp.position=player.position;[self addChild:sp z:10];CGPoint vel=hudLayer.rightcoogle.velocity;vel=ccpMult(CCPMULATE(vel),1000);[sp runAction:[CCMoveBy Action WithDuration:3位置:vel]];
-(void)canShootWithRightJoystick { //called in tick method
    if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0) {
        CCSprite* sp = [CCSprite spriteWithFile:@"red.png"]; 
        sp.position = player.position; 
        [self addChild:sp z:10]; 
        CGPoint vel = hudLayer.rightJoystick.velocity; 
        vel = ccpMult(ccpNormalize(vel), 1000); 
        [sp runAction:[CCMoveBy actionWithDuration:3 position:vel]];
     }