我做了一个小小的SpriteKit游戏,敌人跟随UIBezierPath。 (有没有其他方法可以做到这一点?这似乎非常无益)
无论如何,我的敌人表现得非常奇怪。这是一个直径为300的简单圆的代码:
enemy.position = CGPointMake(0, 0);
UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, 300, 300)];
CGPathRef pathRef = [cicrlePath CGPath];
SKAction *followPath = [SKAction followPath:pathRef
asOffset:NO
orientToPath:NO
duration: pathSpeed];
SKAction *forever = [SKAction repeatActionForever:followPath];
[enemy runAction:forever];
现在看看我如何指定敌人位置和(0,0)处的circlePath位置?
不知怎的,它给了我这个结果:http://www.gfycat.com/DistinctSnarlingAracari
我认为这不是真的有意义,因为它不合适吗?或者我错过了什么?
哦,就像我之前提到的那样,我怎么能以最有效/最有成效的方式为我的游戏做敌人动作?我目前正在使用带有UIBeziers的PaintCode,但它总是给我一个奇怪的结果。我真的很期待你的回答..
答案 0 :(得分:1)
我认为您不理解-[UIBezierPath bezierPathWithOvalInRect:]
或CGRectMake
。您的0, 0
是椭圆的边界框的左上角,而不是中心,300, 300
是该边界框的宽度和高度。如果您希望椭圆体位于0, 0
的中心位置,请尝试以下操作:
UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect:
CGRectMake(-150, -150, 300, 300)];
答案 1 :(得分:1)
UIBezier椭圆形路径的中心位于(x +宽度/ 2,y +高度/ 2)。从角度= 0开始(椭圆上的最右边点,即(x +宽度,y +高度/ 2)),在场景坐标中逆时针绘制椭圆。因此,精灵将沿逆时针方向沿椭圆形路径行进,因为它沿着绘制路径的方向移动。
以下是可能对您有用的代码:
此方法创建一个以指定CGRect的位置(原点)为中心的椭圆路径。
- (CGPathRef) ovalInRect:(CGRect)rect
{
CGFloat width = rect.size.width;
CGFloat height = rect.size.height;
CGFloat x = rect.origin.x-rect.size.width/2;
CGFloat y = rect.origin.y-rect.size.height/2;
return[UIBezierPath bezierPathWithOvalInRect: CGRectMake(x, y, width, height)].CGPath;
}
此方法创建一个沿圆形路径移动节点的SKAction。参数 指定路径的中心,半径和方向(YES =顺时针,NO =逆时针)。
- (SKAction *) createCircularPathActionAtLocation:(CGPoint)center
withRadius:(CGFloat)radius
andDirectionCW:(BOOL)directionCW
{
CGRect rect = CGRectMake(center.x, center.y, radius*2, radius*2);
CGPathRef ovalPath = [self ovalInRect:rect];
SKAction *circlePathAction = [SKAction followPath:ovalPath asOffset:NO orientToPath:YES duration:5];
SKAction *action;
if (directionCW) {
// Reverse the action to follow the path in the opposite direction
action = [SKAction repeatActionForever:[circlePathAction reversedAction]];
}
else {
action = [SKAction repeatActionForever:circlePathAction];
}
return action;
}
旁注:如果您使用的是PaintCode 2,则可以使用变量而不是绝对值来概括它生成的代码。