我的iOS应用程序中的精灵在水平方向上横向移动,从左到右,从右到左。对于大多数这些精灵,可以接受直线或明确定义的弧。然而,我有一些精灵,我希望随机移动一点,特别是在精灵移动时改变精灵的垂直位置。
在以下代码中," y_variant _"是一个ivar,它指定了我想要应用的方差程度。它对于像鸟类这样的自然物体或像纸飞机这样的人造物体来说是一个较小的值,它们只能在飞行时上下移动少量,但对于像昆虫和蜜蜂这样的自然物体来说,它们具有更大的变化
这是我目前使用的代码("更新:"精灵方法):
// track/vary the object as it moves along its path...
- ( void ) update: ( ccTime ) delta
{
// ask director for the window size...
CGSize const size = [ [ CCDirector sharedDirector ] winSize ];
// get the current position of the projectile...
CGPoint const ptRaw = [ self position ];
// create a variant of the vertical position for "intelligent" items...
CGPoint const pt = ( y_variant_
? ccp( ptRaw.x
, ptRaw.y + y_variant_ * (float)( rand( ) % 25 ) * 0.02f - fmodf( ptRaw.x, y_variant_ )
)
: ptRaw
);
[ self setPosition: pt ];
:
:
:
// if we're supposed to stop the projectile on impact (a "brick wall", etc.)...
if ( fStopProjectile == ObjectImpactActionStop )
{
// object impact, if this is a "smart" projectile (i.e., something with a brain)...
if ( y_variant_ )
{
// move the projectile around the object...
CCAction * const move = [ CCMoveTo actionWithDuration: 0.25f
position: ccpAdd( [ self position ]
, ccp( - CS_IMAGE_OBJECT_W
, CS_IMAGE_OBJECT_H
)
)
];
[ self runAction: move ];
} // end "smart" projectile
} // end projectile impact
:
:
:
return;
} // end update
您会注意到涉及与固体物体碰撞的逻辑:如果遇到坚固的障碍物(墙壁,建筑物等),物体会后退并垂直移动以避开障碍物。 / p>
我遇到的问题是,对于较大的" y_variant _"值,观看的动作非常不稳定,我希望它看起来更平滑....
即使您没有解决方案,也欢迎任何有关可以改进或调查的内容的评论。
感谢您的帮助。
p.s。:如果您感到雄心勃勃,那么用户的一个建议是让蜜蜂非常偶尔向后循环然后继续它的路径。一旦我修复了当前"弹跳"问题,我会加入,所以请记住这一点......
答案 0 :(得分:1)
你的问题没有简单的答案。但是如果你正在使用Cocos2d,我会考虑使用动作而不是手动定位精灵。所以重申一下,我建议你研究一下使用动作。但是这里有一个简单的例子,如果你坚持手动定位可能会有所帮助:
#define kAmountToMovePerFrameInY 10.0 / 60.0
@property float posYCurrentlyMovingTo;
@property SomeSpriteClass *theSpriteMoving;
@property float someXPosition;
@property float nextMoveAmount;
-(void)doStuffDuringUpdate
{
if (_theSpriteMoving.position.y < labs(_posYCurrentlyMovingTo)) {
//sprite is still moving to its position
_theSpriteMoving.position = CGPointMake(_someXPosition, _theSpriteMoving.position.y + _nextMoveAmount);
}else{
float variationAmountInY = arc4random_uniform(200) - 100.0;
_posYCurrentlyMovingTo = variationAmountInY;
_nextMoveAmount = variationAmountInY * kAmountToMovePerFrameInY;
}
}