videojuegos unity udemy spritekit juego gomila experto desarrollo curso creando con cero aprende ios iphone sprite-kit

ios - unity - Tamaño de la imagen de fondo Juego de Sprite Kit



udemy gomila (9)

Acabo de comenzar un nuevo proyecto de Sprite Kit para aprender a usarlo. Vi y leí muchos tutoriales, pero ningún tutorial tiene una respuesta para mi pregunta / problema.

Quiero crear una aplicación solo para mi iPhone 5S. Entonces, el tamaño de la pantalla es 1136x640. Creé una imagen de fondo de 1136x640 para mi aplicación. Pero cuando agrego la imagen a mi aplicación, ¡es muy grande! El simulador de iOS solo muestra la mitad de la imagen.

¿Alguien puede decirme qué tamaño de pantalla debo usar y por qué?

¡Muchas gracias!

Aquí está el código que copié de un tutorial. El código está en el archivo myScene.m en el método initWithSize

SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"]; background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)); [self addChild:background];

EDITAR :

Busqué en google y encontré esto:

El método viewDidLoad debe modificarse con "viewWillLayoutSubviews".

Aquí está este método:

- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; skView.showsFPS = YES; skView.showsNodeCount = YES; // Create and configure the scene. SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.bounds.size.width*2,skView.bounds.size.height*2)]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; }

Al principio, la escena = línea MySceneWithSize era:

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

Pero entonces solo era la mitad del tamaño de la pantalla del iPhone 5 (568x320). Así que tuve que doblar el tamaño. ¿Alguien sabe por qué?


¿Has intentado agregar "@ 2x" al final del nombre de tu imagen?


Básicamente lo hago como las respuestas anteriores, sin embargo sigo adelante y establezco el ancho y la altura directamente para que no tenga que preocuparme si está configurado correctamente o no, por supuesto también necesitaría verificar si había un iPhone4 para una solución completa.

- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; if (!skView.scene) { skView.showsFPS = YES; skView.showsNodeCount = YES; CGSize tmpSize; tmpSize.width = 640; tmpSize.height = 1136; // Create and configure the scene SKScene * scene = [CreationScene sceneWithSize:tmpSize]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } }


Descubrí que si una imagen no tiene el mismo tamaño que el nodo que está buscando crear, el tamaño se vuelve un poco gracioso (digamos usando una imagen de retina en un dispositivo no retina o una imagen incorrecta nombrando). Puede escalar la imagen para rellenarla si crea la textura a partir de la imagen y configura la textura y el tamaño del nodo utilizando algo como lo siguiente:

SKTexture *backgroundTexture = [SKTexture textureWithImageNamed:@"MyImage.png"]; SKSpriteNode *background = [SKSpriteNode spriteNodeWithTexture:backgroundTexture size:self.view.frame.size]; background.position = (CGPoint) {CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame)}; [scene addChild:background];

No estoy 100% seguro de esto si esto solucionará tu problema o no, pero podría valer la pena intentarlo.


Esta línea devuelve el tamaño en puntos, no en píxeles. Esto se hace porque los diferentes dispositivos tienen diferentes resoluciones, pero tendrán los mismos tamaños en puntos. En los dispositivos sin retina, 1 punto es 1 píxel y en los dispositivos retina 1 punto es dos píxeles. Es por eso que obtienes este tamaño de

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

No desea duplicar el tamaño de la escena, ya que será nuestro límite de su pantalla, invisible.


Esto funcionó para mí. esto esta bien?

//Set background image. SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground.png"]; background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); background.xScale = 0.5; background.yScale = 0.5; [self addChild:background];


Lo usé y sprite para el fondo.

double escalax = self.size.width/ sprite.size.width ; double escalay = self.size.height/ sprite.size.height ; SKAction *mostrar = [SKAction scaleXTo:escalax y:escalay duration:0];

¡Espero eso ayude!


Solución:

Coloque este código en su viewWillLayoutSubviews en lugar de viewDidLoad del UIViewController que carga el sprite.

- (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; if (!skView.scene) { skView.showsFPS = YES; skView.showsNodeCount = YES; // Create and configure the scene. SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } }

Explicación: Esto crea la escena con un tamaño como los límites de la vista. Sin embargo, cuando se llama a viewDidLoad, esto ocurre antes de que la vista se haya agregado a la jerarquía de vistas y, por lo tanto, aún no haya respondido a los cambios de diseño. Por lo tanto, es posible que los límites de la vista aún no sean correctos, y probablemente este no sea el mejor momento para comenzar la escena.

Esta respuesta se copia de: http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners El crédito va para Ray :).

He usado el mismo código en mi SKScene como usted, pero sin esta solución, Ray ofreció en el UIViewController que presenta la escena que no funcionaría.



La respuesta corta a su problema inmediato:

background.size = self.frame.size;

La respuesta larga y la discusión sobre otros métodos ...

La escena funciona en Unidades lógicas, no en píxeles físicos (como se menciona en otras publicaciones).

1 La unidad lógica suele tener 1 píxel en el kit anterior y 2 píxeles en el kit / iPad más nuevo. Esto tal vez 4 píxeles en 5 años.

Trabajar en Unidades lógicas lo protege de los cambios de tamaño en el futuro, y se supone que ayuda al programador, aunque esto a menudo confunde a los novatos.

La forma más sencilla de obtener una imagen para llenar la escena actual es establecer su tamaño en "unidades lógicas" sin importar el tamaño original.

Esto es mejor que usar SKActions (porque el usuario puede terminar viéndolos, y no se puede confiar en los cálculos basados ​​en las dimensiones del nodo hasta que la acción se haya completado), y es mejor que escalar porque la escala requiere que sepa Las dimensiones de la imagen original.

Puede hacer esto a través de la propiedad de tamaño, o mediante una acción si realmente desea hacer una animación.

En la escena simplemente ...

-(void)didMoveToView:(SKView *)view { [super didMoveToView:view]; SKSpriteNode* background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"]; background.size = self.frame.size; background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); [self addChild:background]; }

Alternativamente, si su imagen funciona bien, como es, en resoluciones más altas, puede cambiar el nombre de su imagen a [email protected], agregar eso a su proyecto y probablemente no necesite cambiar el tamaño en absoluto, pero también necesitará para reducirlo en un 50% para los dispositivos de menor resolución, y guardarlo como myBackground.png.

Siempre configuro el tamaño de una imagen importada exactamente a las unidades lógicas que quiero (o un porcentaje de las dimensiones de la pantalla) para preservar mi cordura.