Voglio fare un gioco modificabile. In che modo ciò influisce sulla mia scelta del linguaggio di programmazione? [chiuso]


26

Ho iniziato a creare alcuni piccoli giochi in Java e sto pensando di imparare C # per un progetto più grande. Mi piacerebbe molto fare un gioco modificabile, ma qualcuno mi ha detto che devo rimanere con Java se voglio che il gioco sia modificabile, anche se non capisco perché.

Quindi, quali caratteristiche del linguaggio di programmazione rendono un linguaggio più adatto ai giochi modificabili?


3
Se vuoi creare un gioco modificabile, PhysicsFS potrebbe essere una libreria molto utile da conoscere. (Non ha nulla a che fare con la fisica, non lasciarti ingannare dal nome :))
Paul Manta,

10
"ma qualcuno mi ha detto che devo rimanere con Java se voglio che il gioco sia modificabile" Questo, tra l'altro, è BS.
Ray Dey,

Risposte:


18

Dipende da come vuoi progettare il tuo sistema mod. Ne esplorerò due.

SDK

Molto probabilmente dovrai richiedere che i tuoi modder utilizzino la stessa lingua che usi tu e caricare le mod tramite la riflessione (o simili, a seconda della lingua che preferisci). Questo ovviamente ti limiterà alle lingue che possono eseguire il binding tardivo - e ce ne sono molte che possono farlo (anche il C può eseguire il binding tardivo con qualche LoadLibraryinganno intelligente ). Potresti anche fare qualche meta-modding, in cui una mod potrebbe ospitare altre mod (ad esempio mod con script).

Il primo problema con questo approccio è nascondere lo stato interno. Prendendo ad esempio C # un modder potrebbe semplicemente usare la riflessione per accedere ai membri privati, C può anche farlo (anche se è necessario uno sforzo maggiore).

Il secondo problema è l'hosting. Alla gente non piace molto il codice straniero in esecuzione sul proprio sistema senza sandbox in atto. Come scenario peggiore potresti scrivere una mod che imposta un seedbox; se questo fosse installato su un ISP, potrebbe danneggiare seriamente la loro reputazione.

Scripting

I modder userebbero un linguaggio come Lua per creare mod. Avresti bisogno di una lingua che potrebbe invocare il codice nativo (per interfacciarsi con Lua); o dovresti scrivere il tuo linguaggio di scripting nella tua lingua preferita.

Il primo problema qui è che la maggior parte dei linguaggi di scripting viene interpretata, il che potrebbe non essere accettabile per i sistemi in tempo reale (anche se, vedi LuaJIT); come i giochi.

Ironia della sorte, il secondo problema esiste ancora qui; prendendo come esempio Lua, sono rimasto estremamente deluso dal fatto che abbia funzioni di "bombardamento" incluse nella libreria core / default - rendendolo completamente inutile come ambiente sandbox (senza un grande sforzo, fortuna e manutenzione), è difficile Descrivo quanto sono arrabbiato per questo, ma spero davvero che stessero bevendo dei cocktail forti quando includevano questi anti-funzionalità . Ovviamente potresti facilmente evitarlo se avessi implementato la tua lingua (vedi: UnrealScript).

