Qual é a tecnologia que permite a programação dentro de um jogo?

27

Existem alguns jogos que permitem ao jogador escrever / criar scripts no jogo, por exemplo: Engenheiros espaciais ou Psi .

Quero usar algo semelhante a qualquer um, mas tive dificuldade em encontrar informações, então minha pergunta é:

Existe um ramo da programação que cubra a capacidade de um software compilado para executar o novo código criado pelo usuário?

Por ramo de programação, quero dizer algo como PTG (Processural Terrain Generation).

Para evitar uma ampla base de perguntas ou opiniões , deixe-me declarar claramente que não estou procurando guias ou lugares para aprender. Quero o nome ou a definição (se houver) da tecnologia envolvida.

Westside Tony
fonte
22
Bem, provavelmente "Escrevendo intérpretes"?
MatthewRock
2
Respondi a uma pergunta semelhante recentemente , discutindo " Máquina Virtual " como o termo para o sistema que executa o código do usuário e também referenciando o artigo Game Programming Patterns no Bytecode Pattern como um meio de implementá-lo mais rapidamente do que um intérprete convencional.
DMGregory
3
É geralmente chamado de "script". Você encontrará muitos materiais sobre como implementar scripts em um jogo, além de vários exemplos de código-fonte aberto e código real. Em escopo mais amplo, existe todo o campo da programação de compiladores (que inclui lexing, análise, compilação, vinculação, interpretação ...). No escopo mais amplo (não necessariamente útil), isso envolve praticamente qualquer interação do usuário que seu aplicativo tenha - um mecanismo de script é realmente apenas uma maneira muito mais complexa de selecionar em um menu.
Luaan 26/09/16
2
Um programa Python pode hospedar scripts Python. Isso é chamado de metaprogramação. A maioria das linguagens interpretadas tem isso.
user6245072
11
AFAIK em Space Engineers, o código é compilado em C # em um ambiente de área restrita (o jogo foi de código aberto, para que você possa verificar como isso funciona on-line: github.com/KeenSoftwareHouse/SpaceEngineers ). Basicamente, o jogo é fornecido com um compilador C # e o código permite apenas o acesso às funções de API do jogo, de modo que o escopo do programa é limitado apenas a você. E se você estiver jogando multiplayer, em seguida, o código só é executado em sua máquina (outros jogadores / servidor apenas ver as conseqüências ingame)
Florian Castellane

Respostas:

42

Os scripts escritos em linguagens de script / incorporadas / interpretadas como "Lua", "Lisp" ou "AngelScript" ( mais aqui ) podem ser atualizados durante o jogo [*] e depois são interpretados (= executados) em tempo real.

Você pode vincular elementos desses scripts à sua codificação compilada nativa (C ++ etc.) para que os scripts possam executar a lógica do seu aplicativo. Por exemplo. um comando específico que o usuário pode colocar no script, como resultado, move o personagem do jogo por uma determinada distância no mundo do jogo.

Algumas questões vinculadas relevantes:


[*] pelo usuário como parte do jogo ou também pelos desenvolvedores para iteração / teste rápidos sem reiniciar o aplicativo

Philip Allgaier
fonte
14
Eu teria cuidado ao chamar algo de "linguagem interpretada". Na melhor das hipóteses, é um termo muito discutível.
Wondra
11
A Computercraft (minecraft mod) usa LUA como uma linguagem de script para programar tarefas dentro do jogo.
Tikeb 26/09/16
20
Eu realmente não entendo o barulho. Lisp pode ser interpretado e compilado. Não estamos aqui para discutir como classificar os idiomas e se interpretedé uma boa clasificação; estamos dizendo ao OP que não tem conhecimento desse fato de que o idioma não precisa ser compilado, mas pode ser interpretado - e damos alguns idiomas como exemplo. Lisp é interpretado? Sim. É compilado? Também sim! Mas isso está fora do escopo. A resposta pode ser imprecisa com as palavras, mas é adequada para o efeito; ele empurra o OP na direção certa, e é isso que conta. Aqui, pegue o meu +1.
MatthewRock 26/09
11
Bem, mesmo que uma linguagem seja apenas compilada, o que impede você de incorporar um IDE, compilador e tempo de execução ao seu jogo? Exceto o orçamento, é isso.
Ordous 27/09/16
3
@DanielJour Embora eu concorde que teoricamente uma linguagem pode ser distinta de sua implementação (compilada em código de máquina vs compilada em bytecode para uma vm), ainda é útil supor que C seja compilado, a menos que seja especificado de outra forma (e você pode imaginar a aparência que você obteria se perguntasse "espere, compilou C ou interpretou C?" toda vez). Para o objetivo do OP, ele precisa procurar idiomas que apóiem ​​a interpretação; se eles também podem ser compilados ou não é um problema, porque não é assim que ele o usaria.
Blackhawk
12

