Flying Boxes

Volevo presentarvi Flying Boxes, un gioco fatto da un mio amico lunedì notte in sole 9 ore e poi perfezionato in martedì e oggi.

È un gioco in terza persona: voi mandate a destra e sinistra un aereo, il quale deve schivare le casse di legno.

Vi spostate con i tasti direzionali: sinistra e destra spostate l’aereo, con la freccia in su date il “turbo”, ovvero aumentate la velocità di molto.

Il gioco è multipiattaforma (è fatto in python con Panda3d), però vi linko il setup per Windows.

In ogni caso se volete potete giocare anche con le altre piattaforme, basta installare Panda3D ed estrarre dal setup game/main.py, e le cartelle $_OUTPUT_DIR/models e $_OUTPUT_DIR/images (magari con 7zip).

Download del setup (mirror)

Panda3D: distribuire giochi in C++ su Windows

Vi ho parlato più di una volta di Panda3D: un motore per giochi libero e multipiattaforma.

Finora però ho sempre parlato di problemi pratici riguardanti la programmazione, ma non ho mai parlato del problema della compilazione e della distribuzione, che invece sono molto importanti.

Le due piattaforme supportate principalmente da Panda sono Windows e GNU Linux.

Per la compilazione su GNU Linux non ci sono problemi, basta avere il compilatore GNU fare copia e incolla dalla pagina di Panda e si è a posto. Non escludo che comunque magari anche altri compilatori funzionino.

Su Windows si è invece costretti a usare Visual C++ 2008. Per usare la versione 2010 bisognerebbe ricompilarsi tutto Panda.

Io l’ho utilizzato per la prima volta ieri, comunque il tutto è abbastanza facile. Anche in questo caso basta seguire le istruzioni di Panda3D. Per le directory comunque vi consiglio di non metterle globali ma solo al progetto. Per farlo bisogna andare su Proprietà, Linker, Generale, Directory di include aggiuntiva (vado a memoria) e mettere C:\Panda3D-vers\python\include e C:\Panda3D-vers\include (sostituendo a vers la vostra versione). Per mettere la directory delle librerie invece dovete avere almeno un file C++ nel progetto, anche vuoto. Allora nella voce delle proprietà diventerà disponibile anche la scheda C/C++, in cui potrete andare ad inserire, mi pare in generale, le directory C:\Panda3D-vers\python\libs e C:\Panda3D-vers\lib. Magari quando ho un po’ di tempo controllo. Per ulteriori informazioni guardate questa pagina. … [Leggi il resto]

Panda3D e Broadcast

Tempo fa avevo cercato di creare la parte di networking per un videogioco che utilizza il motore Panda3D.

I giochi hanno bisogno di aggiornare velocissimamente le posizioni degli altri giocatori e tutti gli altri dati, perciò si usa UDP, un protocollo che è molto più veloce del TCP perché non fa controlli per vedere se sono arrivati i dati (e perciò è anche meno affidabile, ma non importa per un videogioco).

Una delle caratteristiche più belle di UDP è anche quella di poter fare il “broadcasting” di rete, ovvero mandare a tutti i client di una rete un pacchetto in una certa porta. Questa caratteristica può essere usata per esempio per fare la lista dei server a cui connettersi.

Panda3D teoricamente offre una funzione chiamata set_broadcast nella classe NetAddress, però non funziona, né in Python, né in C++. O almeno, non da sola.

In Python alla fine avevo lasciato perdere, però in C++ invece volevo sistemarla. Non riuscivo proprio a capire come fare, così ho cercato e ho visto che in generale bisogna dire al sistema operativo che la socket deve poter eseguire il broadcast.

Il set_broadcast sembra poterlo fare, ma se in realtà guardiamo il codice è solo una scorciatoia per inserire come indirizzo IP 255.255.255.255 necessario per fare appunto il broadcast ma non sufficiente.

Spulciando un po’ il codice ho trovato che serve abilitare il broadcast alla socket. Ed ecco come fare.

Quando creiamo la socket dal manager, otteniamo un puntatore alla connessione. Un metodo di quest’istanza è il get_socket, che normalmente restituirebbe un’istanza di Socket_IP, tuttavia questa classe non ha il metodo che ci serve. Allora dobbiamo “trasformarla” in una Socket_UDP, tramite il casting. Allora in quella possiamo chiamare il SetToBroadCast() e per magia il tutto funzionerà.

