No tienes acceso a esta clase

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

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

3D
23H
41M
7S

Desarrollando la IA de tu oponente

12/16
Recursos

Aportes 9

Preguntas 3

Ordenar por:

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

o inicia sesión.

Hola, comparto mi solución “actual” para el funcionamiento del enemigo :)

Esta permite de cierta forma modificar la dificultad, lo realicé teniendo en cuenta la distancia de reacción que podría llegar a tener el enemigo respecto a la posición de la pelota, además esta solución le otorga al enemigo un poco de movimiento independiente en el eje y, para que parezca que no está todo el tiempo siguiendo la misma dirección de la pelota (al menos cuando no es necesario) y se note un poco más animado.

extends KinematicBody2D

var speed = 600
var direction = Vector2.ZERO
var reaction_dist_x = 0
var reaction_dist_y = 0

onready var ball = get_parent().find_node('Ball')

func _ready():
	randomize()
	
	var window_width = OS.get_window_size().x
	var shape_height = find_node('CollisionShape2D').shape.extents.y
	reaction_dist_x = window_width
	reaction_dist_y = shape_height
	# modify the reaction distance component values in terms of dificulty
	# the difficulty can be graduated through the percentage
	# "more percentage decrease, more difficulty"
	reaction_dist_x -= window_width * 0.35 #easy
	reaction_dist_y -= shape_height * 0.5 #easy
	direction.y = [-1, 1][_random_select()]

func _physics_process(delta):
	var delta_y = ball.position.y - position.y
	
	if ball.position.x > reaction_dist_x && ball.direction.x > 0 && abs(delta_y) > reaction_dist_y:
		direction = Vector2(0, delta_y).normalized()
		move_and_slide(direction * speed)
	else:
		var collide = move_and_collide(direction * speed * delta)
		if collide:
			direction.y *= -1

func _random_select():
	return int(randf() > 0.5)

Si se encuentran con algunas líneas confusas o ambiguas, etc… lo siento 😓, nunca antes había visto este lenguaje de programación, así que por el momento, solo me comprometo a mejorar >:)

Yo agregué una línea de código para que el oponente solo se mueva cuando la pelota este en la mitad del tablero. Esto lo hice para que el oponente no se mueva en todo momento, y solo cuando la pelota este cerca de él

extends KinematicBody2D

var speed = 600
onready var ball = get_parent().find_node("Ball")

func _physics_process(delta):
	if ball.position.x > 960: #esta es la linea que agregué
		var direction = Vector2(0, _get_direction())
		move_and_slide(direction * speed)
	
func _get_direction():
	if abs(ball.position.y - position.y) > 20:
		if ball.position.y > position.y:
			return 1
		else:
			return -1
	else:
		return 0

Espero en un futuro poner una mejor IA, pues solo tengo mis ideas aunque no se como poner el código pero se trata de engañar al jugador player entonces que se mueva en sentido opuesto a la pelota y posteriormente cuando este le de el golpe se mueva en sentido a la pelota para que le tiempo de poder pegarlo o a su ves calcular los golpes de pelota por ángulos y este esperando la pelota jajajajaja NIEVEL MASTER de la IA.

Sobre la pregunta de como hacer mas complicado el juego

Con las condiciones:

  • Player 400
  • Ball y Rival 600
  • Paleta 160 px
  • Diferencia de altura 25 para que se mueva la paleta Rival

El resultado es que la paleta rival empieza a moverse cuando la pelota esta 25 por arriba/debajo del centro(posicion) del Nodo

No es dificil responder, pero tampoco es tan facil “hacerle puntos”

Se podria disminuir el margen de 25 y/o aumentar la velocidad de la pelota y lapaleta Rival. Aumentar las velocidades conforme pasa el tiempo.

Otra opcion que vi, aunque no estoy seguro

Me parecio notar que la escena Player tiene el centro del Nodo en la esquina superior izquierda de los objetos (ColorRect y CollisionShape) y no en el centro de estos.

Esto provoca una demora en el arranque de la paleta rival cuando la pelota se mueve hacia arriba, ya que espera a que la paleta este 25 px por encima para empezar a moverse.
De esta manera es mas facil hacer puntos si buscas que la pelota rebote hacia arriba.
Teniendo esto como referencia, podriamos usar 2 margenes distintos y que de manera aleatoria la paleta se mueva mas rapido hacia arriba que hacia abajo o al reves. Para confundir al jugador.

Lista la IA comparto mi codigo 😃

Me gustaría agregar un metodo mío pero me falta aprender más para programar.

Saludos! 😄
No me funciono la IA, asi que use el código del compañero Santiago Palacio Vasquez.
Lo dejaré como mejora a futuro. (Quizás por niveles)

Mi solución para el _get_direction

func _get_direction():
	var direction = Vector2.ZERO
	
	var y_diff = ball.position.y - position.y
	
	if abs(y_diff) > ai_reaction:
		direction.y = y_diff
		
	return direction.normalized()

Siguiendo la idea de la compañera Andrea Stephania Garcia Castillo lo que hice fue agregar su condicional y juntarle el valor que tenemos cuando la pelota se dirije al enemigo, quedaría algo así…

func _physics_process(delta):
	if ball.direction.x > 0 and ball.position.x > 960: 
		var direction = Vector2(0, _get_direction())
		move_and_slide(direction * speed)