如何使用SneakyJoystick射击子弹(cocos2d for iphone)?

时间:2011-04-10 18:38:12

标签: 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 * 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);

    }
}

但没有任何反应:(

1 个答案:

答案 0 :(得分:1)

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

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

请注意,Sneaky Joystick会为您提供速度(方向和幅度),您必须使用它来查看要移动的方向以及移动的距离。

 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.postion”。


现在我假设您在tick()方法中调用了“canShootWithRightJoystick”函数,如代码注释中所述。因此,将按照您在计划选择器中指定的间隔一次又一次地调用此函数。无论何时调用它,它都会检查操纵杆速度并创建一个新的子弹精灵并更新其位置。

但问题是你在位置A创建了一个精灵,然后立即将它的位置改为B.所以你不会看到你的子弹从A行进到B.如果你的计算点B远离屏幕那么你什么也看不见。

检查控制台日志并添加新日志以在应用速度之前和应用速度之后查看“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);

用上面的代码替换你的最后一行“canShootWithRightJoystick”函数,并在控制台中查看输出。

我希望它有所帮助。


编辑:CCMoveBy解决方案用于使用sneakyInput操纵杆为子弹制作动画。下面是更新的“canShootWithRightJoystick”函数,


-(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]];
     }