Tradotto in codice 😉 :

	Socket_UDP * sock = (Socket_UDP *)connection->get_socket();
	sock->SetToBroadCast();

connection è la connessione creata tramite il QueuedConnectionManager.

Una volta aggiunto questo come per magia il tutto funzionerà 😊

Panda3D: ruotare la telecamera col mouse

Come l’avevo fatto con Blender, ora lo faccio con Panda3D 😉

Dall’hello world della documentazione ufficiale, ho fatto questo script che muove la telecamera col mouse.

In pratica esegue un task - una funzione eseguita ad ogni frame - che controlla la posizione del mouse, la trasforma da radianti a gradi sessagesimali (usati da Panda) e alla rotazione che ha in quel momento la telecamera aggiunte quella ottenuta con la trasformazione. Infine centra il mouse.

Devo ancora capire perché trasformando le coordinate del mouse - il cui intervallo in panda è [-1; 1] - si riesca a ottenere una buona rotazione con Panda, però sembra funzionare bene!

Ecco lo script python:

#!/usr/bin/env python

from pandac.PandaModules import WindowProperties
from direct.showbase.ShowBase import ShowBase
from direct.task import Task
import math

class MyApp(ShowBase):

	def __init__(self):
		ShowBase.__init__(self)

		# Load the environment model.
		self.environ = self.loader.loadModel("models/environment")
		# Reparent the model to render.
		self.environ.reparentTo(self.render)
		# Apply scale and position transforms on the model.
		self.environ.setScale(0.25, 0.25, 0.25)
		self.environ.setPos(-8, 42, 0)

		# Disable the default camera behavior
		base.disableMouse()
		# Add the mouseCameraTask procedure to the task manager.
		self.taskMgr.add(self.mouseCameraTask, "mouseCameraTask")

	# Define a procedure to move the camera.
	def mouseCameraTask(self, task):
		mw=base.mouseWatcherNode

		# Execute the Task only if the mouse is on the Panda window
		if mw.hasMouse():
			x=mw.getMouseX()
			y=mw.getMouseY()
			curr=self.camera.getHpr()
			self.camera.setHpr(curr.x-x*180/math.pi, curr.y+y*180/math.pi, 0)
			base.win.movePointer(0, base.win.getXSize()/2, base.win.getYSize()/2)

		# Continue with the task
		return Task.cont

app = MyApp()
app.run()

Attenzione: vi consiglio di aggiungere un handler al tasto Esc per uscire, in quanto non riuscirete a raggiungere il tasto chiudi. Altrimenti dovete fare come me: usare le combinazioni di tasti Alt + Tab su GNOME per passare in un’altra finestra. In Windows dovrebbe essere sempre Alt + Tab o Super + Tab. In ogni caso lì c’è anche il Task Manager.

Panda3D per Debian Sid

Dopo aver studiato un po’ Blender e aver avuto qualche difficoltà ad ottenere esattamente quello che volevo con la Game logic ho deciso di provare un altro motore per videogiochi: Panda3D.

Panda3D è un motore rilasciato sotto la BSD Modified license e tra i suoi contributori si può citare la Walt Disney. Le sue API consentono di scrivere videogiochi in Python e in C++.

Come mesh da quanto ho capito - devo ancora approfondire per bene la questione - ha un formato suo (l’egg) ma è compatibile anche con X, 3ds ed esiste un plugin per esportare i file da Blender.

Perciò come caratteristiche promette bene.

Però c’è un problema: per Debian esiste il pacchetto solo per la Squeeze. E le dipendenze hanno software che include la versione nel nome del pacchetto e nei file stessi, perciò anche modificando il pacchetto non si ottiene un risultato utilizzabile (ho provato io stesso).

Così me lo sono ricompilato. Però la versione 1.72 (la stabile) non funzionava, così ho dovuto usare quella csv.

Per compilarla ho utilizzato il metodo makepanda/makepanda.py --everything --installer. Pur avendo specificato everything però alcune cose, tra cui ffmpeg sono state omesse. Invece con installer ho ottenuto un file deb che vi linko.

Un’ulteriore nota prima di scaricare e installare il file: ho compilato e installato anche bullet, una libreria per la fisica e anche Panda è configurato per usarla, perciò installate anche quel file. Purtroppo ho dovuto usare checkinstall e perciò non so le corrette dipendenze.

Ecco i link: bullet_2.79-1_i386.deb e panda3d1.8_1.8.0_i386.deb.

Spero vi possano tornare utili.