问题是我的射弹的起始位置和结束位置相差很大。我有NSLog
全部CGPoints
从我可以看到的点被输入 CCSequence
是正确的。但我在屏幕上看到的情况却有所不同。
我认为问题的一个重要线索是,如果创建一个新的 CCSprite 并像我处理射弹一样使用它,路径就会起作用。
这是游戏关卡图层上的 addProjectile 方法(GameLevels:Level1Layer)
-(void)addProjectile:(Projectiles*)projectile
{
NSLog(@"projectile position %@",NSStringFromCGPoint(projectile.position));
NSLog(@"wizard position %@",NSStringFromCGPoint(self.wizardHero.position));
NSLog(@"wizard position worldspace %@",NSStringFromCGPoint([self convertToWorldSpace:self.wizardHero.position]));
NSLog(@"destination position %@",NSStringFromCGPoint(projectile.destination.position));
[self addChild:projectile];
// Determine where we wish to shoot the projectile to
int realX;
CGPoint diff = ccpSub(projectile.destination.position,projectile.position);
if (diff.x > 0)
{
realX = (self.tileMap.mapSize.width * self.tileMap.tileSize.width) +
(projectile.contentSize.width/2);
} else {
realX = -(self.tileMap.mapSize.width * self.tileMap.tileSize.width) -
(projectile.contentSize.width/2);
}
float ratio = (float) diff.y / (float) diff.x;
int realY = ((realX - projectile.position.x) * ratio) + projectile.position.y;
CGPoint realDest = ccp(realX, realY);
// Determine the length of how far we're shooting
int offRealX = realX - projectile.position.x;
int offRealY = realY - projectile.position.y;
float length = sqrtf((offRealX*offRealX) + (offRealY*offRealY));
float velocity = 280/1; // 280pixels/1sec
float realMoveDuration = length/velocity;
// Move projectile to actual endpoint
id actionMoveDone = [CCCallFuncN actionWithTarget:self
selector:@selector(projectileMoveFinished:)];
[projectile runAction:
[CCSequence actionOne:
[CCMoveTo actionWithDuration: realMoveDuration
position: realDest]
two: actionMoveDone]];
[self.projectiles addObject:projectile];
}
以及 NSLog
的输出语句将是(仅供引用:射弹是从 self.wizardHero
添加的,因此这是它的起始位置;目的地将是 self.redEnemy
):
2013-03-27 10:41:57.295 GridWars[13025:c07] projectile position {105, 178}
2013-03-27 10:41:57.296 GridWars[13025:c07] wizard position {105, 178}
2013-03-27 10:41:57.297 GridWars[13025:c07] wizard position worldspace {105, 178}
2013-03-27 10:41:57.298 GridWars[13025:c07] destination position {299, 174}
2013-03-27 11:34:46.608 GridWars[13344:c07] realDest {650, 166}
2013-03-27 11:34:46.608 GridWars[13344:c07] length 545.132080
2013-03-27 11:34:46.610 GridWars[13344:c07] realMoveDuration 1.946900
我意识到,对于 super 类,我有点难以判断发生了什么(这就是为什么我包含源代码)。基本上,我有三个主要的 super 类,它们是 CCNode
的子类。
Projectiles : CCNode
sprite : CCSprite
destination : GameCharacters
damage : int
GameLevels : CCNode
hud : HudLayer
tileMap : CCTMXTiledMap
enemies : NSMutablArray
projectiles : NSMutablArray
GameCharacters : CCNode
hp : int
juice : int
sprite : CCSprite
selectedTargets : NSMutablArray
hostLayer : GameLevels
然后是实际实现这些的三个类
BasicProjectile : Projectiles
Level1Layer : GameLevels
WizardHero : GameCharacter
RedEnemy : GameCharacter
虽然问题略有进展,但我已将其发布在 cocos2d forums 上并得到了一些帮助,这让我走到了这一步(看到射弹,但路径错误与根本看不到它们)。但已经过去几天了,希望获得更多帮助。
游戏转换物:CCNode
#import "CCNode.h"
//forward declaration because we just need to hold a reference
@class GameCharacters;
@interface GameProjectiles : CCNode
@property(nonatomic, strong) CCSprite * sprite;
@property(nonatomic,strong) GameCharacters * destination;
@property(nonatomic) int damage;
-(id)initWithDestination:(GameCharacters*)Destination;
-(CGSize)contentSize;
@end
#import "GameProjectiles.h"
@implementation GameProjectiles
-(id)initWithDestination:(GameCharacters*)Destination
{
if (self = [super init]) {
_damage = 0;
_destination = Destination;
}
return self;
}
-(CGSize)contentSize{
return self.sprite.contentSize;
}
-(void)setPosition:(CGPoint)position
{
[super setPosition:position];
self.sprite.position = position;
}
@end
基本转换物
#import "GameProjectiles.h"
@interface BasicProjectile : GameProjectiles
@end
#import "BasicProjectile.h"
@implementation BasicProjectile
-(id)initWithDestination:(GameCharacters*)Destination
{
if (self = [super init]) {
self.damage = 25;
self.sprite = [CCSprite spriteWithFile:@"Projectile.png"];
[self addChild:self.sprite z:1000 ];
self.destination = Destination;
}
return self;
}
@end
最佳答案
由于您的射弹和目标位于单独的 CCNode 内,因此它们的边界框返回其父级内的位置,而不是实际的屏幕坐标(在您的情况下是您想要的)。
要转换 pos,你可以这样做
CGPoint targetPos = [basicProjectile.destination.sprite.parent convertToWorldSpace:basicProjectile.destination.sprite.position];
NSLog(@"targetPos %@",NSStringFromCGPoint(targetPos));
CGRect targetRect = [self boundingRectForSprite:basicProjectile.destination.sprite andPos:targetPos];
CGPoint projectilePos = [basicProjectile.sprite.parent convertToWorldSpace:basicProjectile.sprite.position];
NSLog(@"projectilePos %@",NSStringFromCGPoint(projectilePos));
CGRect projectileRect = [self boundingRectForSprite:basicProjectile.destination.sprite andPos:projectilePos];
boundingRectForSprite
方法使用 Sprite 边界框和位置,然后计算出最终的矩形,其 anchor 为(0.5,0.5)。
现在 targetRect
和 projectileRect
是实际的屏幕坐标。
关于ios - 使用cocos2d定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15664915/