当我使用构造函数调用表示法(declare-)定义指向指针的指针(而不是赋值表示法 - 当然在运行时会做同样的事情;它只是一个约定),我得到编译器错误.我想知道为什么会这样.
struct Foo
{ /* ... */ };
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo(&parFoo); // invalid: C2059
Foo** ppFoo = &parFoo; // OK
delete[] parFoo;
}
Run Code Online (Sandbox Code Playgroud)
错误是C2059 - 无效令牌,但没有说太多.但是,这&不是问题(意味着它可能不是运算符优先级错误).如果我执行以下操作:
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo = &parFoo; // OK
Foo** ppFoo2(ppFoo); // invalid: C2061
delete[] parFoo;
}
Run Code Online (Sandbox Code Playgroud)
...然后我得到一个C2061,这意味着这次它ppFoo是错误位置的标识符.
什么语法规则导致这一点,即为什么不能使用构造函数调用符号来定义指针的指针,只有"程度较低"的类型?
我有以下代码,想想c ++中的简单射击游戏:
// world.hpp
//----------
class Enemy;
class Bullet;
class Player;
struct World
{
// has-a collision map
// has-a list of Enemies
// has-a list of Bullets
// has-a pointer to a player
};
// object.hpp
//-----------
#include "world.hpp"
struct Object
{
virtual ~Object();
virtual void Update() =0;
virtual void Render() const =0;
Float xPos, yPos, xVel, yVel, radius; // etc.
};
struct Enemy: public Object
{
virtual ~Enemy();
virtual void Update();
virtual void Render() const;
};
// Bullet …Run Code Online (Sandbox Code Playgroud) 我正在学习使用OpenGL在2D图形中使用法线贴图(每像素光照?).
作为法线贴图的新手,我设法绕过Sobel算子并生成法线贴图(主要归功于此),即从(2D)像素数据阵列创建(2D)法线阵列.
(我发现的大多数教程和论坛主题都是针对3D使用和建模软件的.我的目标是在C++中自己实现这个功能.)
我正在写一个游戏,我想以一种干净的,面向对象的方式来模拟它的不同状态(Game Maker类比将是帧,我猜).以前,我是通过以下方式完成的:
class Game
{
enum AppStates
{
APP_STARTING,
APP_TITLE,
APP_NEWGAME,
APP_NEWLEVEL,
APP_PLAYING,
APP_PAUSED,
APP_ENDED
};
typedef AppState(Game::*StateFn)();
typedef std::vector<StateFn> StateFnArray;
void Run()
{
// StateFn's to be registered here
AppState lastState(APP_STARTING);
while(lastState != APP_ENDED)
{
lastState = GetCycle_(lastState);
}
// cleanup
}
protected:
// define StateFn's here
AppState GetCycle_(AppState a)
{
// pick StateFn based on passed variable, call it and return its result.
}
StateFnArray states_;
};
Run Code Online (Sandbox Code Playgroud)
这对于一个较小的项目来说几乎无法管理.状态所使用的所有变量都被转储到Game类中,但是我希望将面向对象保持为最大值,只显示由多个状态共享的变量.我还希望能够在切换到新状态时初始化,而不是必须在刚完成的状态下进行(因为它可能有多个结果 - APP_PLAYING可以切换到APP_PAUSED,APP_GAMEOVER,APP_NEWLEVEL等).
我想到了这样的事情(小心!模糊的东西!):
struct AppState
{
enum { LAST_STATE = …Run Code Online (Sandbox Code Playgroud) 我正准备在Windows下用Dev-C++重建我的库; 但是,我在此期间添加的着色器功能不受支持,编译器找不到相关的函数(:: glCreateShader(),:: glCreateProgram()等)
在互联网和Dev-C++文件夹中挖掘,我发现OpenGL实现(gl.h)只是v1.1.我找到了从SGI下载最新标题的建议.我找到了gl3.h,然而,经过仔细审查后,我意识到gl.h不包含在我的项目中,我应该看看SDL/SDL_opengl.h.
编辑: SDL_opengl.h 确实包含gl.h 并声明了相关函数的原型.所以问题是,为什么我给出了编译时错误而不是链接器错误?
(我的库只链接到mingw32,libOpenGL32,libSDL,libSDL_Image和libSDL_Mixer,就像在OSX下一样(当然除了mingw32)我没有任何问题.)
如何在Dev-C++和SDL中使用OpenGL v2.0着色器?
几个月来,我写了一些很好的通用功能,我想构建一个库并动态链接而不是导入50多个头文件/源文件.
该项目使用Xcode和Dev-C++进行维护(我知道我可能必须使用命令行来执行我想要的操作)并且必须链接到OpenGL和SDL(在SDL的情况下动态).目标平台是Windows和OS X.
我在看什么?
以下简单的片段着色器代码失败,在日志中留下了一条无信息的消息:
ERROR: 0:1: 'gl_Color' : syntax error syntax error
void main()
{
vec4 myOutputColor(gl_Color);
gl_FragColor = myOutputColor;
}
Run Code Online (Sandbox Code Playgroud)
而以下一个有效:
void main()
{
glFragColor = gl_Color;
}
Run Code Online (Sandbox Code Playgroud)
这令人难以置信,就像在Lighthouse3D的教程中一样, gl_Color被认为是一个vec4.为什么我不能将它分配给另一个vec4?
我正在寻找一种从着色器访问OpenGL状态的方法.该GLSL快速参考指南,一个真棒资源,无法真正帮助我在这一个.
在我正在研究的示例中,我有以下两个着色器:
顶点:
void main()
{
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
分段:
uniform sampler2D tex;
uniform float flattening;
void main( void )
{
vec4 texel;
texel = texture2D(tex, gl_TexCoord[0].st);
texel.r *= gl_Color.r;
texel.g *= gl_Color.g;
texel.b *= gl_Color.b;
texel.a *= gl_Color.a;
gl_FragColor = texel;
}
Run Code Online (Sandbox Code Playgroud)
当我渲染没有纹理的多边形时,它们的alpha值是正确的,但它们被指定为黑色.
1,我可以设置什么条件检查,以便vec4(1.0, 1.0, 1.0, 1.0)在GL_TEXTURE_2D禁用时将变量'texel'设置为而不是从纹理中采样?
2,如果我为不同的纹理模式编写不同的着色器并在它们之间切换我将使用glEnable/ glDisable(GL_TEXTURE_2D),处理会更快吗?
我知道这是一个微不足道的问题,但从glGet()文档开始我还没有找到任何有用的信息.我正在使用我的纹理作为精灵,因此以纹素/像素跟踪它们的大小至关重要.
当我创建纹理时,glTexImage2D()我需要将像素数据数组的大小传递给它.但OpenGL是将它存储在任何地方,还是我必须在我的代码中跟踪它们?(这感觉别扭,因为客户机代码仍然能够覆盖与所述纹理glTexImage2D()/ glTexSubImage2D()/ glCopyTexImage2D()等未通话时相应的变化的大小,从而导致视觉失真.)
我正在编写一个命令行应用程序,它将数据作为命令行参数或来自cin.
有没有办法检查用户是否在应用程序中传输了一些数据($ ./myapp <test.txt),如果没有,只显示键盘输入的提示?
如果我正在检查!cin.good()/ cin.eof()等,则提示将永远不会出现.
我在使用c ++中的if语句和字符串/字符时遇到了一些麻烦.这是我的代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "-----------------------------" << endl;
cout << "|Welcome to Castle Clashers!|" << endl;
cout << "-----------------------------" << endl;
cout << "Would you like to start?" << endl;
string input;
cout << "A. Yes ";
cout << "B. No " << endl;
cin >> input;
if(input == "a" || "A"){
cout << "Yes" << endl;
}else{
if(input == 'b' || 'B'){
return 0;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的if语句中,它检查字符串输入是否等于yes,如果不是,则应该转到else语句.这是麻烦开始的地方,一旦我在控制台中运行我的程序,当我输入"a"或"A"之外的任何东西时,它仍然会说是.我尝试用字符/字符做,但我得到相同的输出.有人可以帮助我吗?
以下有什么区别:
const char *c = 0; //Here c is a pointer to a constant character
typedef char *pstring;
const pstring cstr = 0 //cstr is a constant pointer to a character
Run Code Online (Sandbox Code Playgroud)
为什么这两个语句有区别,但它们看起来一样。在C++ Primer中提到,第一条语句的基类型是const char,*是声明符的一部分。而对于最后一条语句,基本类型是 const pstring。我没有得到两者之间的区别。