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 鈥渁ctual鈥 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 鈥渉acerle 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)