Linguagem incorporada é o termo técnico adequado. Na prática, as linguagens usadas em outros aplicativos (como jogos) são frequentemente chamadas de scripts ou mesmo linguagens interpretadas , embora não devam necessariamente ser interpretadas ou usadas para automatizar tarefas de rotina. Pesquisar "linguagens de script para jogos" no Google provavelmente traria resultados mais úteis do que pesquisar "linguagens incorporadas".

interphx
fonte
11

Você está procurando uma maneira de alterar o código em algumas ações. É exatamente isso que os intérpretes estão fazendo.

Dê uma olhada no Python. Você o executa e bam! Você aterrissa em REPL ( R ead E val P rint L oop).

Você define uma função "olá" que imprime "Olá, mundo". E aí está!

Observe que você não compilou nada; O intérprete fez alguma mágica para criar funções dinamicamente (durante o tempo de execução) e agora você pode chamá-lo.

O mesmo se aplica aos jogos. Em vez de ter um REPL, você tem um jogo com o módulo REPL. O jogo provavelmente inicia o REPL e, em seguida, executa tudo o mais neste REPL, para que você tenha acesso aos dados e possa modificá-los ativamente.

Se você estiver trabalhando com linguagens enormes como C ++, elas tendem a ser menos dinâmicas e provavelmente compiladas. Você quer um pouco mais fácil. Você cria sua própria linguagem ou usa algumas existentes (como CoffeScript, Squirrel, Lua, Scheme, ...)

Isso geralmente é chamado de linguagens de script , já que você as usa para escrever scripts criados sobre o mecanismo de jogo desenvolvido em outra linguagem (por exemplo, C ++).

MatthewRock
fonte
2

Se a linguagem de programação do jogo foi projetada apenas para a finalidade do jogo, ela é uma linguagem específica do domínio .

A vantagem (e a desvantagem) dos idiomas específicos do domínio é que o próprio idioma pode limitar o que o usuário pode fazer (ou seja, você pode impedir a conexão com a Internet). Você pode criar um idioma que torne as tarefas típicas do jogo mais fáceis do que em um idioma de uso geral. A desvantagem é que o usuário precisa aprender um novo idioma.

A execução de código de usuário não autorizado em uma linguagem de uso geral (como python ou perl) de dentro do seu jogo pode permitir que o usuário mexa com coisas com as quais não deve mexer. Mas isso depende do seu jogo. Se você não se importa que os usuários façam coisas como abrir novas janelas de dentro do jogo ou o que quiserem, você pode usar uma linguagem de uso geral e expor ligações a certos recursos do seu mundo de jogo.

TheEspinosa
fonte
1

Existem dois exemplos em que consigo pensar em cima da minha cabeça. Ambos parecem fazer exatamente o que você está pedindo.

O primeiro são os restos. https://screeps.com/ Você pode ler muito sobre como ele atinge esse objetivo em http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview

O segundo é o ComputerCraft http://www.computercraft.info/. Eles não dão muitos detalhes sobre como ele funciona, mas um pouco pode ser visto em seu wiki http://www.computercraft.info/wiki/Main_Page

Em essência, o jogo principal executa um intérprete em um thread separado, permitindo que esse thread manipule o mundo do jogo por meio de chamadas de API.

Nos dois exemplos, enquanto o idioma é quase ilimitado (apenas algumas chamadas são bloqueadas por motivos de segurança), as manipulações são limitadas pelas chamadas de API que podem ser feitas.

Geralmente, é necessário muito pouco trabalho para iniciar algo assim. Você precisa

  • um gerenciador de threads que protege o loop do seu jogo (não permite que um thread bloqueie o loop ou consuma muitos recursos). Ambos os exemplos usam um limitador baseado em tempo.
  • um intérprete para executar um idioma. LUA é bastante comum nos dias de hoje.
  • um conjunto de chamadas de API que modificam o mundo do jogo. Que divertido é uma linguagem de programação se você não pode fazer nada com ela.
  • uma implementação de gerenciamento de recursos. Em outras palavras, uma maneira de armazenar arquivos de código e referenciá-los no jogo.

