我正在尝试生成我在随机坐标处创建的节点。到目前为止,我已通过以下方式进行了尝试:
- (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 :(得分: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];
}