我有一个带方向键和2个按钮的游戏手柄。所有这些都是数字化的(不是模拟的)。
我有一个处理他们事件的程序:
-(void)gamepadTick:(float)delta
{
...
if ([gamepad.B active]) {
[ship shoot];
}
...
}
我通过命令调用它:
[self schedule:@selector(gamepadTick:) interval:1.0 / 60];
[舰船射击]从武器类调用射击功能:
-(void)shoot
{
Bullet *bullet = [Bullet bulletWithTexture:bulletTexture];
Ship *ship = [Ship sharedShip];
bullet.position = [ship getWeaponPosition];
[[[CCDirector sharedDirector] runningScene] addChild:bullet];
CGSize winSize = [[CCDirector sharedDirector] winSize];
int realX = ship.position.x;
int realY = winSize.height + bullet.contentSize.height / 2;
CGPoint realDest = ccp(realX, realY);
int offRealX = realX - bullet.position.x;
int offRealY = realY - bullet.position.y;
float length = sqrtf((offRealX*offRealX) + (offRealY*offRealY));
float velocity = 480/1; // 480pixels/1sec
float realMoveDuration = length / velocity;
[bullet runAction:[CCSequence actions:[CCMoveTo actionWithDuration:realMoveDuration position:realDest],
[CCCallFuncN actionWithTarget:self selector:@selector(bulletMoveFinished:)], nil]];
}
-(void)bulletMoveFinished:(id)sender
{
CCSprite *sprite = (CCSprite *)sender;
[[[CCDirector sharedDirector] runningScene] removeChild:sprite cleanup:YES];
}
问题是武器射出了太多的子弹。是否可以在不使用定时器和每个按钮和方向键分开的功能的情况下减少其数量?
答案 0 :(得分:1)
使用Delta来跟踪拍摄之间的时间,并且仅在增量增加一定量时拍摄。这是一种常见的做事方式,你不需要每一帧。
你需要保持一个iVar计时器的时间,每次拍摄时增加Delta,然后测试经过的时间,看它是否符合你想要的间隔阈值;如果是,则拍摄并将经过的时间重置为0.
答案 1 :(得分:0)
-(void) update:(ccTime)delta {
totalTime += delta;
if (fireButton.active && totalTime > nextShotTime) {
nextShotTime = totalTime + 0.5f;
GameScene* game = [GameScene sharedGameScene];
[game shootBulletFromShip:[game defaultShip]];
}
// Allow faster shooting by quickly tapping the fire button if (fireButton.active == NO)
{
nextShotTime = 0;
}
}
这是Steffen Itterheim撰写的“学习cocos2d游戏开发”一书中的原始代码。 但我可以稍微改进一下这段代码。
<强>更新强>
理解我的代码比原始代码更难,但它具有正确的结构。它意味着以下内容: - 全局计时器属于一个场景; - 船可以通过武器射击; - 武器可以用子弹射击,子弹之间的延迟属于这种武器(不是原始例子中的场景)
Scene类包含totalTime变量,ship对象和以下处理计时器更新的方法:
-(void)update:(ccTime)delta
{
totalTime += delta;
if (!fireButton.active) {
ship.weapon.nextShotTime = 0;
} else if (totalTime > ship.weapon.nextShotTime) {
[ship.weapon updateNextShotTime:totalTime];
[ship shoot];
}
}
Ship类包含武器对象和射击方法(此方法对于此问题不是实际的)。
武器类包含nextShotTime变量和以下方法:
-(void)updateNextShotTime:(ccTime)currentTime
{
nextShotTime = currentTime + 0.05f;
}