Infine, il costo dell'interazione con un motore di scripting può essere proibitivo - prendendo di nuovo Lua come esempio, combinato con C #: C # ha un notevole sovraccarico quando si invocano funzioni native (tramite P / Invoke) e Lua è un'API piuttosto "chiacchierona". Ciò potrebbe causare problemi se il modo in cui si progetta lo "script SDK" richiede molte chat tra la lingua principale e il linguaggio di scripting (si noti che C non ha realmente questo problema). Ancora una volta potresti evitarlo scrivendo il tuo linguaggio di scripting (e nel caso in cui C # lo compili in MSIL) ed eseguendolo nel modo più rapido nel tuo ambiente [virtuale].

Poiché lo script è essenzialmente in esecuzione su un sistema completamente diverso dal codice primario, è possibile controllare completamente l'accesso allo stato interno (a meno che non facciano cose fantasiose con le funzioni di shell precedentemente menzionate).

Conclusione

Ho fatto un po 'fuori tema, tuttavia, quello che puoi sostanzialmente ottenere da quel muro di testo è che dovresti essere in grado di creare un gioco modificabile in qualsiasi lingua (mi permetto di dire che puoi ) - ma in alcune lingue può portare a più lavoro. Sono un po 'ansioso della sicurezza? Sì, dovresti esserlo anche quando si tratta di codice utente.


Nel primo scenario che hai descritto, stai parlando dell'utente che sta effettivamente programmando la sua libreria dinamica e inserendola nel gioco? L'ho già visto prima nelle librerie (ad es. Libreria audio per aggiungere nuovi codec, ecc.) Ma, forse perché non ho mai guardato troppo al modding, non ho mai incontrato un caso come questo per un gioco. Sono curioso di questo (dal momento che sembra davvero difficile per l'utente sapere come fare e di solito vedo le mod come accessibili) quindi conosci qualche esempio? Il più delle volte vedo strumenti specializzati, come editor mondiali con un po 'di scripting in uso.
David Gouveia,

1
@DavidGouveia Credo che almeno una versione del motore Paradox utilizzato per Europa Universalis (e giochi equivalenti per diversi periodi di tempo) supportasse una forma di patch binario (anche se potrebbe essere stato avendo la patch modder la fonte e ricompilare una di le DLL dei giochi invece di avere un adeguato supporto SDK) oltre alla mod più comunemente usata modificando un'implementazione del file di dati.
Dan Neely,

2
@DavidGouveia vedi: motore di origine; o persino plugin Winamp. Penso che Quake funzioni anche così. Ho raccolto che usi C #; quindi potresti voler esaminare MEF (Managed Extensibility Framework): esporre un'interfaccia, caricarla tramite la riflessione e bob è tuo zio.
Jonathan Dickinson,

@JonathanDickinson Oh, non avevo idea che il motore Source funzionasse con questo modello. Ho sempre immaginato un set di strumenti come il set The Elder's Scrolls Construction. Grazie per le informazioni (avevo idea di come funzionasse, ho pensato che potesse essere troppo complicato per il modder generale da usare). E ho riso davvero di "Bob è la parte di tuo zio" . :-)
David Gouveia,

1
Ri Lua: Questi ragazzi hanno un Lua sandbox adatto all'uso nel software wiki (e abbastanza stabile da essere utilizzato da Wikipedia in inglese). Sono sicuro che potresti adattarlo alle tue esigenze, ma alcune parti dell'estensione sono GPL quindi controlla con il tuo avvocato.
Kevin,

16

Direi che la lingua non è un fattore determinante qui, è davvero solo quanto flessibile e guidato dai dati crei il tuo gioco che lo definisce.

Ogni gioco viene eseguito su un set di dati (ad es. Tutto, da livelli, mesh, configurazioni, elementi). La differenza tra un gioco normale e un gioco modificabile è che il successivo fornisce strumenti che consentono all'utente di modificare i dati esistenti (o aggiungere i propri dati). Qualunque lingua tu scelga, prova a rendere il tuo gioco il più possibile guidato dai dati ed evita di codificare qualsiasi contenuto di gioco. Praticamente qualsiasi lingua tu scelga probabilmente può leggere i dati dal disco, che è la maggior parte di ciò di cui hai bisogno.

È anche a metà strada se crei semplicemente gli strumenti per il tuo uso personale (ad esempio il tuo editor di livelli) e successivamente li perfezioni e li condividi con i tuoi utenti. L' editor di livello di Super Meat Boy era praticamente quello, una versione migliorata dello strumento utilizzato durante lo sviluppo del gioco.

E a seconda del tipo di gioco, potresti voler consentire agli utenti di scrivere alcuni comportamenti del gioco. Nel qual caso dovresti cercare di incorporare un linguaggio di scripting nel tuo gioco fin dall'inizio (o il tuo, o uno esistente come Lua o Python che sono scelte popolari). Ciò rientra anche nella categoria della progettazione basata sui dati. Se decidi di utilizzare un linguaggio di scripting esistente, potrebbe valere la pena verificare se il linguaggio di programmazione di tua scelta ha associazioni per quel linguaggio di scripting (di solito sotto forma di librerie di terze parti).


5

La lingua che scegli non determina in realtà quanto sia modificabile un gioco, il modo in cui usi la lingua è più importante.

Se la maggior parte del tuo gioco è basata sui dati (ovvero i dati di gioco sono definiti in un file letto dal tuo codice), il gioco può essere molto modificabile. Questo può essere fatto praticamente in qualsiasi lingua. L'uso di un linguaggio di scripting semplifica anche la modifica di un gioco.

Tuttavia, ciò non significa automaticamente che non si usino queste cose, è impossibile modificare un gioco. Minecraft ad esempio non è affatto un gioco modificabile, tuttavia ci sono decompilatori abbastanza buoni disponibili per Java e una comunità molto grande per Minecraft, quindi sono stati fatti molti strumenti per rendere modificabile Minecraft (vari modloader, Bukkit). Con questi strumenti è possibile modificare Minecraft (tuttavia sono, probabilmente, tecnicamente illegali in alcuni paesi).

Il miglior consiglio che posso darti è di usare gli strumenti che vuoi che i modder utilizzino; Se si definisce un NPC da un file, può essere modificato, se nel caso particolare nel codice probabilmente non può esserlo.


1

Java è perfettamente adatto per scrivere un gioco modificabile.

Detto questo, il modo migliore per rendere modificabile un gioco è di solito adottare un linguaggio dinamico che può essere incorporato nell'applicazione più ampia e utilizzato per gli script. In genere si desidera un linguaggio dinamico perché il punto è poter interagire con il codice in fase di esecuzione, senza passare attraverso un intero ciclo di compilazione / compilazione / test.

Alcune scelte linguistiche dinamiche da considerare:

  • Groovy - un eccellente linguaggio dinamico simile a Java che può essere incorporato in programmi Java più grandi.
  • Clojure : un Lisp potente e dinamico per la JVM. Potrebbe essere difficile per alcuni modder ottenere la testa, ma è un linguaggio eccezionalmente potente e può essere incorporato molto facilmente. Non l'ho ancora visto usato per modificare il gioco, ma non c'è motivo per cui no.
  • Lua - un linguaggio di scripting di gioco molto popolare. Credo che ci siano versioni per la JVM che puoi usare da Java (anche se non le ho provate io stesso)
  • JavaScript : disponibile su JVM tramite Rhino . Una scelta abbastanza solida per gli script di gioco in quanto molte persone conoscono JavaScript, oltre al modello di oggetto prototipo che si adatta molto bene alle mod di gioco.

-2

C'è un modo più semplice per farlo in Java anche se è un po 'sciatto. Tutto quello che devi fare è prendere i file java punto in una cartella e quindi inserire questo file batch con la cartella, chiamalo Esegui:

javac /src/.java Java / src /

Nota: puoi aggiungere tutte le classi che desideri. Nota: nell'ultima riga assicurarsi di NON inserire alcuna estensione, ad esempio .java, .exe, .bat, ect.

Fondamentalmente questo ricompilerà il codice ogni volta che il gioco viene eseguito, quindi se la fonte del gioco cambia, lo compilerà e quindi eseguirà il gioco appena compilato ... Purtroppo non puoi aggiungere le mod di altre persone al gioco.


Jacob Non credo che tu abbia capito la domanda, per favore leggi le risposte e vedi se questo ti aiuta a capire di cosa si stava discutendo qui.
Vikki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.