2014-02-14 37 views
2

我试图产生一个我在随机坐标下创建的节点。到目前为止,我已经做了以下尝试:在SpriteKit随机坐标中产生一个节点

- (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; 
} 
+0

你在哪里添加节点(节点位置是相对于它的父)和你改变它的位置?此外,你忘了CGPathRelease(圈子)。 – LearnCocos2D

+0

@ LearnCocos2D 该节点在的touchesBegan方法加入: ' - (无效)的touchesBegan:(NSSet中*)触摸withEvent:方法(的UIEvent *)事件 { [自的addChild:[自createTargetNode]]; }' – Dan

回答

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

+0

我明白你的逻辑与半径相减。这是我对+40的逻辑,我猜的意思是减去。但是,它仍然不适合屏幕上的所有圆圈。 我已经更新了我的问题以包含该应用的屏幕截图。 – Dan

+0

我试过了,所有生成的圆总是被绘制。你能展示更多的代码/更多的线索吗?所以我们可以帮你为什么有些圈子没有策划 – nvl

+0

好的。刚刚编辑帖子以包含代码。 – Dan