c++ - 如何在游戏运行时创建新功能并执行?
问题描述
我正在使用 Cocos2d-x v3.17 制作游戏。
我希望玩家在游戏场景中编写他们的代码,然后他们按下提交,游戏就会执行它。
我考虑将他们的代码保存到一个文件中并从中调用一个函数,所以我创建了两个这样的文件:
//PlayerCode.h
#pragma once
int PlayerFunction(int a, int b);
//PlayerCode.cpp
#include "PlayerCode.h"
int PlayerFunction(int a, int b){ return 0;}
我运行游戏。
在主场景中,当玩家按下提交时,我根据他们的代码重写 .cpp 文件,假设它变为:
//PlayerCode.cpp
#include "PlayerCode.h"
int PlayerFunction(int a, int b){ return a+b;}
然后运行这个来执行播放器代码
try{
int result = PlayerFunction(2,3);
CCLOG("%d",result);
}
catch (string somethingError){
CCLOG("%s",somethingError);
}
但是无论播放器写什么,结果总是0。即使每次按下提交时.cpp文件都发生了变化,程序也只是从第一个旧文件中运行代码。
这就是我的全部问题,请帮助我解决它,或者如果您知道其他方法来执行此功能,请指导我。
谢谢你。
解决方案
C++ 是一种编译语言,这意味着您不会在运行时直接读取任何源文件。如果您在应用程序运行时更改源代码并不重要,因为您还没有编译它。
您可以尝试的一件事是使用脚本语言并将其嵌入到您的 c++ 中。然后播放器可以使用该语言编写脚本,您可以运行该脚本。
游戏中脚本的流行选择是 LUA 语言。
我建议你看一本用 C++ 编写游戏的书,比如Game Coding Complete, Fourth Edition
推荐阅读
- c# - ASP.NET MVC 5:log4net 不写入文件
- jquery - 按钮作为提交和调用函数
- javascript - 如何获取列表中项目的索引并将其映射到 json 对象以执行 onClick 事件
- html - 嵌套的 flexbox 无法在旧的 Android 浏览器中正确显示
- php - Codeigniter - 设置 dbprefix 触发器 [无法修改标头信息 - 标头已发送]
- sql-server - 在 Excel 2016 中创建向后兼容的 SQL Server 数据连接
- c# - Xamarin.Forms - 禁用按钮动画 UWP
- java - 如何比较 JSON 文档并返回与 Jackson 或 Gson 的差异?
- amazon-web-services - awscli - lambda 函数更新触发器
- angular - 如何在 ngModel 中禁用更改值