En la continuación del primer artículo (
está aquí ), sigo desarrollando un juego de plataformas basado en el
artículo "Patrones de diseño de niveles para juegos 2D" .
Después del lanzamiento del primer artículo, se decidió inequívocamente que el control de botón que se describía en él no era del todo conveniente. Por lo tanto, los controles en el juego se rehicieron en el joystick. Además, desafortunadamente el juego no pasó la moderación en el mercado de juegos. El viernes pasado recibí una notificación de que el proyecto fue rechazado debido a la recopilación de metadatos. Por cierto, mi primer juego de plataformas "Knight Kadavar" también fue rechazado por primera vez, debido a una supuesta solicitud de permiso para administrar llamadas y ver SMS (lo cual fue una estupidez total por parte de su bot. El juego no requería ningún permiso). Google luego me exigió un aviso por escrito sobre por qué lo necesito. Pero todo terminó con el hecho de que reparé un par de errores que noté y envié el juego a una nueva moderación. Ella fue agregada con éxito al mercado de juegos. Ahora, planeo hacer exactamente lo mismo con este juego.
Entonces, tan pronto como se creó la segunda escena, el patrón se cerró automáticamente
Escena
Un fragmento de un nivel / mundo basado en un concepto suele ser una dificultad de superación.
Bono
artículo coleccionable que tiene un efecto positivo en los jugadores
Realizamos 2 tipos de bonos para Lucas:
- Botiquín de primeros auxilios que caerá cuando destruyas monstruos
- Cofres con espadas que Lucas podrá lanzar a los enemigos.
Para implementar un bono con un botiquín de primeros auxilios, debes modificar los prefabricados con monstruos. Más específicamente, indique el lugar desde el cual aparecerán los bonos.

Luego, modifique el script Enemy.cs:
Encabezado de spoiler [SerializeField] private GameObject bonusPref;
Llamamos a la función con el tipo devuelto Damage (0) y verificamos si Health 0 regresa. Si es así, llamamos al generador de números aleatorios. Si el generador se detiene al elegir el número 0, le damos al jugador un bono y destruimos al monstruo.
A continuación, describimos lo que puede hacer con este bono. Para hacer esto, cree su prefabricado con los componentes SpriteRenderer, BoxCollider2D y Rigidbody2D. Además, cree un script que será responsable de lo que debe hacerse si la manzana colisiona con el jugador:
Encabezado de spoiler public void OnTriggerEnter2D(Collider2D collision) { switch (collision.gameObject.tag) { case "Player": { HeroScript.Health = 100; Destroy(this.gameObject); } break; } }
Ver
video de vista previa .
A continuación, nos damos cuenta de la bonificación de la pérdida de espadas. Se puede implementar de acuerdo con el mismo principio que en la primera parte, se implementó la pérdida de registro. La parte interesante será que cuando Lucas recoja las espadas, deberán arrojarse solo en el rango de visibilidad de los oponentes, y no cuando Lucas recoja los troncos. De hecho, en la forma en que ahora se implementa el botón Ataque \ colección de elementos, haría exactamente eso. Las espadas fueron arrojadas en cualquier situación. Para hacer esto, modificamos el código del script de ataque / colección:
Encabezado de spoiler [SerializeField] private GameObject swordPref;
¿Qué significan estas líneas de código? Primero, definimos una matriz de colisionadores y verificamos todo lo que cayó en nuestro cubo:
Collider2D[] ED = Physics2D.OverlapBoxAll(Hero.position, new Vector2(attackInBoxX, attackInBoxY), lEnemy);
Preste atención a los parámetros pasados, son muy diferentes de los utilizados para OvelapCircleAll. Parámetros clave
Vector2(attackInBoxX, attackInBoxY)
Luego se cumple la condición, si la matriz del colisionador es mayor que 0, entonces verificamos el inventario en busca de espadas. Si el número de espadas es 0, entonces no hacemos nada y ejecutamos el método
ED[i].GetComponent<Enemy>().Damage(1);
como si fuera un golpe regular. Si es mayor que 0, suelta la espada y reduce el número de espadas en 1.
A continuación, la implementación del método instantiateSword ();
Encabezado de spoiler private void instantiateSword() { GameObject newArrow = Instantiate(swordPref) as GameObject; newArrow.transform.position = instSword.transform.position; Rigidbody2D rb = newArrow.GetComponent<Rigidbody2D>(); if (GameObject.Find("Hero").GetComponent<HeroScript>().localScale.x > 0) { rb.velocity = new Vector3(swordSpeed, 0, 0); } else { rb.velocity = new Vector3(-swordSpeed, 0, 0); newArrow.transform.Rotate(0,0,-180); } }
Si leyó bien el artículo anterior, es posible que haya notado que este código se asemeja a una sección de código que es responsable de disparar un girasol. Se agregaron líneas a esta sección de código que son responsables de determinar la escala de Lucas. Es decir, mira a izquierda o derecha:
(GameObject.Find("Hero").GetComponent<HeroScript>().localScale.x > 0)
Si Lucas mira a la izquierda, entonces
rb.velocity = new Vector3(-swordSpeed, 0, 0); newArrow.transform.Rotate(0,0,-180);
la espada vuela hacia la izquierda y también la gira 180 grados.
Ver
video de vista previa .
Al realizar esta acción, cerramos automáticamente otro patrón 1:
Objeto
cualquier entidad que aparezca en la escena del juego y pueda cambiar su estado. Los objetos incluyen peligros, enemigos, bonificaciones, etc.Aunque, muy probablemente, este patrón se implementó antes cuando se programó el primer monstruo.
Como resultado, por el momento no se implementan 3 patrones:
- Área inalcanzable
- La mecanica
- El jefe
La mecánica en este momento es de gran interés para mí. Porque no puedo decirme a mí mismo que entiendo exactamente qué diferentes personas ponen en esta definición.
Además, un
área inalcanzable . En este número, trataré durante algún tiempo los problemas de diseño de nivel. En primer lugar, porque quiero oscurecer el tercer nivel. Lo más probable es una cueva o un calabozo. Con la capacidad de realizar efectos de iluminación.
Jefe ! También seguirá siendo una cereza en el pastel. Quiero hacerlo lo más independiente posible y con la capacidad de cambiar mi apariencia.
La primera parte del
artículoTodos los objetos del juego fueron tomados de
https://opengameart.org/ , a saber:
Siéntase libre y escriba comentarios sobre Habré o para mí en worldofonehero@gmail.com.
Gracias por leer, buena suerte.