用cocos2d定位

时间:2013-03-27 17:03:45

标签: ios cocos2d-iphone

Here is the source

问题在于我的射弹的起始和终止位置都是偏离的。我NSLogCGPoints所有CCSequence,我可以看到输入-(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]; } 的点是正确的。但是,我在屏幕上看到的内容却有所不同。

我认为最重要的一点是,如果创建一个新的CCSprite并像使用它一样使用它,那么路径就可以了。

这是游戏关卡层上的addProjectile方法(GameLevels:Level1Layer)

NSLog

和那些self.wizardHero语句的输出将是(仅供参考:弹丸是从self.redEnemy添加的,因此这是它的起始位置;目的地将是CCNode):

  

2013-03-27 10:41:57.295 GridWars [13025:c07]弹丸位置{105,   178}

     

2013-03-27 10:41:57.296 GridWars [13025:c07]向导位置{105,178}

     

2013-03-27 10:41:57.297 GridWars [13025:c07]向导位置世界空间   {105,178}

     

2013-03-27 10:41:57.298 GridWars [13025:c07]目的地位置{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]长度545.132080

     

2013-03-27 11:34:46.610 GridWars [13344:c07] realMoveDuration 1.946900

我意识到,对于超级课程,我有点难以说明是什么(有点为什么我包括了源代码)。基本上虽然我有三个主要的超级类,它们是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

然后实际实现这些

的三个类
#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

虽然问题已经略有发展,但我已经在cocos2d forums上发布了这个并得到了一些帮助,这让我达到了这一点(看到了射弹,但路径是错误的,而不是看到它们)。但它已经过了几天,所以希望得到更多的帮助。

GameProjectiles:CCNode

#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

BasicProjectile

{{1}}

1 个答案:

答案 0 :(得分:1)

由于你的射弹和目标位于一个单独的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边界框和位置,然后计算最终的rect取锚点(0.5,0.5)。

现在targetRectprojectileRect都是实际的屏幕坐标。