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.
scripting
terminology
Westside Tony
fonte
fonte
Respostas:
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:
Qual linguagem de script devo escolher para o meu jogo?
O que você procura em uma linguagem de script?
Como você adiciona uma linguagem de script a um jogo?
[*] pelo usuário como parte do jogo ou também pelos desenvolvedores para iteração / teste rápidos sem reiniciar o aplicativo
fonte
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.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".
fonte
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 ++).
fonte
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.
fonte
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
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.
fonte
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.
fonte