Panoramica

Bring ’em Home Game

Uno dei primi progetti realizzati per il percorso di studi di Laurea Specialistica, che ha ricevuto un voto di 30L. Il gioco è stato creato utilizzando il Game Engine di Blender, dimostrando le basi del game design e la teoria di funzionamento di un game engine.


Durata del Progetto e Competenze

  • Tempo di Realizzazione: 2 mesi
  • Conoscenze Acquisite:
    • Basi di Game Design
    • Teoria di funzionamento di un Game Engine
    • Blender Logic Editor
    • Scripting in Python
    • Prototipazione di giochi 3D

Descrizione del Gioco

Un particolare gioco platform 3D in cui i giocatori controllano una sfera con il compito di guidare delle papere in salvo. Il gioco combina meccaniche di scorta con l’evitamento di ostacoli, poiché i giocatori devono proteggere le papere dagli avvoltoi mentre schivano palle di cannone.

Elementi Core del Gameplay

  • Il giocatore controlla una sfera in un ambiente 3D
  • Guida le papere verso recinti sicuri designati
  • Protegge le papere dagli attacchi aerei degli avvoltoi
  • Evita proiettili sparati da cannoni in movimento
  • Uso strategico degli elementi del paesaggio per la protezione

Meccaniche di Gioco

  • Sistema di Seguimento: Le papere tracciano e seguono il giocatore quando sono vicine
  • Gestione della Stamina: Le papere hanno livelli di energia da monitorare
  • Elementi di Distrazione: Caramelle possono temporaneamente fermare le papere
  • Comunicazione a Messaggi: Gli elementi di gioco interagiscono attraverso messaggi (mayfollow, iamTired, ecc.)
  • Sistema di Proprietà: Usa la proprietà ‘busy’ per gestire lo stato di scorta delle papere

Implementazione Tecnica

Struttura delle Scene

Il gioco comprende quattro scene distinte:

  1. Scena Principale: Contiene la logica core del gameplay
  2. Game Over: Attivata quando la vita delle papere raggiunge zero
  3. Time Up: Attivata quando il tempo limite scade
  4. Mission Complete: Visualizzata al completamento con successo

Elementi di Interfaccia

Sviluppati attraverso prototipi individuali:

  • Bussola 3D che indica la destinazione più vicina
  • Orologio analogico per la scansione del tempo
  • Sistema di gestione vita e stamina
  • Sistema di tracking per esplosioni e proiettili

Approccio allo Sviluppo

Il progetto è stato costruito usando un approccio di prototipazione modulare:

  • Prototipi indipendenti per ogni funzionalità principale
  • Integrazione dei prototipi di successo nel gioco principale
  • Test e raffinamento iterativo

Architettura Tecnica

  • Sistema Logico: Costruito usando il Logic Editor di Blender
  • Scripting: Script personalizzati in Python
  • Sistema Eventi: Architettura Sensore-Controller-Attuatore
    • Sensori per il rilevamento degli eventi
    • Controller per operazioni logiche
    • Attuatori per manipolare il mondo di gioco

Esempio di Codice (arbiter.py)

import GameLogic as GL

# Ottiene controller e owner correnti
cont = GL.getCurrentController()
own = cont.getOwner()

# Ottiene sensori e attuatori
msgask = cont.getSensor("mayfollow")
msglost = cont.getSensor("lost")
msgstopshootact = cont.getActuator("stopshooting")

def showCompass():
    compass = GL.getCurrentScene().getObjectList()["OBcompass"]
    compass.tracking = 1
    duck = GL.getCurrentScene().getObjectList()[own.duck]
    duckPos = duck.getPosition()
    compass.setPosition([duckPos[0], duckPos[1], duckPos[2] + 5])
    compass.setVisible(1)

def showStamina():
    staminabar = GL.getCurrentScene().getObjectList()["OBGreenBar"]
    staminabar.isVisible = 1
    staminabar.setVisible(1)
    redbar = GL.getCurrentScene().getObjectList()["OBRedBar"]
    redbar.setVisible(1)

def showLife():
    lifebar = GL.getCurrentScene().getObjectList()["OBGoldBar"]
    lifebar.isVisible = 1
    lifebar.setVisible(1)
    blackbar = GL.getCurrentScene().getObjectList()["OBBlackBar"]
    blackbar.setVisible(1)

# Gestisce richiesta di seguimento
if msgask.isPositive() and not own.busy:
    ack = cont.getActuator("follow")
    name = msgask.getBodies()[0]
    own.duck = name
    ack.setBody(name)
    GL.addActiveActuator(ack, 1)
    own.busy = 1
    GL.addActiveActuator(msgstopshootact, 1)
    showStamina()
    showCompass()
    showLife()

# Gestisce segnale di perdita
if msglost.isPositive() and own.busy == 1:
    own.busy = 0