想看懂上面写的代码吗??如果是,那么这里有一些描述,
上面的代码中有两个函数。第一个函数“applyVelocity”获取“速度”、“当前位置”和“dela”,并在将速度和增量添加到当前位置后返回一个新位置。
请注意,偷偷摸摸的操纵杆为您提供速度(方向和幅度),您必须使用它来查看要移动的方向和移动量。
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]];
}