在SpriteKit中随机坐标处生成一个节点

时间:2014-02-14 21:46:34

标签: ios sprite-kit

我正在尝试生成我在随机坐标处创建的节点。到目前为止,我已通过以下方式进行了尝试:

- (SKShapeNode *)createTargetNode
{

  int maxXCoord = CGRectGetMaxX(self.frame);
  int maxYCoord = CGRectGetMaxY(self.frame);

  int x = arc4random()% maxXCoord + 40;
  int y = arc4random()% maxYCoord + 40;

  SKShapeNode *target = [SKShapeNode new];
  CGMutablePathRef circle = CGPathCreateMutable();
  CGPathAddArc(circle, NULL, x, y, 5, 0, M_PI*2, YES);
  target.path = circle;
  target.fillColor = [SKColor redColor];
  target.strokeColor = [SKColor redColor];
  NSLog(@"%d, %d", x, y);
  return target;
}

有时节点会出现在屏幕上,有时则不会出现。我想它已经超出了界限。我该如何解决这个问题?手机的方向是横向的,坐标也会改变吗?

谢谢!

修改1:

以下是一些已绘制的坐标:

2014-02-14 17:54:09.629 reactions[16096:70b] 221, 402
2014-02-14 17:54:10.990 reactions[16096:70b] 273, 542
2014-02-14 17:54:11.586 reactions[16096:70b] 88, 299
2014-02-14 17:54:14.660 reactions[16096:70b] 69, 306

实际上只绘制了(88, 299)(69, 306)。 这是图像的链接(我还没有发布,我没有足够的声誉):

编辑2:

这是我的主视图控制器。非常标准,只需加载SKScene

#import "DKViewController.h"
#import "DKPlayScene.h"

@implementation DKViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    SKScene * scene = [DKPlayScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    [skView presentScene:scene];
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else {
        return UIInterfaceOrientationMaskAll;
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

这是SKScene的实施文件:

#import "DKPlayScene.h"
#include <stdlib.h>


@interface DKPlayScene ()

@property (nonatomic, strong) SKLabelNode *scoreLabel;
@property bool *gameHasStarted;
@property int  *score;

@end

@implementation DKPlayScene

- (id)initWithSize:(CGSize)size
{
  if (self = [super initWithSize:size]) {

    self.gameHasStarted = NO;
    self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
    self.scoreLabel = [SKLabelNode new];

    self.scoreLabel.text = @"High Score:";
    self.scoreLabel.fontSize = 10;
    self.scoreLabel.position = (CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) + 70));
    [self createTargetNode];
    [self addChild:self.scoreLabel];
  }
  return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  [self addChild:[self createTargetNode]];
}

-(void)update:(CFTimeInterval)currentTime {

}

#pragma mark - Private

- (SKShapeNode *)createTargetNode
{

  int maxXCoord = self.frame.size.width;
  int maxYCoord = self.frame.size.height;

  int circleWidth = 6;

  int x = arc4random() % (maxXCoord - (circleWidth / 2));
  int y = arc4random() % (maxYCoord - (circleWidth / 2));

  SKShapeNode *target = [SKShapeNode new];
  CGMutablePathRef circle = CGPathCreateMutable();
  CGPathAddArc(circle, NULL, x, y, circleWidth, 0, M_PI*2, YES);
  target.path = circle;
  target.fillColor = [SKColor redColor];
  target.strokeColor = [SKColor redColor];
  NSLog(@"%d, %d", x, y);
  return target;
}

1 个答案:

答案 0 :(得分:2)

  

有时节点会出现在屏幕上,有时则不会出现。我想它已经超出了界限。我该如何解决这个问题?手机的方向是横向的,坐标也会改变吗?

这是因为使用的高度和宽度是错误的。

在您的代码中,[MyScene sceneWithSize:skView.bounds.size]将始终以纵向方向返回尺寸,即使它在设备/模拟器上的风景也是如此,因为您将其放在viewDidLoad上。

如果您想获得当前方向的尺寸(风景),请将代码放在viewDidLayoutSubviews中,而不是viewDidLoad

转到“ViewController.m”,将viewDidLoad替换为viewDidLayoutSubviews

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    [skView presentScene:scene];
}

文档链接:https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLayoutSubviews