Hey Guys I have a method that spawns an enemy in a random position and it is not showing in my scene , when I check the coordinates on the log and they are valid and they are meant to show on the screen but they never do, why is this? Here is my method :
-(void)spawnEnamies {
int maxXCoord = self.frame.size.width;
int maxYCoord = self.frame.size.height;
int x = arc4random()% maxXCoord;
int y = arc4random()% maxYCoord - 40;
NSLog(@"%d, %d", x, y);
NSLog(@"%f", self.size.width);
self.backgroundColor = [SKColor blackColor];
self.physicsWorld.gravity = CGVectorMake(0, 0);
self.physicsWorld.contactDelegate = self;
SKNode *enemy = [SKNode node];
SKSpriteNode *circle = [SKSpriteNode spriteNodeWithImageNamed:@"TapMa"];
circle.position = CGPointMake(x, y);
SKEmitterNode *trail = [SKEmitterNode orb_emitterNamed:@"Trail"];
trail.targetNode = self;
trail.position = CGPointMake(CGRectGetMidX(circle.frame), CGRectGetMidY(circle.frame));
[enemy addChild:trail];
enemy.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
enemy.physicsBody.mass = 100000;
enemy.physicsBody.categoryBitMask = CollisionPlayer;
enemy.physicsBody.contactTestBitMask = CollisionEnemy;
enemy.position = CGPointMake(x, y);
[enemy addChild:circle];
[self addChild:enemy];
}
That is where I spawn my Sprite. Here I will show my whole Scene code -
//
// GameScene.m
// TST
//
// Created by Ajay Venkat on 3/01/2015.
// Copyright (c) 2015 AJTech. All rights reserved.
//
#import "GameScene.h"
@implementation SKEmitterNode (fromFile)
+ (instancetype)orb_emitterNamed:(NSString*)name
{
return [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:name ofType:@"sks"]];
}
@end
enum {
CollisionPlayer = 1<<1,
CollisionEnemy = 1<<2,
};
NSMutableArray *_enemyArray;
@implementation GameScene
SKNode *_player;
SKNode *_enemy;
-(void)didMoveToView:(SKView *)view {
[self performSelector:@selector(spawnWall) withObject:nil afterDelay:1];
[self performSelector:@selector(spawnEnamies) withObject:nil afterDelay:3];
}
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
}
-(void)spawnWall {
self.yScale = -1;
self.backgroundColor = [SKColor blackColor];
self.physicsWorld.gravity = CGVectorMake(0, 0);
self.physicsWorld.contactDelegate = self;
_player = [SKNode node];
SKShapeNode *circle = [SKShapeNode node];
circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 5, self.size.width, 5)].CGPath;
circle.fillColor = [UIColor blueColor];
circle.strokeColor = [UIColor blueColor];
circle.glowWidth = 5;
SKEmitterNode *trail = [SKEmitterNode orb_emitterNamed:@"Trail"];
trail.targetNode = self;
trail.position = CGPointMake(CGRectGetMidX(circle.frame), CGRectGetMidY(circle.frame));
[_player addChild:trail];
_player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
_player.physicsBody.mass = 100000;
_player.physicsBody.categoryBitMask = CollisionPlayer;
_player.physicsBody.contactTestBitMask = CollisionEnemy;
_player.position = CGPointMake(0.5, self.size.height - 20);
[self addChild:_player];
}
-(void)spawnEnamies {
int maxXCoord = self.frame.size.width;
int maxYCoord = self.frame.size.height;
int x = arc4random()% maxXCoord;
int y = arc4random()% maxYCoord - 40;
NSLog(@"%d, %d", x, y);
NSLog(@"%f", self.size.width);
self.backgroundColor = [SKColor blackColor];
self.physicsWorld.gravity = CGVectorMake(0, 0);
self.physicsWorld.contactDelegate = self;
SKNode *enemy = [SKNode node];
SKSpriteNode *circle = [SKSpriteNode spriteNodeWithImageNamed:@"TapMa"];
circle.position = CGPointMake(x, y);
SKEmitterNode *trail = [SKEmitterNode orb_emitterNamed:@"Trail"];
trail.targetNode = self;
trail.position = CGPointMake(CGRectGetMidX(circle.frame), CGRectGetMidY(circle.frame));
enemy.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
enemy.physicsBody.mass = 100000;
enemy.physicsBody.categoryBitMask = CollisionPlayer;
enemy.physicsBody.contactTestBitMask = CollisionEnemy;
enemy.position = CGPointMake(x, y);
[enemy addChild:circle];
[enemy addChild:trail];
[self addChild:enemy];
}
@end
That is my scene code and this is my viewController code -
//
// GameViewController.m
// TST
//
// Created by Ajay Venkat on 3/01/2015.
// Copyright (c) 2015 AJTech. All rights reserved.
//
#import "GameViewController.h"
#import "GameScene.h"
@implementation SKScene (Unarchive)
+ (instancetype)unarchiveFromFile:(NSString *)file {
/* Retrieve scene file path from the application bundle */
NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"];
/* Unarchive the file to an SKScene object */
NSData *data = [NSData dataWithContentsOfFile:nodePath
options:NSDataReadingMappedIfSafe
error:nil];
NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[arch setClass:self forClassName:@"SKScene"];
SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey];
[arch finishDecoding];
return scene;
}
@end
@implementation GameViewController
- (void)viewDidLayoutSubviews
{
[super viewDidLoad];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;
// Create and configure the scene.
GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (BOOL)prefersStatusBarHidden {
return YES;
}
@end
What I have tried :
I have tried many different methods of getting random values for x, and y all ended up not showing.
I have tried changing the -(void)viewDidLoad
to a -(void)viewDidLoayoutSubviews
as suggested on another post with the same problem and that ended up same as well. The coordinates I have gotten are valid, and fit perfectly in the screen.
Thank you for helping all.
Aucun commentaire:
Enregistrer un commentaire