如果这是一个愚蠢的问题,请原谅我,但我正在关注一本书,但它不起作用。我有一个游戏引擎,它存在于一个 dll 中。它有几个外部函数可用于实际游戏应用程序:
extern void game_preload();
Run Code Online (Sandbox Code Playgroud)
这一切都是完美的,但当我去构建 all 时,我得到一个错误:
Undefined reference to `game_preload()'
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我怎样才能让它构建 dll 以便我可以在应用程序中实现这些功能?
我正在阅读的书名为“高级 2D 游戏开发”,它没有提到存在问题。
编辑:我读错了这本书,我应该制作一个静态库而不是动态库。但是我可以问一下动态库的“extern”用法有什么类似的吗?
我意识到上面的问题相当广泛,所以我会缩小范围.我有一个简单的opengl c ++游戏引擎,它位于一个静态库中(可以转换为动态库).
我一直在想办法让它在网上运行.从我所看到的,我可以使用ActiveX或Google NaCl在浏览器中运行c ++代码.但这些技术似乎并不容易跨平台?或许我误解了.
我看到的另一个选择是将引擎转换为javascript和WebGL并在HTML5画布中运行.这会比c ++慢吗?但这将是非常跨平台的.
您认为最好的选择是什么,或者更好的是我还有其他选择吗?
编辑:类似于团结网络播放器的自定义插件怎么样?
我已经搜索了Internet和Boost序列化文档,但找不到任何解释为什么Boost序列化有两个不同库的信息。
到目前为止,我发现wserialization依赖于序列化,但是它究竟能做什么?为什么两个库分开?
我想在关卡编辑器中读取 Lua 文件,这样我就可以以可视化格式显示其数据供用户编辑。
如果我有一个像这样的 Lua 表:
properties = {
Speed = 10,
TurnSpeed = 5
}
Run Code Online (Sandbox Code Playgroud)
Speed显然是关键和10价值。我知道如果我知道像这样的键,我可以访问该值(前提是该表已经在堆栈上):
lua_pushstring(L, "Speed");
lua_gettable(L, idx);
int Speed = lua_tointeger(L, -1);
lua_pop(L, 1);
Run Code Online (Sandbox Code Playgroud)
我想要做的是在 C++ 中访问键的名称和相应的值。这可以做到吗?如果是这样我该怎么办?
在我的简单游戏引擎中,我有一个包含实体指针的向量.每个实体都分配有新关键字.要在我的实体上调用函数,我使用迭代器,所以当删除我的实体时,我想我也会使用迭代器,如下所示:
vector<Entity*>::iterator iter;
for (iter = gameEntitys.begin(); iter != gameEntitys.end();) {
delete (*iter);
++iter;
}
Run Code Online (Sandbox Code Playgroud)
但是我现在有一个可怕的内存泄漏,所有的分析工具都指向这条线 delete (*iter);
显然有一些错误,但是我删除向量中包含的实体的正确方法是什么(并清除另一个场景的向量).使用gameEntitys.clear();对我来说是无用的,因为它只删除向量的元素而不实际调用它们的删除,因为它们是指针而不是实际数据.
编辑:我看着评论.Entity类不是多态的,也没有任何子类.如果我停止使用动态内存并且具有正常的非指针实体数组会更有意义吗?
我知道存在内存泄漏的原因是因为当应用程序启动时,内存使用率会在崩溃前高达2gb以上.
我的 DirectX 调试层正在运行,它会将错误和警告输出到 Visual Studio 中的输出窗口。例如这样(不是我面临的实际问题):
D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]
Run Code Online (Sandbox Code Playgroud)
我有一个自定义日志记录系统,可以保存到文件并在其他窗口中打印。我想捕获调试消息字符串,并以我自己的方式显示它们。支持吗?如果是这样我该怎么做?
我来自一个c#世界正在做这样的事情是允许的.当我在c ++中尝试它时,我没有编译器错误,但我不相信它实际上正在工作.
所以对于更有经验的人,你可以做这样的事情:
Entity->SetPosition(Vector2(200, 400));
Run Code Online (Sandbox Code Playgroud)
因为在Vector2中是一个类,并且设置位置的参数需要一个向量?这是允许的还是我需要像这样预先初始化变量:
Vector2 aVector(200, 400);
Entity->SetPosition(aVector);
Run Code Online (Sandbox Code Playgroud)
谢谢大卫
我正在尝试创建一个像Lollipop一样的警报对话框,一切都很顺利,但我在一个部分陷入了EditText的情况
我想要一个带有下划线和边距的EditText 左右 20dp.对于下划线我尝试了setBackground(),并且它工作正常.
但是有一个问题是setBackground()不能在低于16的API级别工作.
对于setMargin,我试过了
final EditText input = new EditText(MainActivity.this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(30,0,30,0);
input.setLayoutParams(lp);
input.setGravity(View.TEXT_ALIGNMENT_GRAVITY);
input.setBackground(getResources().getDrawable(R.drawable.edit_text_line));
builder.setView(input);
Run Code Online (Sandbox Code Playgroud)
但是使用完整父宽度编辑文本.
完整代码
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Message");
builder.setMessage("Do you want to\n"+""+"exit from app");
final EditText input = new EditText(MainActivity.this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(30,0,30,0);
input.setLayoutParams(lp);
input.setGravity(View.TEXT_ALIGNMENT_GRAVITY);
input.setBackground(getResources().getDrawable(R.drawable.edit_text_line)); //call reequires api 16 and above
builder.setView(input);
builder.setNegativeButton("No", new DialogInterface.OnClickListener() …Run Code Online (Sandbox Code Playgroud) android android-edittext android-alertdialog android-5.1.1-lollipop
我知道这是可能的,但我对C++的经验不足限制了我.我想要做的是有一些系统,我可以添加update()方法到某些类,并在程序中的每个帧调用所有更新方法.
Unity3D用户可能对此很熟悉.但是,如果Update()在未确定的类中存在未确定数量的方法,程序如何知道调用每个方法.
我想这是一个在整个程序中动态调用函数的系统.