Jump to content
Sign in to follow this  
Auronity

Juego de Cartas

Recommended Posts

Hola, he empezado a crear un juego de cartas, el mas básico que se me ha ocurrido, el de la Carta mas Alta. He empezado por crear un prefab con un sprite de "reverso" (boca abajo) de una carta con el que crear la baraja. El caso es que aun no he sido capaz de hacer ni eso. Solo he conseguido que se creen las cartas pero ni se le asigna a cada una su sprite (se quedan boca abajo), ni me deja meter las instancias en la lista "baraja", me da error.

Aqui esta el codigo, a ver si alguien ve el problema:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controlador : MonoBehaviour {

	public GameObject cartaPrefab;

	List<GameObject> baraja;

	// Use this for initialization
	void Start () {
		crearCartas ();
	}
	
	// Update is called once per frame
	void Update () {
		
	}


	public void crearCartas(){
		GameObject carta;
		//Oros
		for(int i=1; i<=12; i++){
			carta = Instantiate (cartaPrefab, new Vector2(0 + i, 0), Quaternion.identity) as GameObject;
			carta.name = i + " de Oros";
			carta.GetComponent<GestorCartas> ().spr = Resources.Load<Sprite> ("Cartas/Oros/" + i);
      		baraja.Add(carta);
		}
	}
}

Saludos.

 

Editado: vale, acabo de solucionar el problema de la lista. me faltaba inicializarla en el Start () (baraja=new List<GameObject>();)

Pero sigue sin asignarse los sprites.

Edited by Auronity

Share this post


Link to post
Share on other sites

podés asginar espacio a una lista o array directamente cuando lo declaras, ej

List<GameObject> lista = new List<GameObject>();
  
//o de 12 lugares ponele
List<GameObject> lista = new List<GameObject>(12);
  
o si sabés que son siempre 12 te conviene un array
GameObject[] lista = new GameObject[12];

Supongo que tenés una carpeta llamada "Resources" y te queda algo así: /Assets/ ... /Resources/Cartas/Oros/"  y que dentro de Oros tenés los sprites llamados "0", "1", "2" ,etc ?

También fijate que errores tenés, cuando instanciás el prefab asegurate de que el getcomponent esté justamente obteniendo el componente "GestorCartas", eso te lo dice la consola con un nullreference, pero igual no creo que sea esto, me juego que es más el tema de los directorios.

saludos

 

Share this post


Link to post
Share on other sites

He encontrado una manera de resolverlo, en lugar de acceder a la variable spr del script de la carta, accedo directamente al componente SpriteRenderer y al sprite. asi si se cambia.

Gracias por la ayuda

Share this post


Link to post
Share on other sites

