creare gioco multiplayer con blender

Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
  • Autore
    Articoli
  • #16301

    craig1305189435
    Partecipante
    • Blenderista
    • Post sul forum 136

    Salve a tutti, era da veramente tanto che non postavo in questo forum, anche per motivi di impegni scolastici 😉

    Ora vorrei cimentarmi nella creazione di un gioco multiplayer con blender + python.

    Premetto che conosco mediamente il motore di gioco di blender, nonchè python. Tuttavia non ho mai sperimentato l’integrazione fra il frullatore e questo linguaggio di scripting.

    Tuttavia non saprei proprio da dove partire… mi potreste consigliare qualcosa per piacere?

    rinagrazio anticipatamente

    #184267

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul forum 456

    Se vuoi creare un multiplayer dove tutti giocano sullo stesso computer, la questione è molto più semplice… ma non credo che sia questo che tu voglia.

    Immagino che tu voglia creare un gioco dove i giocatori giocano su computer diversi connessi alla rete… Beh, in questo caso ti servirà  molta pazienza, perché è una cosa estremamente complicata.

    Beh, tempo fa volevo realizzare la stessa cosa, e avevo trovato questo:

    Metodo WSAG

    Credo che sia l’unica guida in circolazione che ti spiega come creare un gioco multiplayer.

    In parole povere funziona così: un computer apre il gioco in modalità  “Server”, altri computer aprono il gioco in modalità  “client”. I client dialogano con il computer server scambiandosi le informazioni (posizione dei giocatori etc): ogni gioco genera poi al suo interno delle copie dei personaggi altrui sulla base delle istruzioni ricevute dal server.

    Quelle copie non sono controllate direttamente dagli altri giocatori, ma dal gioco stesso. Tutti i giocatori hanno però l’impressione di stare giocando tutti insieme nella stessa partita.

    A parte il fatto che è una guida per la 2.49 (e, per uno che non mastica python, come me :lol:, è difficilotta), ci sono alcuni dettagli sul metodo che francamente non mi convincono molto.

    Recentemente stavo ragionando su metodi alternativi, ma non ne ho trovati di validi.

    (Avevo pensato a un sistema simile, ma che sostituiva al computer server una pagina web php: i giocatori caricavano i propri dati automaticamente al suo interno e scaricavano i dati altrui per gestire le copie. Sulla carta funziona, ma con una prova pratica risulta inutile: la connessione al sito è lenta quanto quella ai computer server, quindi non cambia un gran che).

    Auguri! Ne avrai bisogno… 🙄

    #184268

    craig1305189435
    Partecipante
    • Blenderista
    • Post sul forum 136

    anch’io avevo realizzato ad un metodo simile al tuo, con i client programmati in python che ‘chattavano’ fra loro connettendosi ad una pagina php… ma se andava bene per una chat, non credo proprio possa funzionare per un videogioco. Ringrazio per la guida che leggerò al più presto 🙂 se riuscirò a cavare fuori qualcosa di buono vi farò sapere 😉

    EDIT: non riesco in alcun modo ad aprire la pagina da te linkata..il browser dice che la connessione al server è stata annullata. Tu riesci a visualizzarla?

    #184269

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul forum 456

    Strano! Me la visualizza correttamente…

    Prova il link diretto alla guida.

    http://oldjim.ch/OJW-HP/dateien/WSAG3xTutorial.pdf

    craig wrote:
    […]ma se andava bene per una chat, non credo proprio possa funzionare per un videogioco.

    Infatti. Facendo un aggiornamento ogni secondo funzionava, ma era lentissimo.

    E questo senza aggiornare con una frequenza gradevole all’utente, e senza nessuna texture, con personaggi cubici e ambiente formato da 4 vertici. 🙁 Peccato.

    #184270

    craig1305189435
    Partecipante
    • Blenderista
    • Post sul forum 136

    Grazie, quel link mi funziona perfettamente 😀

    #184271

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul forum 456

    Good. 🙂

    #184272

    craig1305189435
    Partecipante
    • Blenderista
    • Post sul forum 136

    Okai, dopo aver scaricato la guida mi è venuto in mente di provare a farlo senza leggerla, semmai nel caso non riuscissi a cavare niente di buono potrò sempre seguire la guida 🙂

    Ho cominciato a creare con python due classi (client e server) per schematizzare l’invio della proprie coordinate fra due computers:

    client

    Code:
    #!/usr/bin/python
    #client
    import socket

    class Client(object):

    def __init__(self, host, port):
    “””crea il socket client”””
    self.host = host
    self.port = port
    self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.client.connect((self.host, self.port))

    def loop(self):
    “””invia messaggio al server”””
    self.client.send(raw_input(‘la tua posizione ‘))
    server_position = self.client.recv(1024)
    print ‘posizione di’, self.host, ‘:’,server_position

    host = raw_input(‘inserire host ‘)
    port = int(raw_input(‘inserire port ‘))
    client = Client( host, port)

    while 1:
    client.loop()

    server

    Code:
    #!/usr/bin/python
    #server
    import socket

    class Server(object):
    def __init__(self, host, port):
    “””crea socket in ascolto”””
    self.host = host
    self.port = port
    self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.server.bind((self.host, self.port))
    self.server.listen(5)

    def loop(self):
    “””trattamento delle connessioni”””
    while 1:
    conn, addr = self.server.accept()
    print ‘connessione stabilita con: ‘, addr
    while 1:
    client_position = conn.recv(1024)
    if client_position:
    print ‘posizione di’, addr, ‘:’, client_position
    conn.send(raw_input(‘la tua posizione ‘))
    conn.close()

    host = raw_input(‘inserire host, poer ascoltare tutto lasciare vuoto ‘)
    port = int(raw_input(‘inserire port ‘))
    server = Server(host, port)
    server.loop()

    Naturalmente nel gioco non si inseriranno manualmente le proprie coordinate 😉

    Il problema che ho trovato è che, mentre funzionano correttamente in lan, se piazzo client e server su due computers differenti il router blocca le connessioni in entrata nel server. Ho risolto utilizzando Hamachi http://it.wikipedia.org/wiki/Hamachi

    Ma in questo modo, distribuendo il gioco, bisognerebbe installare anche hamachi. Che voi sappiate non esiste un modo per effettuare il port forwarding direttamente con python?

    #184273

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul forum 456

    Bisogna inserire una “scappatoia” nel firewall: è nelle prime pagine di questo tutorial.

    http://oldjim.ch/OJW-HP/dateien/WSAG4xTutorial.pdf

    #184274

    craig1305189435
    Partecipante
    • Blenderista
    • Post sul forum 136

    Ciò che è scritto nella guida è un metodo ‘manuale’ che già  utilizzavo ma… nella remota possibilità  in cui il mio gioco sia utilizzato da altre persone, le dovrei costringere a settare il firewall ed il router? Mi chiedevo se ci fosse un modo automatizzato, ad esempio se si potesse creare uno script python che lo faccia appoggiandosi a moduli particolari. Purtroppo in internet non ho trovato niente.

    #184275

    craig1305189435
    Partecipante
    • Blenderista
    • Post sul forum 136

    In questi due giorni ho elaborato questo:

    CODICE DA ESEGUIRE IN BLENDER

    Code:
    import Blender

    import socket

    pg = Blender.Object.Get(‘pg’)

    def move( x,y,z):

    “””muove il personaggio alle coordinate specificate”””

    pg.LocX = float(x)

    pg.LocY = float(y)

    pg.LocZ = float(z)

    #crea socket

    host = ” #indica l’indirizzo verso cui ascoltare, lasciare vuoto per ascoltare tutto

    port = 1227 #la porta del socket

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    server.bind((host, port))

    server.listen(1)

    #trattamento delle connessioni

    while 1:

    conn, addr = server.accept()

    print ‘connessione stabilita con: ‘, addr

    while 1:

    x = conn.recv(1024)

    y = conn.recv(1024)

    z = conn.recv(1024)

    if x and y and z:

    conn.send(‘okok’)

    move(x,y,z)

    Blender.Window.Redraw()

    conn.close()

    CLIENT

    Code:
    #!/usr/bin/python
    #client
    import socket

    class Client(object):

    def __init__(self, host, port):
    “””crea il socket client”””
    self.host = host
    self.port = port
    self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.client.connect((self.host, self.port))

    def loop(self):
    “””invia messaggio al server”””
    self.client.send(raw_input(‘x: ‘))
    self.client.send(raw_input(‘y: ‘))
    self.client.send(raw_input(‘z: ‘))
    server_position = self.client.recv(1024)
    print ‘posizione di’, self.host, ‘:’,server_position

    host = raw_input(‘inserire host ‘)
    port = int(raw_input(‘inserire port ‘))
    client = Client( host, port)

    while 1:
    client.loop()

    In pratica il mio obiettivo era testare l’integrazione fra python e blender ed il corretto funzionamento dei sockets.

    Tuttavia se faccio il sensore always e controller python e li collego allo script, se premo p blender crasha. Sapreste aiutarmi per favore??

    #184276

    IzE_Design
    Partecipante
    • Blenderista
    • Post sul forum 202

    io pure mi sono cimentato nella creazione di un multiplayer per blender partendo da 0 e arrivando ad uno script che gestisce un nuore non identificato di client…, l'unico problema che ho avuto sono proprio i firewall dei ruoter… orma sarebbe anche ora di riprendere in mano lo sviluppo di sto script 🙂

    https://www.blender.it/ipb_forum/index.php?/topic/8803-izenetv4-bcon4/page__hl__izenetv4__st__200

    #184277

    craig
    Partecipante
    • Blenderista
    • Post sul forum 41

    AH, la mia discussione sul vecchio forum è stata importata qui XD

    @ize

    Il mio problema non è il firewall del router, che ho risolto con hamachi( mi è sembrata per ora la soluzione più semplice e portabile, e può essere usata anche dai non smanettoni)

    Lo script funziona, ma solo se lo eseguo dal text editor, non se lo cerco di eseguire da GE

    #184278

    IzE_Design
    Partecipante
    • Blenderista
    • Post sul forum 202
    'craig' wrote:

    AH, la mia discussione sul vecchio forum è stata importata qui XD

    @ize

    Il mio problema non è il firewall del router, che ho risolto con hamachi( mi è sembrata per ora la soluzione più semplice e portabile, e può essere usata anche dai non smanettoni)

    Lo script funziona, ma solo se lo eseguo dal text editor, non se lo cerco di eseguire da GE

    ma ti da qualche errore in console se lo esegui dal GE?

    ho gia visto che c'erano dei socket alternativi per oltrepassare i firewall, infatti è ora che mi rimetta dietro al mio script per vedere di risolverlo 🙂

    #184279

    craig
    Partecipante
    • Blenderista
    • Post sul forum 41

    no, niente messaggi di errore. Semplicemente si blocca prima di partire la schermata di gioco 🙂

    #184280

    IzE_Design
    Partecipante
    • Blenderista
    • Post sul forum 202

    potrebbe essere colpa die socket, se hai usato il tipo TCP o l'UDP senza usare il “setblocking(0)” potrebbe essere normale, perche in tal caso lo script blocca l'intero gioco finche il socket non riceve dei dati, con il Setblocking, lo script salta l'attesa del socket in modo da non bloccare il gioco… potrebbe essere questo il problema…

Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)

Devi essere loggato per rispondere a questa discussione.