Eu quero fazer um jogo moddable. Como isso afeta minha escolha de linguagem de programação? [fechadas]

26

Eu comecei a fazer alguns jogos pequenos em Java e estou pensando em aprender C # para um projeto maior. Eu gostaria muito de fazer um jogo modável, mas alguém me disse que eu preciso ficar com o Java se eu quiser que o jogo seja modável, embora eu não entenda o porquê.

Então, quais características da linguagem de programação tornam uma linguagem mais adequada para jogos modificáveis?

viciado em jogo
fonte
3
Se você deseja criar um jogo modável, o PhysicsFS pode ser uma biblioteca muito útil para se conhecer. (Não tem nada a ver com a física, não deixe que o nome enganá-lo :).)
Paul Manta
10
"mas alguém me disse que eu preciso ficar com o Java se quiser que o jogo seja modificável" Isso, a propósito, é BS.
precisa saber é o seguinte

Respostas:

18

Depende de como você deseja projetar seu sistema mod. Vou explorar dois deles.

SDK

Provavelmente, você precisará que seus modders usem o mesmo idioma que você e carregue mods por reflexão (ou similar, dependendo do idioma de sua escolha). Obviamente, isso limitará você a idiomas que podem fazer ligação tardia - e muitos podem fazer isso (mesmo C pode fazer ligação tardia com alguns LoadLibrarytruques inteligentes ). Você pode até fazer uma meta-modificação, onde um mod pode hospedar outros mods (por exemplo, mods com script).

O primeiro problema com essa abordagem é ocultar o estado interno. Tomando C #, por exemplo, um modder poderia simplesmente usar reflexão para acessar membros privados, C também pode fazer isso (embora seja necessário mais esforço).

O segundo problema está hospedando. As pessoas realmente não gostam de código estrangeiro em execução no sistema sem sandbox no lugar. Como pior cenário, você pode escrever um mod que configure um seedbox; se isso foi instalado em um ISP, poderia causar sérios danos à sua reputação.

Script

Os modders usariam uma linguagem como Lua para criar mods. Você exigiria uma linguagem que pudesse invocar o código nativo (para fazer interface com Lua); ou você teria que escrever sua própria linguagem de script no idioma de sua escolha.

O primeiro problema aqui é que a maioria das linguagens de script é interpretada, o que pode não ser aceitável para sistemas em tempo real (embora veja LuaJIT); como jogos.

Ironicamente, o segundo problema ainda existe aqui; Tomando Lua como exemplo, fiquei extremamente desapontado por ter funções de 'descasque' incluídas na biblioteca principal / padrão - tornando-o totalmente inútil como um ambiente de área restrita (sem uma grande quantidade de esforço, sorte e manutenção), é difícil retrate o quão bravo estou com isso, mas eu realmente espero que eles estejam bebendo alguns coquetéis fortes quando incluírem esses anti-recursos . Obviamente, você poderia evitar isso facilmente se rolasse sua própria linguagem (consulte: UnrealScript).

Finalmente, o custo de interagir com um mecanismo de script pode ser proibitivo - novamente, tomando Lua como exemplo, combinado com C #: C # possui uma sobrecarga substancial ao invocar funções nativas (via P / Invoke) e Lua é uma API bastante 'falante'. Isso pode causar problemas se a maneira como você cria o 'script SDK' exigir muito bate-papo entre o idioma principal e a linguagem de script (observe que C realmente não tem esse problema). Novamente, você pode evitar isso escrevendo sua própria linguagem de script (e no caso de C # compilando-a no MSIL) e executando-a da maneira mais rápida no seu ambiente [virtual].

Como o script está essencialmente rodando em um sistema completamente diferente do seu código primário, você pode controlar o acesso ao estado interno completamente (a menos que eles façam coisas sofisticadas com as funções de shell mencionadas anteriormente).

Conclusão

Eu fiz veer um tópico off-bit, no entanto, o que você pode basicamente Garner daquela parede de texto é que você deve ser capaz de fazer um jogo moddable em qualquer idioma (eu arriscaria dizer que você puder ) - mas em alguns idiomas pode levar a mais trabalho. Eu sou um pouco anal com segurança? Sim, você também deveria ser quando se trata de código de usuário.

Jonathan Dickinson
fonte
No primeiro cenário que você descreveu, você está falando sobre o usuário realmente programar sua própria biblioteca dinâmica e conectá-la ao jogo? Eu já vi isso ser usado antes em bibliotecas (por exemplo, biblioteca de áudio para adicionar novos codecs etc.), mas, possivelmente porque nunca gostei muito de modding, nunca encontrei um caso como esse para um jogo. Estou curioso sobre isso (já que parece realmente difícil para o usuário saber como fazer isso e geralmente vejo os mods como acessíveis), então você conhece algum exemplo? Na maioria das vezes, vejo ferramentas especializadas, como editores mundiais com um pouco de script sendo usado.
David Gouveia
11
@DavidGouveia Acredito que pelo menos uma versão do mecanismo Paradox usada para Europa Universalis (e jogos equivalentes por diferentes períodos de tempo) suportou uma forma de patch binário (embora possa ter sido por causa do modder patch a fonte e recompilar uma das as DLLs dos jogos em vez de ter o suporte adequado ao SDK), além do mod mais comumente alterado, alterando a implementação de um arquivo de dados.
Dan Neely
2
@DavidGouveia veja: Mecanismo de origem; ou até plugins Winamp. Eu acho que o Quake funciona assim. Eu anotei que você usa C #; para que você possa procurar no MEF (Managed Extensibility Framework): exponha uma interface, carregue-a por meio de reflexão e leve seu tio a um cargo.
Jonathan Dickinson
@ JonathanDickinson Oh, eu não tinha ideia de que o mecanismo Source funcionava sob esse modelo. Sempre imaginei um conjunto de ferramentas como o The Elderer's Scrolls Construction. Obrigado pela informação (eu tinha uma idéia de como funcionava, apenas pensei que poderia ser muito complicado para o modder geral usar). E eu realmente ri da "parte do seu tio bob" . :-)
David Gouveia
11
Re Lua: Esses caras têm um Lua em sandbox adequado para uso em software wiki (e estável o suficiente para ser usado pela Wikipedia em inglês). Tenho certeza de que você pode adaptá-lo às suas necessidades, mas algumas partes da extensão são da GPL, portanto verifique com seu advogado.
Kevin
16

