Introducció

L'evitació d'obstacles és una part fonamental de la navegació en els videojocs. Els personatges no només han de trobar el camí més curt o eficient cap a la seva destinació, sinó que també han de ser capaços d'evitar col·lisions amb objectes estàtics i dinàmics en el seu entorn. Aquest tema cobreix els conceptes bàsics i les tècniques utilitzades per implementar l'evitació d'obstacles en els videojocs.

Conceptes Bàsics

Tipus d'Obstacles

  1. Estàtics: Obstacles que no es mouen, com parets, edificis, arbres, etc.
  2. Dinàmics: Obstacles que es mouen, com altres personatges, vehicles, etc.

Estratègies d'Evitació

  1. Desviació Simple: Canviar lleugerament la trajectòria per evitar un obstacle.
  2. Replanificació de Camí: Recalcular completament el camí per evitar obstacles.
  3. Evitació Predictiva: Preveure el moviment dels obstacles dinàmics i ajustar la trajectòria en conseqüència.

Algoritmes d'Evitació d'Obstacles

Algoritme de Desviació Simple

Aquest és un mètode senzill on el personatge ajusta la seva trajectòria en funció de la proximitat a un obstacle.

def desviacio_simple(posicio_actual, direccio, obstacles):
    for obstacle in obstacles:
        if distancia(posicio_actual, obstacle) < dist_minima:
            direccio = ajusta_direccio(direccio, obstacle)
    return direccio

def ajusta_direccio(direccio, obstacle):
    # Ajusta la direcció per evitar l'obstacle
    nova_direccio = direccio + vector_aleatori()
    return normalitza(nova_direccio)

Algoritme de Replanificació de Camí

Aquest mètode implica recalcular el camí utilitzant un algoritme de cerca com A* quan es detecta un obstacle.

def replanificacio_cami(posicio_actual, destinacio, obstacles, graella):
    if obstacle_detectat(posicio_actual, obstacles):
        nou_cami = a_estrella(posicio_actual, destinacio, graella)
        return nou_cami
    return cami_actual

Algoritme d'Evitació Predictiva

Aquest mètode utilitza la predicció del moviment dels obstacles dinàmics per ajustar la trajectòria del personatge.

def evitacio_predictiva(posicio_actual, velocitat, obstacles_dinamics):
    for obstacle in obstacles_dinamics:
        posicio_futura = predir_posicio(obstacle)
        if colisio_predita(posicio_actual, posicio_futura):
            velocitat = ajusta_velocitat(velocitat, obstacle)
    return velocitat

def predir_posicio(obstacle):
    # Prediu la posició futura de l'obstacle
    return obstacle.posicio + obstacle.velocitat * temps

def colisio_predita(posicio_actual, posicio_futura):
    # Determina si hi haurà una col·lisió
    return distancia(posicio_actual, posicio_futura) < dist_minima

Exemples Pràctics

Exemple 1: Desviació Simple

Imagina un personatge que es mou cap a una destinació però troba una roca al seu camí. Utilitzant la desviació simple, el personatge ajusta lleugerament la seva trajectòria per evitar la roca.

posicio_actual = [5, 5]
direccio = [1, 0]
obstacles = [[7, 5]]

nova_direccio = desviacio_simple(posicio_actual, direccio, obstacles)
print(nova_direccio)  # Sortida esperada: [1, 0.1] o similar

Exemple 2: Replanificació de Camí

Un personatge ha de recalcular el seu camí quan troba un obstacle inesperat.

posicio_actual = [5, 5]
destinacio = [10, 10]
obstacles = [[7, 7]]
graella = crea_graella(10, 10, obstacles)

nou_cami = replanificacio_cami(posicio_actual, destinacio, obstacles, graella)
print(nou_cami)  # Sortida esperada: Un nou camí que evita l'obstacle

Exemple 3: Evitació Predictiva

Un personatge prediu el moviment d'un altre personatge i ajusta la seva velocitat per evitar una col·lisió.

posicio_actual = [5, 5]
velocitat = [1, 0]
obstacles_dinamics = [{'posicio': [7, 5], 'velocitat': [-1, 0]}]

nova_velocitat = evitacio_predictiva(posicio_actual, velocitat, obstacles_dinamics)
print(nova_velocitat)  # Sortida esperada: [1, 0.1] o similar

Exercicis Pràctics

Exercici 1: Implementació de Desviació Simple

Implementa una funció que ajusti la direcció d'un personatge per evitar un obstacle estàtic.

Solució:

def desviacio_simple(posicio_actual, direccio, obstacles):
    for obstacle in obstacles:
        if distancia(posicio_actual, obstacle) < dist_minima:
            direccio = ajusta_direccio(direccio, obstacle)
    return direccio

def ajusta_direccio(direccio, obstacle):
    # Ajusta la direcció per evitar l'obstacle
    nova_direccio = direccio + vector_aleatori()
    return normalitza(nova_direccio)

Exercici 2: Replanificació de Camí

Implementa una funció que recalculi el camí d'un personatge quan es troba amb un obstacle.

Solució:

def replanificacio_cami(posicio_actual, destinacio, obstacles, graella):
    if obstacle_detectat(posicio_actual, obstacles):
        nou_cami = a_estrella(posicio_actual, destinacio, graella)
        return nou_cami
    return cami_actual

Exercici 3: Evitació Predictiva

Implementa una funció que prediu el moviment d'obstacles dinàmics i ajusta la velocitat del personatge per evitar col·lisions.

Solució:

def evitacio_predictiva(posicio_actual, velocitat, obstacles_dinamics):
    for obstacle in obstacles_dinamics:
        posicio_futura = predir_posicio(obstacle)
        if colisio_predita(posicio_actual, posicio_futura):
            velocitat = ajusta_velocitat(velocitat, obstacle)
    return velocitat

def predir_posicio(obstacle):
    # Prediu la posició futura de l'obstacle
    return obstacle.posicio + obstacle.velocitat * temps

def colisio_predita(posicio_actual, posicio_futura):
    # Determina si hi haurà una col·lisió
    return distancia(posicio_actual, posicio_futura) < dist_minima

Resum

En aquesta secció, hem explorat diverses tècniques per a l'evitació d'obstacles en videojocs, incloent desviació simple, replanificació de camí i evitació predictiva. Hem vist exemples pràctics i hem proporcionat exercicis per reforçar els conceptes apresos. Amb aquestes tècniques, els personatges del joc poden navegar de manera més intel·ligent i realista, evitant col·lisions amb obstacles estàtics i dinàmics.

© Copyright 2024. Tots els drets reservats