弹丸没有从正确的位置开始?

时间:2014-05-02 14:10:00

标签: ios objective-c sprite-kit

我正在制作一款简单的iOS游戏,目标是让屏幕中间有一个天使向四面八方的怪物射箭。当用户点击屏幕时,我想要一个箭头从天使向水龙头方向移动。但是当我点击屏幕时,它会从屏幕的一角移动,而不是从中间移动。这是我的代码:

#import "MyScene.h"

static inline CGPoint rwAdd(CGPoint a, CGPoint b)
{
    return CGPointMake(a.x + b.x, a.y + b.y);
}
static inline CGPoint rwSub(CGPoint a, CGPoint b)
{
    return CGPointMake(a.x - b.x, a.y - b.y);
}
static inline CGPoint rwMult(CGPoint a, float b)
{
    return CGPointMake(a.x * b, a.y * b);
}
static inline float rwLength(CGPoint a)
{
    return sqrtf(a.x * a.x + a.y * a.y);
}
static inline CGPoint rwNormalize(CGPoint a)
{
    float length = rwLength(a);
    return CGPointMake(a.x / length, a.y / length);
}

@implementation MyScene

- (id) initWithSize: (CGSize) size
{
    if (self = [super initWithSize:size])
    {
        self.backgroundColor = [SKColor colorWithRed: 1.0 green: 1.0 blue: 1.0 alpha: 1.0];

        SKSpriteNode *angel = [SKSpriteNode spriteNodeWithImageNamed: @"Angel"];
        angel.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
        angel.xScale = 0.25;
        angel.yScale = 0.25;
        [self addChild: angel];
    }
    return self;
}

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    UITouch * touch = [touches anyObject];
    CGPoint location = [touch locationInNode: self];

    SKSpriteNode *arrow = [SKSpriteNode spriteNodeWithImageNamed: @"Arrow"];
    arrow.xScale = 0.25;
    arrow.yScale = 0.25;

    SKNode *angel = [self childNodeWithName: @"Angel"];
    arrow.position = angel.position;

    CGPoint offset = rwSub(location, arrow.position);
    [self addChild: arrow];
    CGPoint direction = rwNormalize(offset);
    CGPoint shootAmount = rwMult(direction, 500);
    CGPoint realDest = rwAdd(shootAmount, arrow.position);
    float velocity = 480.0/1.0;
    float realMoveDuration = self.size.width / velocity;
    SKAction *actionMove = [SKAction moveTo: realDest duration: realMoveDuration];
    SKAction *actionMoveDone = [SKAction removeFromParent];
    [arrow runAction: [SKAction sequence: @[actionMove, actionMoveDone]]];

}

@end

连连呢?感谢。

1 个答案:

答案 0 :(得分:0)

进行以下修改:

@implementation MyScene
{
    SKSpriteNode *angel; // <- add this
}

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    UITouch * touch = [touches anyObject];
    CGPoint location = [touch locationInNode: self];

    SKSpriteNode *arrow = [SKSpriteNode spriteNodeWithImageNamed: @"Arrow"];
    arrow.xScale = 0.25;
    arrow.yScale = 0.25;

    //SKNode *angel = [self childNodeWithName: @"Angel"]; // <- delete this
    arrow.position = angel.position;

    CGPoint offset = rwSub(location, arrow.position);
    [self addChild: arrow];
    CGPoint direction = rwNormalize(offset);
    CGPoint shootAmount = rwMult(direction, 500);
    CGPoint realDest = rwAdd(shootAmount, arrow.position);
    float velocity = 480.0/1.0;
    float realMoveDuration = self.size.width / velocity;
    SKAction *actionMove = [SKAction moveTo: realDest duration: realMoveDuration];
    SKAction *actionMoveDone = [SKAction removeFromParent];
    [arrow runAction: [SKAction sequence: @[actionMove, actionMoveDone]]];
}