小编zyn*_*dor的帖子

为什么使用构造函数调用表示法定义指针变量的指针是非法的?

当我使用构造函数调用表示法(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++

11
推荐指数
1
解决办法
222
查看次数

建模游戏对象层次结构的最优雅,最有效的方法是什么?(设计困扰)

我有以下代码,想想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)

c++ oop

9
推荐指数
2
解决办法
1582
查看次数

如何在OpenGL中应用法线贴图?

我正在学习使用OpenGL在2D图形中使用法线贴图(每像素光照?).

作为法线贴图的新手,我设法绕过Sobel算子并生成法线贴图(主要归功于),即从(2D)像素数据阵列创建(2D)法线阵列.

(我发现的大多数教程和论坛主题都是针对3D使用和建模软件的.我的目标是在C++中自己实现这个功能.)

  • 一旦我得到了正常的地图,我该怎么办?
  • 我需要在OpenGL中注册吗?
  • 它是否需要与纹理相关联,如果是,它是如何完成的?
  • 它是如何映射到2D纹理四边形的?
  • (这是我可以在没有着色器/ GLSL的情况下做的事吗?)

c++ opengl graphics

8
推荐指数
2
解决办法
7108
查看次数

你如何建模应用程序状态?

我正在写一个游戏,我想以一种干净的,面向对象的方式来模拟它的不同状态(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)

c++ states

7
推荐指数
1
解决办法
2437
查看次数

使用Dev-C++和SDL的OpenGL v2.0着色器?

我正准备在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着色器?

opengl shader sdl dev-c++

7
推荐指数
1
解决办法
5237
查看次数

如何在OpenGL中实现灰度渲染?

渲染纹理多边形的场景时,我希望能够在原始颜色的渲染和"灰度"模式之间切换.我一直在尝试使用混合和颜色矩阵操作来实现这一点; 没有一个工作(混合我找不到一个glBlendFunc(),它实现了远远类似于我想要的东西,并且这里讨论了颜色矩阵操作......).

想到的解决方案(但也相当昂贵)是每帧捕获屏幕并将生成的纹理转换为灰度级并显示相反...(我说的灰度我实际上意味着低饱和度的任何东西,但是我猜测大多数可能的解决方案,它与灰度级的差别不大.)

我还有其他选择吗?

opengl effects grayscale

5
推荐指数
1
解决办法
2万
查看次数

将C++源代码构建为库 - 从哪里开始?

几个月来,我写了一些很好的通用功能,我想构建一个库并动态链接而不是导入50多个头文件/源文件.

该项目使用Xcode和Dev-C++进行维护(我知道我可能必须使用命令行来执行我想要的操作)并且必须链接到OpenGL和SDL(在SDL的情况下动态).目标平台是Windows和OS X.

我在看什么?

  • 如果需要,我的图书馆的入口点是什么?
  • 我需要在代码中更改什么?(调用约定?)
  • 我该如何发布?我的理解是标题和编译库(.dll,.dylib(,.framework),无论它是什么)都需要为项目提供 - 特别是因为模板功能本身不能包含在库中.
  • 还有什么我需要注意的?

c++ entity-framework dynamic-linking

4
推荐指数
1
解决办法
1028
查看次数

GLSL片段着色器语法错误

以下简单的片段着色器代码失败,在日志中留下了一条无信息的消息: 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 shader glsl

3
推荐指数
1
解决办法
5462
查看次数

GLSL:启用/禁用纹理+着色器

我正在寻找一种从着色器访问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),处理会更快吗?

opengl shader glsl texturing

3
推荐指数
1
解决办法
6166
查看次数

如何用texels确定OpenGL纹理的大小?

我知道这是一个微不足道的问题,但从glGet()文档开始我还没有找到任何有用的信息.我正在使用我的纹理作为精灵,因此以纹素/像素跟踪它们的大小至关重要.

当我创建纹理时,glTexImage2D()我需要将像素数据数组的大小传递给它.但OpenGL是将它存储在任何地方,还是我必须在我的代码中跟踪它们?(这感觉别扭,因为客户机代码仍然能够覆盖与所述纹理glTexImage2D()/ glTexSubImage2D()/ glCopyTexImage2D()等未通话时相应的变化的大小,从而导致视觉失真.)

opengl textures

2
推荐指数
2
解决办法
9670
查看次数

期待来自std :: cin的输入(Unix C++)

可能重复:
检测stdin是C/C++/Qt中的终端还是管道?

我正在编写一个命令行应用程序,它将数据作为命令行参数或来自cin.

有没有办法检查用户是否在应用程序中传输了一些数据($ ./myapp <test.txt),如果没有,只显示键盘输入的提示?

如果我正在检查!cin.good()/ cin.eof()等,则提示将永远不会出现.

c++ unix linux command-line pipe

2
推荐指数
1
解决办法
478
查看次数

任何人都可以帮我解决C++中的if语句和字符串吗?

我在使用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"之外的任何东西时,它仍然会说是.我尝试用字符/字符做,但我得到相同的输出.有人可以帮助我吗?

c++

0
推荐指数
1
解决办法
79
查看次数

指针、常量和类型别名

以下有什么区别:

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。我没有得到两者之间的区别。

c++ pointers constants

0
推荐指数
1
解决办法
189
查看次数