No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creando el marcador

14/17
Recursos

¿Cómo crear un marcador en nuestro juego de Pong?

Contar con un marcador es esencial para que un juego de Pong sea emocionante y competitivo, como lo era el Pong original lanzado por Atari hace cinco décadas. En esta guía, te enseñaremos a implementar un marcador en tu juego utilizando nodos de interfaz de usuario y scripts en Godot. ¡Comencemos!

¿Cómo adicionar un nuevo nodo para el marcador?

Para añadir un marcador a nuestro juego, primero debemos agregar un nodo de tipo interfaz de usuario. Esto se realiza mediante los siguientes pasos:

  1. Agregar un nodo "Label": Este nodo nos permitirá incorporar texto en pantalla.

    var marcador_player = Label.new()
    
  2. Configurar propiedades del marcador:

    • Cambia la alineación del texto a centrado tanto vertical como horizontalmente.
    • Ajusta el tamaño del rectángulo para que coincida con la pantalla completa.
    • Modifica la propiedad de 'merging left' a -200 para posicionarlo correctamente.
  3. Personalizar la apariencia:

    • Importa una fuente personalizada para mejorar la estética del marcador.
    • Ajusta el tamaño de la fuente a 32 y selecciona un color adecuado como negro o naranja.

¿Cómo actualizar el marcador con el puntaje?

Con el marcador visualmente preparado, necesitamos actualizarlo con los goles anotados en el juego. Utilizaremos scripts para gestionar y mostrar correctamente el puntaje:

  1. Declarar una variable para el puntaje:

    • Crea una variable para almacenar el puntaje del jugador.
    var player_score = 0
    
  2. Actualizar el puntaje:

    • Incrementar el puntaje cada vez que la pelota atraviesa el arco del oponente.
    func update_score():
        player_score += 1
    
  3. Mostrar el puntaje en pantalla:

    • Utiliza el método Process de Godot para actualizar el texto en cada frame. Convierte el valor numérico a una cadena de texto para mostrarlo.
    func _process(delta):
        $label.text = str(player_score)
    

¿Cómo solucionar problemas de conteo incorrecto de puntaje?

Un problema común es que el marcador puede iniciar con valores incorrectos debido a colisiones no deseadas. Aprendamos a corregirlo:

  1. Evitar colisiones falsas: Asegúrate de que solo se cuenten los goles cuando el objeto que colisiona sea la pelota.

    if body is Ball:
        update_score()
    
  2. Definir el nodo de la pelota:

    • Usa class_name para identificar claramente el nodo de la pelota.
    class_name Ball
    

¿Cómo implementar el marcador del oponente?

Replicar la lógica del marcador del jugador para el oponente es esencial para mantener el puntaje de ambos participantes. A continuación, se muestra cómo hacerlo:

  1. Duplicar el nodo "Label" del jugador:

    • Cambia el nombre y ajusta el merging para mostrar el marcador en la posición opuesta.
    var marcador_oponente = Label.new()
    
  2. Crear una variable y script para el puntaje del oponente:

    • Actualiza el puntaje del oponente cada vez que la pelota atraviesa el arco del jugador.
    var oponente_score = 0
    

Al seguir estos pasos y poner en práctica lo que hemos aprendido, habrás mejorado significativamente tu juego de Pong añadiendo marcadores funcionales. Este conocimiento te sobrecogerá con el poder de crear experiencias de juego más completas y envolventes. ¡Sigue explorando, aprendiendo y divirtiéndote con la programación de videojuegos!

Aportes 18

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

var scoreplayer = -2
var scoreoponente  = -2

En las variables score_player y oponente les asigne un -2, no es la mejor solución pero cumple con su objetivo.

Tipografia PoetsenOne

Adicione la siguiente linea para concatenar texto al contador.

	$MarcadorPlayer.text = "Player: " + str(PlayerScore)
	
	$OponentePlayer.text = "Oponente: " + str(OponenteScore)