Nuevo error, ya se crean todas las cartas fuera de la pantalla, y he creado otro método para colocarlas en la pantalla de forma que cada carta este ligeramente desplazada de la anterior. Ahí esta el problema, no lo hace. Se quedan donde se crean originalmente fuera de la pantalla. Adjunto el script:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controlador : MonoBehaviour {

	public GameObject cartaPrefab;

	List<GameObject> baraja;


	// Use this for initialization
	void Start () {
		baraja = new List<GameObject> ();
		crearCartas ();
		colocarCartas ();
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	void crearCartas(){
		GameObject carta;
		//Oros
		for(int i=1; i<=12; i++){
			carta = Instantiate (cartaPrefab, new Vector2(-10, 0), Quaternion.identity) as GameObject;
			carta.name = i + " de Oros";
			carta.GetComponent<GestorCartas> ().spr = Resources.Load<Sprite> ("Cartas/Oros/" + i);
			carta.GetComponent<GestorCartas> ().numero = i;
			carta.GetComponent<GestorCartas> ().palo = "Oros";
			baraja.Add (carta);
		}

		//Copas
		for(int i=1; i<=12; i++){
			carta = Instantiate (cartaPrefab, new Vector2(-10, 0), Quaternion.identity) as GameObject;
			carta.name = i + " de Copas";
			carta.GetComponent<GestorCartas> ().spr = Resources.Load<Sprite> ("Cartas/Copas/" + i);
			carta.GetComponent<GestorCartas> ().numero = i;
			carta.GetComponent<GestorCartas> ().palo = "Copas";
			baraja.Add (carta);
		}

		//Espadas
		for(int i=1; i<=12; i++){
			carta = Instantiate (cartaPrefab, new Vector2(-10, 0), Quaternion.identity) as GameObject;
			carta.name = i + " de Espadas";
			carta.GetComponent<GestorCartas> ().spr = Resources.Load<Sprite> ("Cartas/Espadas/" + i);
			carta.GetComponent<GestorCartas> ().numero = i;
			carta.GetComponent<GestorCartas> ().palo = "Espadas";
			baraja.Add (carta);
		}

		//Bastos
		for(int i=1; i<=12; i++){
			carta = Instantiate (cartaPrefab, new Vector2(-10, 0), Quaternion.identity) as GameObject;
			carta.name = i + " de Bastos";
			carta.GetComponent<GestorCartas> ().spr = Resources.Load<Sprite> ("Cartas/Bastos/" + i);
			carta.GetComponent<GestorCartas> ().numero = i;
			carta.GetComponent<GestorCartas> ().palo = "Bastos";
			baraja.Add (carta);
		}

		/*GameObject random = baraja [Random.Range (0, baraja.Count)];
		Debug.Log (random.name + ", " + random.GetComponent<GestorCartas>().numero + ", " + random.GetComponent<GestorCartas>().palo + ", " 
			+ random.GetComponent<GestorCartas>().volteada);
		Debug.Log (baraja.Count);*/
	}

	void colocarCartas () {
		for (var i = 0; i < baraja.Count; i++) {
			float posX = baraja [i].transform.position.x;
			posX = -5 + (i / 2f);
			Debug.Log (posX + " | " + baraja [i].gameObject.transform.position.x);
		}
	}
}

El debug resultante es: -5 | -10; -45 | -10; -4 | -10...; es decir, el primer numero es la x donde quiero que se coloque cada carta y el -10 es donde se crean y donde siguen estando a pesar de que en el script cambio la posición.

Espero que tenga fácil solución

Saludos

Share this post


Link to post
Share on other sites

Solucionado, gracias por la ayuda. El caso es que cuando le asignaba la posición así: baraja .transform.position.x = -5 + (i / 2f); me daba un error, pero usando un Vector3 funciona perfecto

Gracias.

Share this post


Link to post
Share on other sites

Sólo con intenciones de ayudar te dejo unos tips para mejorar el código -

public class Controlador : MonoBehaviour
{
	private const TiposDeCarta = 4;
	private const CartasPorTipo = 12;

	[SerializeField]
	private ControladorCarta _cartaPrefab = null;

	public ControladorCarta[] Baraja { get; private set; } = new ControladorCarta[CartasPorTipo * TiposDeCarta];

	private void Start()
	{
		for(int i = 0; i < CartasPorTipo; i++)
		{
			for(int j = 0; j < TiposDeCarta; j++)
			{
				ControladorCarta tmp = Instanstiate(_cartaPrefab, new Vector2(-10, 0), Quaternion.identity);
				tmp.Palo = (EPalo)j;
				tmp.Numero = i;
				tmp.Spr = Resources.Load<Sprite> (string.format("Cartas/{0}/{1}", tmp.Palo, tmp.Numero));
				tmp.name = string.format("{0}[{1}]", tmp.Numero, tmp.Palo);
			}
		}
	}
}

public class ControladorCarta : MonoBehaviour
{
	public Sprite Spr;
	public int Numero;
	public EPalo Palo;

	public enum EPalo
	{
		Oro,
		Espada,
		Palo
		Copa
	}
}

Esto lo escribí desde el foro, si no anda puede ser por errar alguna palabra o símbolo.

Fijate que no es necesario múltiples arreglos, ni tampoco utilizar múltiples veces GetComponent.

 

Espero te sirva, es solo para ayudarte a optimizar el codigo ! Suerte con el proyecto.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...