【问题标题】:How to use a SneakyJoystick to shoot bullets (cocos2d for iphone)?如何使用 SneakyJoystick 发射子弹(cocos2d for iphone)?
【发布时间】:2011-04-10 18:38:12
【问题描述】:

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

我该怎么做?

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

    }
}

但是什么也没发生 :(

【问题讨论】:

    标签: iphone objective-c cocos2d-iphone joystick


    【解决方案1】:

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

    上面的代码中有两个函数。第一个函数“applyVelocity”接受“velocity”、“current position”和“dela”,并在将velocity和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.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 解决方案适用于使用偷偷摸摸的输入操纵杆为子弹设置动画。下面是更新后的“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]];
         }
    

    【讨论】:

    • hmmm...子弹总是立即离开屏幕:子弹之前的位置:240.00000 //// 160.00000 2011-04-11 16:06:53.632 MusicSpawnTest[659:207] 位置子弹后:443.06921 //// 616.90576 我该如何解决这个问题?有什么想法吗?
    • 这取决于你想如何根据你的需要做......例如你可以减少delta......使用“1”而不是“50”然后检查其他值以查看它是如何行为以及它如何适合......但我认为如果你想制造子弹是错误的......在我看来,子弹应该是旅行......但在你的情况下,它只是传送到一个新的地方。 .. 你可以通过在你的子弹精灵上调用“runAction”方法来尝试 CCMoveBy 动作来动画子弹。
    • 哦,我真的忘记了 CCMoveBy。谢谢,工作! :) 你能用这个编辑你的答案以便我接受吗?谢谢: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]];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多