SKSprite 没有定位到它应该定位的位置
SKSprite not positioning where it should
我在游戏中有一个角色,它应该会发射子弹。我已经为角色设置了一切,并设置了子弹穿过的路径。这是我正在使用的代码:
//The destination of the bullet
int x = myCharacter.position.x - 1000 * sin(myCharacter.zRotation);
int y = myCharacter.position.y + 1000 * cos(myCharacter.zRotation);
//The line to test the path
SKShapeNode* beam1 = [SKShapeNode node];
//The path
CGMutablePathRef pathToDraw = CGPathCreateMutable();
//The starting position for the path (i.e. the bullet)
//The NozzleLocation is the location of the nozzle on my character Sprite
CGPoint nozzleLoc=[self convertPoint:myCharacter.nozzleLocation fromNode:myCharacter];
CGPathMoveToPoint(pathToDraw, NULL, nozzleLoc.x, nozzleLoc.y);
CGPathAddLineToPoint(pathToDraw, NULL, x, y);
//The bullet
SKSpriteNode *bullet = [SKSpriteNode spriteNodeWithTexture:bulletTexture size:CGSizeMake(6.f, 6.f)];
bullet.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:3 center:bullet.position ];
[bullet.physicsBody setAffectedByGravity:NO];
[bullet.physicsBody setAllowsRotation:YES];
[bullet.physicsBody setDynamic:YES];
bullet.physicsBody.categoryBitMask = bulletCategory;
bullet.physicsBody.contactTestBitMask = boundsCategory;
//These log the correct locations for the character
//and the nozzle Location
NSLog(@"myposition: %@",NSStringFromCGPoint(myCharacter.position));
NSLog(@"nozloc: %@",NSStringFromCGPoint(nozzleLoc));
bullet.position = [bullet convertPoint:nozzleLoc fromNode:self];
[self addChild:bullet];
NSLog(@"Bullet Position: %@",NSStringFromCGPoint(bullet.position));
[bullet runAction:[SKAction followPath:pathToDraw duration:6.f]];
//I'm using this to test the path
beam1.path = pathToDraw;
[beam1 setStrokeColor:[UIColor redColor]];
[beam1 setName:@"RayBeam"];
[self addChild:beam1];
这是我从上面使用的 NSLogs 中得到的:
myposition: {122.58448028564453, 109.20420074462891}
nozloc: {145.24272155761719, 77.654090881347656}
Bullet Position: {145.24272155761719, 77.654090881347656}
所以一切都应该正常,对吧?但我遇到的问题是子弹是从稍微不同的位置射出的。从下图可以看出:
我对齐角色,让子弹从中间的那个小方块开始。这样你就可以看到子弹应该从哪里开始的距离(在我的角色拿着的枪前面),以及屏幕中间的正方形。
子弹在一条直线上正确行进,并且直线的角度与路径的角度相同(路径和直线子弹形成的是平行的,如图所示)。当我移动我的线时,子弹也会以同样的方式移动。我认为问题是节点之间的点转换,但我都试过了
[self convertPoint:myCharacter.nozzleLocation fromNode:myCharacter]
[bullet convertPoint:nozzleLoc fromNode: self]
[self convertPoint:nozzleLoc toNode:bullet]
但是,它们都会导致子弹的起点完全相同。你知道我为什么会遇到这个问题吗?是不是因为我使用 setScale
缩小了我的角色精灵(我将其设置为 0.3)?
非常感谢您的帮助。
这不是你的问题,但 nozzleLoc
已经在场景的坐标 space 中,所以它应该是:
bullet.position = nozzleLoc;
这将节省必须计算的快速第二次转换。
followPath:duration:
与 followPath:asOffset:orientToPath:duration:
和 asOffset: YES
相同——它使用您当前的位置作为路径的原点。请参阅文档 here。
要修复它,您需要 asOffset
为 NO
(需要上面的完整方法调用) 或 您可以保持原样并取出设置项目符号位置的代码行。
我在游戏中有一个角色,它应该会发射子弹。我已经为角色设置了一切,并设置了子弹穿过的路径。这是我正在使用的代码:
//The destination of the bullet
int x = myCharacter.position.x - 1000 * sin(myCharacter.zRotation);
int y = myCharacter.position.y + 1000 * cos(myCharacter.zRotation);
//The line to test the path
SKShapeNode* beam1 = [SKShapeNode node];
//The path
CGMutablePathRef pathToDraw = CGPathCreateMutable();
//The starting position for the path (i.e. the bullet)
//The NozzleLocation is the location of the nozzle on my character Sprite
CGPoint nozzleLoc=[self convertPoint:myCharacter.nozzleLocation fromNode:myCharacter];
CGPathMoveToPoint(pathToDraw, NULL, nozzleLoc.x, nozzleLoc.y);
CGPathAddLineToPoint(pathToDraw, NULL, x, y);
//The bullet
SKSpriteNode *bullet = [SKSpriteNode spriteNodeWithTexture:bulletTexture size:CGSizeMake(6.f, 6.f)];
bullet.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:3 center:bullet.position ];
[bullet.physicsBody setAffectedByGravity:NO];
[bullet.physicsBody setAllowsRotation:YES];
[bullet.physicsBody setDynamic:YES];
bullet.physicsBody.categoryBitMask = bulletCategory;
bullet.physicsBody.contactTestBitMask = boundsCategory;
//These log the correct locations for the character
//and the nozzle Location
NSLog(@"myposition: %@",NSStringFromCGPoint(myCharacter.position));
NSLog(@"nozloc: %@",NSStringFromCGPoint(nozzleLoc));
bullet.position = [bullet convertPoint:nozzleLoc fromNode:self];
[self addChild:bullet];
NSLog(@"Bullet Position: %@",NSStringFromCGPoint(bullet.position));
[bullet runAction:[SKAction followPath:pathToDraw duration:6.f]];
//I'm using this to test the path
beam1.path = pathToDraw;
[beam1 setStrokeColor:[UIColor redColor]];
[beam1 setName:@"RayBeam"];
[self addChild:beam1];
这是我从上面使用的 NSLogs 中得到的:
myposition: {122.58448028564453, 109.20420074462891}
nozloc: {145.24272155761719, 77.654090881347656}
Bullet Position: {145.24272155761719, 77.654090881347656}
所以一切都应该正常,对吧?但我遇到的问题是子弹是从稍微不同的位置射出的。从下图可以看出:
我对齐角色,让子弹从中间的那个小方块开始。这样你就可以看到子弹应该从哪里开始的距离(在我的角色拿着的枪前面),以及屏幕中间的正方形。
子弹在一条直线上正确行进,并且直线的角度与路径的角度相同(路径和直线子弹形成的是平行的,如图所示)。当我移动我的线时,子弹也会以同样的方式移动。我认为问题是节点之间的点转换,但我都试过了
[self convertPoint:myCharacter.nozzleLocation fromNode:myCharacter]
[bullet convertPoint:nozzleLoc fromNode: self]
[self convertPoint:nozzleLoc toNode:bullet]
但是,它们都会导致子弹的起点完全相同。你知道我为什么会遇到这个问题吗?是不是因为我使用 setScale
缩小了我的角色精灵(我将其设置为 0.3)?
非常感谢您的帮助。
这不是你的问题,但 nozzleLoc
已经在场景的坐标 space 中,所以它应该是:
bullet.position = nozzleLoc;
这将节省必须计算的快速第二次转换。
followPath:duration:
与 followPath:asOffset:orientToPath:duration:
和 asOffset: YES
相同——它使用您当前的位置作为路径的原点。请参阅文档 here。
要修复它,您需要 asOffset
为 NO
(需要上面的完整方法调用) 或 您可以保持原样并取出设置项目符号位置的代码行。