Não existe um único ramo de programação que lide com todas essas preocupações. Mas você precisará de uma base sólida em multiencadeamento e um conhecimento geral de como um intérprete funciona.

coteyr
fonte
0

O executável compilado deve conter um analisador capaz de ler código de programa externo . O código do programa não precisa se parecer com C ou Python ou xyz - pode ser qualquer tipo de dado descritivo que seja adequado para a finalidade em questão. Por exemplo, sueco ou morse.

O código do programa externo precisa ter uma sintaxe , para que o analisador o compreenda enquanto lê caractere por caractere. A sintaxe pode descrever (e código) podem conter identificadores, os valores numéricos, operadores etc .

The parser is fixed (compiled) but it works on flexible, external code.

O executável compilado deve ter uma API interna para sua funcionalidade relevante. para que o analisador possa executar ações. Provavelmente, também deve haver acesso (bidirecional) aos dados internos do executável, ou o analisador deve fornecer algum tipo de armazenamento e manutenção de dados.

O analisador pode ler o código do programa externo na inicialização do executável , ou ler (partes dele) ad hoc , ou lê- lo novamente a cada quadro (seria ineficiente) ou o código pode ser digitado à mão e postado no analisador assim que estiver pronto (como: "mova a unidade X para frente 5 etapas" [entrar]).

Essencialmente, o código externo não é fixo - ele pode mudar a qualquer ano, dia ou minuto, mas ainda assim o executável não precisa ser recompilado. Somente o comportamento resultante, hospedado pelo executável, é alterado.

O texto que você está lendo agora é (mais ou menos, se foi falado) interpretado porque você o "executa" em seu cérebro enquanto lê, sem saber o que a próxima frase diz (ou mesmo se possível, muda sorrateiramente à direita) agora). Ao contrário de Stack Overflow (pré), compilando toda a história em código de bytes em seu cérebro, que a executa - e muitas vezes não pode mais mudar.

O fenômeno em andamento é a interpretação. Script é apenas o ato de criar uma descrição ou gravação . Toda codificação de computador é imo script - descrevemos o que queremos que aconteça. A palavra "script" tem um significado um pouco inclinado, mas fique bem. Nós sabemos o que queremos dizer.

Não há absolutamente nada de extraordinário nas línguas interpretadas e não é de forma alguma um termo discutível . Uma multidão deles existe, e alguns dos mais antigos são interpretados em oposição a compilados. Em uma linguagem interpretada, pode-se, por exemplo, digitar manualmente:

sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]

... e depois faça um intervalo de 30 ... não, 45 minutos para o café :-). Ao retornar, "meia" existe e está pronto para uso posterior, digitando mais manualmente ou deixando a automação do intérprete continuar com ela.

Ventobravo
fonte
Há um equívoco comum de que uma linguagem interpretada deve ser lenta. Não é verdade. Dependendo dos vários fatores que tornam essa discussão muito ampla para os comentários, a linguagem interpretada pode ser de magnitude ou menos mais lenta, tão rápida quanto, ou mesmo para algumas operações, mais rápida que a linguagem de controle considerada rápida (geralmente C). O exemplo com socket provavelmente funcionaria mais ou menos como em C, portanto, o exemplo é enganoso. Você também pode redefinir as funções compiladas em um tempo de execução em alguns idiomas, e interpretar não significa simplesmente "seguir uma instrução por vez".
MatthewRock
Certamente, uma linguagem interpretada também pode ter um desempenho mais rápido - afinal, é o código de execução que é executado e a execução pode ser muito melhor otimizada, dependendo da automação do intérprete. Além disso, alguns intérpretes podem compilar, a partir do código, partes do código no bytecode (e executar), ad hoc. O exemplo é apenas um exemplo da liberdade "Indo uma instrução por vez"? Bem, isso é uma simplificação excessiva, talvez adicione "enquanto o código futuro for flexível".
Stormwind
Pense em "roteiro" mais como um roteiro de filme - você ainda precisa de atores, e estes são definidos diretamente em termos de biologia e sociologia, não de ciências do teatro (embora no final sejam baseados em biologia e sociologia), porque essas linguagens são mais adequado para o efeito, mas não a outra :)
rackandboneman