samedi 3 janvier 2015

Spawning Sprite in random position not showing

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