Eu diria que a linguagem não é um fator decisivo aqui, é realmente o quão flexível e orientada por dados você faz seu jogo que a define.

Todo jogo roda em um conjunto de dados (por exemplo, tudo, desde níveis, malhas, configurações, itens). A diferença entre um jogo normal e um jogo modável é que, posteriormente, fornece ferramentas que permitem ao usuário modificar dados existentes (ou adicionar seus próprios dados). Qualquer que seja o idioma que você escolher, tente tornar o jogo o mais guiado por dados possível e evite codificar qualquer conteúdo do jogo. Praticamente qualquer idioma que você provavelmente escolherá poderá ler dados do disco, o que é mais do que você precisa.

Também está na metade do caminho, se você apenas criar as ferramentas para seu uso pessoal (por exemplo, seu próprio editor de níveis) e depois aperfeiçoá-las e compartilhá-las com seus usuários. O editor de nível Super Meat Boy era praticamente isso, uma versão melhorada da ferramenta usada durante o desenvolvimento do jogo.

E, dependendo do tipo de jogo, convém permitir que os usuários escrevam parte do comportamento do jogo. Nesse caso, você deve incorporar uma linguagem de script ao seu jogo desde o início (seja a sua ou uma já existente, como Lua ou Python, que são escolhas populares). Isso também se enquadra na categoria de design orientado a dados. Se você decidir usar uma linguagem de script existente, talvez valha a pena verificar se a linguagem de programação de sua escolha possui ligações para essa linguagem de script (geralmente na forma de bibliotecas de terceiros).

David Gouveia
fonte
5

O idioma que você escolhe não determina realmente como um jogo é modável, a maneira como você usa o idioma é mais importante.

Se a maior parte do seu jogo for orientada por dados (ou seja, os dados do jogo são definidos em um arquivo que é lido a partir do seu código), o jogo pode ser muito modificável. Isso pode ser feito em praticamente qualquer idioma. O uso de uma linguagem de script também facilita a modificação de um jogo.

No entanto, isso não significa automaticamente que não usar essas coisas torna impossível modificar um jogo. O Minecraft, por exemplo, não é um jogo muito modificável, no entanto, existem bons decompiladores disponíveis para Java e uma comunidade muito grande para o Minecraft; portanto, muitas ferramentas foram feitas para tornar o Minecraft modificável (vários modloaders, Bukkit). Com essas ferramentas, é possível modificar o Minecraft (no entanto, elas são, provavelmente, tecnicamente ilegais em alguns países).

O melhor conselho que posso dar é usar as ferramentas que você deseja que os modders usem; Se você definir um NPC a partir de um arquivo, ele poderá ser modificado; se você especificar um código especial, provavelmente não poderá ser.

Elva
fonte
1

Java é perfeitamente adequado para escrever um jogo modável.

Dito isto, a melhor maneira de tornar um jogo modificável é geralmente adotar uma linguagem dinâmica que possa ser incorporada ao aplicativo mais amplo e usada para scripts. Você normalmente deseja uma linguagem dinâmica porque o objetivo é poder interagir com o código em tempo de execução, sem passar por todo um ciclo de compilação / construção / teste.

Algumas opções de idioma dinâmico a serem consideradas:

  • Groovy - uma excelente linguagem dinâmica semelhante a Java que pode ser incorporada em programas Java maiores.
  • Clojure - um Lisp poderoso e dinâmico para a JVM. Pode ser difícil para alguns modders entenderem o assunto, mas é uma linguagem excepcionalmente poderosa e pode ser incorporada com muita facilidade. Ainda não o vi usado para modificação de jogos, mas não há razão para isso.
  • Lua - uma linguagem de script de jogo muito popular. Eu acredito que existem versões para a JVM que você pode usar no Java (embora eu não tenha tentado isso pessoalmente)
  • JavaScript - disponível na JVM via Rhino . Uma escolha bastante sólida para scripts de jogos, já que muitas pessoas conhecem algum JavaScript, além do modelo de objeto de protótipo se encaixar muito bem nos mods de jogos.
Mikera
fonte
-2

Existe uma maneira mais fácil de fazer isso em java, embora seja um pouco desleixado. Tudo o que você precisa fazer é pegar os arquivos java de ponto em uma pasta e, em seguida, colocar esse arquivo em lotes com a pasta, denomine Run:

javac /src/.java Java / src /

Nota: Você pode adicionar quantas classes desejar. Nota: Na última linha, certifique-se de NÃO colocar extensões conhecidas como .java, .exe, .bat, ect.

Isso basicamente recompilará o código toda vez que o jogo for executado, portanto, se a fonte do jogo for alterada, ele será compilado e, em seguida, será executado o jogo recém-compilado ... Infelizmente, você não pode adicionar mods de outras pessoas ao jogo.

Jacob Picke s
fonte
Jacob: Acho que você não entendeu a pergunta, leia as respostas e veja se isso ajuda a entender o que estava sendo discutido aqui.
vikki