es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Necesito ayuda para detectar colisión en Python.

He intentado varias cosas para intentar detectar la colisión entre la tortuga del jugador y la tortuga de la manzana y no pasa nada. Lo que quiero que haga es que cuando las tortugas estén demasiado cerca, la tortuga del jugador desaparezca. Si la manzana llega demasiado abajo del jugador, se reinicia arriba.
Aquí está el código que he hecho. Soy nuevo en programación, así que no soy muy bueno.

import turtle as trtl
import random as rand

ground_height = -200
# listas para que las tortugas las usen
colors = ["blue", "darkorange", "cyan", "green", "black"]
shapes = ["triangle", "turtle", "classic"]
sizes = [0.5, 1, 1.25, 1.5, 2]
# crea las tortugas
player = trtl.Turtle(shape=rand.choice(shapes)) # le da la forma circular al círculo
player.turtlesize(1.5)
counter = trtl.Turtle()
apple = trtl.Turtle(shape="circle")
apple.color("red")
apple.turtlesize(rand.choice(sizes))
# da colores a las tortugas
player.color(rand.choice(colors))
player.penup()
apple.penup()
apple.setx(rand.randint(0,200))
apple.sety(rand.randint(0,200))
# configura el temporizador
font_setup = ("Arial", 20, "normal")
timer = 0
counter_interval = 1000
timer_up = False
counter.hideturtle()
counter.penup()
counter.goto(-200,160)
# da movimiento al jugador
def move_player():
  player.forward(10)

def player_left():
  player.left(180)

def player_right():
    player.right(180)

apple.right(90)

# permite que el temporizador empiece y termine
def countdown():
  global timer, timer_up
  counter.clear()
  if timer <= -1:
    counter.write("Se acabó el tiempo", font=font_setup)
    timer_up = True
  else:
    counter.write("Temporizador: " + str(timer), font=font_setup)
    timer += 1
    apple.forward(10)
    counter.getscreen().ontimer(countdown, counter_interval)
countdown()

# permite que el jugador se mueva al presionar una tecla
wn = trtl.Screen()
wn.listen()
wn.onkeypress(move_player, "w")
wn.onkeypress(player_left, "a")
wn.onkeypress(player_right, "d")
wn.mainloop()
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para detectar la colisión entre la tortuga del jugador y la tortuga de la manzana, necesitas calcular la distancia entre las dos tortugas usando el método distance() en turtle. Si la distancia es menor que un cierto valor umbral, puedes hacer que la tortuga del jugador desaparezca y reiniciar la tortuga de la manzana.

    Aquí tienes un ejemplo de implementación que puedes agregar a tu código:

    # calcula la distancia entre dos tortugas
    def is_collision(t1, t2):
      distancia = t1.distance(t2)
      if distancia < 20:
        return True
      else:
        return False
    
    # comprueba la colisión en cada intervalo de tiempo
    def check_collision():
      global timer_up
      if is_collision(jugador, manzana):
        jugador.hideturtle()
        manzana.sety(altura_suelo)
        jugador.sety(-1000) # mueve la tortuga del jugador fuera de la pantalla
        timer_up = True
      elif manzana.ycor() < altura_suelo:
        manzana.sety(rand.randint(0, 200))
      wn.ontimer(check_collision, 10) # comprueba la colisión cada 10 milisegundos
    
    # llama a la función check_collision después de que empiece la cuenta atrás
    wn.ontimer(check_collision, intervalo_cuenta_regresiva)
    

    La función is_collision() recibe dos objetos turtle y devuelve un valor booleano dependiendo de si la distancia entre ellos es menor que 20 (el umbral para la colisión).

    La función check_collision() comprueba la colisión cada 10 milisegundos (puedes ajustar el valor dependiendo de tus necesidades) y también reinicia la tortuga de la manzana si baja de la altura del suelo.

    Por último, llama a la función check_collision() después de que empiece la cuenta atrás llamando a la función wn.ontimer(check_collision, intervalo_cuenta_regresiva). Esto comprobará la colisión durante el juego.

Comments are closed.