Il existe des jeux qui permettent au joueur d'écrire / créer des scripts dans le jeu, par exemple: les ingénieurs spatiaux ou Psi .
Je veux utiliser quelque chose de similaire à l'un ou l'autre, mais j'ai eu du mal à trouver des informations donc ma question est:
Existe-t-il une branche de programmation qui couvre la capacité d'un logiciel une fois compilé à exécuter le nouveau code créé par l'utilisateur?
Par branche de programmation, je veux dire quelque chose comme PTG (génération de terrain procédural).
Pour éviter une question trop large ou basée sur une opinion , permettez-moi de déclarer clairement que je ne recherche pas de guides ou de lieux d'apprentissage, je veux le nom ou la définition (s'il en existe une) de la technologie impliquée.
la source
Réponses:
Les scripts écrits dans des langages de script / incorporés / interprétés tels que "Lua", "Lisp" ou "AngelScript" ( plus ici ) peuvent être mis à jour pendant le jeu [*] puis sont interprétés (= exécutés) à la volée.
Vous pouvez lier des éléments de ces scripts à votre codage natif compilé (C ++, etc.) afin que les scripts puissent ensuite exécuter la logique à partir de votre application. Par exemple. une commande spécifique que l'utilisateur peut mettre dans le script, ce qui déplace le personnage du jeu d'une distance donnée dans le monde du jeu.
Quelques questions liées pertinentes:
Quel langage de script dois-je choisir pour mon jeu?
Que recherchez-vous dans un langage de script?
Comment ajouter un langage de script à un jeu?
[*] soit par l'utilisateur dans le cadre du jeu, soit également par les développeurs pour une itération / un test rapide sans redémarrer l'application
la source
interpreted
c'est une bonne classification; nous disons à OP qui ignore ce fait que la langue n'a pas besoin d'être compilée, mais peut être interprétée - et nous donnons quelques langues comme exemple. Lisp est-il interprété? Oui. Est-il compilé? Oui aussi! Mais cela sort du cadre. La réponse est peut-être inexacte avec le libellé, mais c'est très bien pour le but; il pousse OP dans la bonne direction, et c'est ce qui compte. Ici, prenez mon +1.Le langage intégré est le terme technique approprié. En pratique, les langages utilisés dans d'autres applications (comme les jeux) sont souvent appelés langages de script ou même interprétés , bien qu'ils ne doivent pas nécessairement être interprétés ou utilisés pour automatiser des tâches de routine. La recherche sur les «langages de script pour les jeux» donnerait probablement des résultats plus utiles que la recherche des «langages intégrés».
la source
Vous cherchez un moyen de changer le code en quelques actions. C'est précisément ce que font les interprètes .
Jetez un oeil à Python. Vous l'exécutez et bam! Vous atterrissez en REPL ( R ead E val P rint L oop).
Vous définissez une fonction "bonjour" qui imprime "bonjour, monde". Et voila!
Notez que vous n'avez rien compilé; L'interprète a fait de la magie pour créer une fonction à la volée (pendant l'exécution) et maintenant vous pouvez l'appeler.
Il en va de même pour les jeux. Au lieu d'avoir un REPL, vous avez un jeu avec le module REPL. Le jeu démarre probablement le REPL, puis exécute tout le reste dans ce REPL, vous avez donc accès aux données et pouvez les modifier activement.
Si vous travaillez avec des langages énormes comme C ++, ils ont tendance à être moins dynamiques et probablement compilés. Vous en voulez plus facilement. Soit vous créez votre propre langage, soit vous en utilisez un existant (comme CoffeScript, Squirrel, Lua, Scheme, ...)
Ceux-ci sont souvent appelés langages de script , car vous les utilisez pour écrire des scripts qui sont construits sur le moteur de jeu développé dans un autre langage (par exemple C ++).
la source
Si le langage de programmation en jeu n'a été conçu que pour le jeu, il s'agit d'un langage spécifique au domaine .
L'avantage (et l'inconvénient) des langues spécifiques au domaine est que la langue elle-même peut limiter ce que l'utilisateur peut faire (c'est-à-dire que vous pouvez interdire la connexion à Internet). Vous pouvez concevoir un langage qui rend les tâches de jeu typiques plus faciles que dans un langage général. L'inconvénient est que l'utilisateur doit apprendre une nouvelle langue.
Le simple fait d'exécuter du code utilisateur nonanitized dans un langage à usage général (comme python ou perl) à partir de votre jeu, pourrait permettre à l'utilisateur de jouer avec des choses avec lesquelles il ne devrait pas jouer. Mais cela dépend de votre jeu. Si cela ne vous dérange pas que les utilisateurs fassent des choses comme ouvrir de nouvelles fenêtres à partir de votre jeu ou tout ce qu'ils veulent, vous pouvez utiliser un langage général et exposer les liaisons à certaines fonctionnalités de votre monde de jeu.
la source
Il y a deux exemples auxquels je peux penser du haut de ma tête. Les deux semblent faire exactement ce que vous demandez.
Le premier est des screeps. https://screeps.com/ Vous pouvez lire beaucoup sur la façon dont il atteint cet objectif à http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview
Le second est ComputerCraft http://www.computercraft.info/ Ils n'entrent pas dans les détails quant à la façon dont cela fonctionne mais un peu peut être vu sur leur wiki http://www.computercraft.info/wiki/Main_Page
En substance, le jeu principal exécute un interpréteur dans un thread séparé, puis permet à ce thread de manipuler le monde du jeu via des appels d'API.
Dans les deux exemples, alors que la langue est presque illimitée (seuls certains appels sont bloqués pour des raisons de sécurité), les manipulations sont limitées par les appels d'API qui peuvent être effectués.
Habituellement, très peu de travail est nécessaire pour démarrer quelque chose comme ça. Vous avez besoin
Il n'y a pas une seule branche de programmation qui gère toutes ces préoccupations. Mais vous aurez besoin d'une base solide en multi-threading et d'une connaissance générale du fonctionnement d'un interprète.
la source
L'exécutable compilé doit contenir un analyseur capable de lire le code de programme externe . Le code du programme n'a pas besoin de ressembler à C ou Python ou xyz - il peut s'agir de n'importe quel type de données descriptives qui conviennent à l'objectif en question. Par exemple suédois ou morse.
Le code du programme externe doit avoir une syntaxe , de sorte que l'analyseur le comprenne lorsqu'il le lit caractère par caractère. La syntaxe peut décrire (et numéro) peut contenir des identificateurs, des valeurs numériques, des opérateurs , etc .
L'analyseur est fixe (compilé) mais il fonctionne sur du code externe flexible.
L'exécutable compilé doit avoir une API interne pour ses fonctionnalités pertinentes. afin que l'analyseur puisse effectuer des actions. Très probablement, il doit également y avoir un accès (bidirectionnel) aux données internes de l'exécutable, ou l'analyseur doit fournir une sorte de stockage de données et d'entretien ménager.
L'analyseur peut lire le code du programme externe au démarrage de l'exécutable , ou il peut le lire (en partie) ad hoc , ou il peut le relire pour chaque trame (serait inefficace), ou le code peut même être tapé à la main et affiché sur l'analyseur au fur et à mesure qu'il se prépare (comme: "déplacer l'unité X de 5 pas vers l'avant" [entrer]).
Essentiellement, le code externe n'est pas fixe - il peut changer n'importe quelle année, jour ou minute, mais l'exécutable n'a pas besoin d'être recompilé. Seul le comportement résultant, hébergé par l'exécutable, change.
Le texte que vous lisez en ce moment est (en quelque sorte, et encore plus s'il a été prononcé) interprété parce que vous "l'exécutez" dans votre cerveau tout en le lisant, sans savoir ce que dit la prochaine phrase (ou même si elle change peut-être sournoisement à droite à présent). Contrairement à Stack Overflow (pré) compilant toute l'histoire en bytecode dans votre cerveau, qui l'exécute ensuite - et bien sûr, cela ne pourrait plus changer.
Le phénomène en cours est l'interprétation. Le script n'est que l'acte de créer une description ou d' écrire . Tout le codage informatique est un script imo - nous décrivons ce que nous voulons faire. Le mot "scripting" a une signification quelque peu inclinée, mais alors ça va. Nous savons ce que nous voulons dire.
Il n'y a absolument rien d'extraordinaire avec les langues interprétées, et ce n'est en aucun cas un terme contestable . Il en existe une multitude et certaines des plus anciennes sont interprétées plutôt que compilées. Dans un langage interprété, on pourrait par exemple taper à la main:
sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTRER]
... et partez pour une pause café de 30 ... non, 45 minutes :-). Au retour, "sock" existe et est prêt pour une utilisation ultérieure en tapant plus à la main ou en laissant l'automatisation de l'interpréteur continuer avec.
la source