Reto solucionado. Lo que hice fue duplicar el MarcadorPlayer y cambiarlo por MarcadorOpente, luego seguí los mismos pasos que para el MarcadorPlayer pero utilizando el MarcadorOponente.

**Reto Cumplido **

Lo que hice fue Duplicar el Label que ya estaba creado y cree otra variable para tomar los goles del oponente.

Aquí esta mi solución siguiendo lo hecho por el profesor.

extends Node2D

var PlayerScore = 0
var OponenteScore = 0

func _process(delta):
	$Player2.text = str(PlayerScore)
	$Oponente2.text = str(OponenteScore)

func _restart_game():
	$Ball.is_moving = false
	$Ball.direction =Vector2.ZERO
	$Ball.position = Vector2(960, 540)
	$Ball.reset_ball()
	
func _on_ArcoPlayer_body_entered(body):
	OponenteScore += 1
	_restart_game()

func _on_ArcoOponente_body_entered(body):
	PlayerScore += 1
	_restart_game()

El reto resuelto. Por cierto, no sé el bug de que inicia el contador en 2, así que lo solucioné colocando el marcador -2. Sé que no es lo mejor, peri bueno, sirve.

Para resolver el Reto
Duplicar MarcadorPlayer y en este nuevo nodo, cambiar la posicion, el texto. Agregar otra variable para acumular el score del rival y agregar en el _process la logica para modificar el texto del marcador (nodo duplicado)

El problema del 2 como valor inicial lo resolvi moviendo los arcos 1 pixel fuera del marco

algo mas simple y menos rebuscado de crear otro marcador ![](https://static.platzi.com/media/user_upload/image-3dc89bc3-f1b4-4ff7-abe5-7dea830ee165.jpg)
Hellou! El problema de que los marcadores se inicialicen en 2 se debe a que, en el layout, hay otros dos objetos que sí están "colisionando" con las porterías: las dos paredes del "techo" y del "piso". Por esto, al iniciar el juego, las señales `body_entered` se ejecutan dos veces incluso antes de empezar a jugar. Yo encontré una solución que me parece apropiada. Consiste en verificar qué objeto es el que activa la colisión así: ```js func _on_player_goal_body_entered(body): if body == $Ball: opponent_score += 1 _restart_game() func _on_opponent_goal_body_entered(body): if body == $Ball: player_score += 1 _restart_game() ```Ojalá les sirva! 😄

La solución que realice para lo del marcador que inicia en dos, fue cambiar la posición de las “Canchas” tanto del player como del contrincante, la del player la posicione un pixel antes, y la del contrincante un pixel despues

marcador hecho 😃 (ya tiene marcadores con numeros porque estaba jugando)

Solución al reto, no supe como dejar los contadores a cero entonces inicie su valor a -2 (gracias Jonatan Martin)

![](https://static.platzi.com/media/user_upload/image-72af3b65-7cfd-43e3-b399-6cd738bf5bae.jpg) agregue otro label , vi que salia el oponente con 1 punto extra siempre , opte por ponerle -1 de inicio ahora siempre comienzan con 0 0 ![](https://static.platzi.com/media/user_upload/image-fb305f6c-1dc5-4c70-a5f6-dc3d95fcbc23.jpg)
Mi solucion fue duplicar el marcador pero para el oponente y use el siguente codigo: ![](https://static.platzi.com/media/user_upload/image-c339c73c-3016-4544-b7ab-f56a3bdc4720.jpg)![](https://static.platzi.com/media/user_upload/image-1990dcab-2389-4d74-9fab-988dfd0b4881.jpg)

Esta es mi solucion del reto, para el que no sepa se suman dos al marcador por que la pared superior e inferiror colisionan con el collider y se suman a los marcadores como puntos, entonces de poner ese condicional solo reacciona si al collider entra la pelota

Para resolver el problema del goles extra cuando arranca el partido, use las capas de colisiones, puse a los arcos en 2 y la pelota en el mismo lugar.

El problema de mi código es que por algún motivo asigna el puntaje al reves XD, en fin, simplemente cambie los labels de posición pero no es buena idea askdljasldkjasldk