小编Oru*_*aru的帖子

C++ #include guards

解决了

真正帮助我的是,我可以在.cpp文件中#include标头而不会导致重新定义的错误.


我是C++的新手,但我在C#和Java方面有一些编程经验,所以我可能会遗漏一些C++独有的基础知识.

问题是我真的不知道什么是错的,我会粘贴一些代码来试图解释这个问题.

我有三个类,GameEvents,Physics和GameObject.我有每个标题.GameEvents有一个Physics和一个GameObjects列表.Physics有一个GameObjects列表.

我想要实现的是我希望GameObject能够访问或拥有一个Physics对象.

如果我只是在GameObject中#include"Physics.h",我会得到"错误C2111:'ClassXXX':'class'类型redtifinition",我理解.这就是我认为#include-guard有帮助的地方所以我在我的Physics.h中添加了一个包含守卫,因为那是我想要包含两次的标题.

这是它的外观

#ifndef PHYSICS_H
#define PHYSICS_H

#include "GameObject.h"
#include <list>


class Physics
{
private:
    double gravity;
    list<GameObject*> objects;
    list<GameObject*>::iterator i;
public:
    Physics(void);
    void ApplyPhysics(GameObject*);
    void UpdatePhysics(int);
    bool RectangleIntersect(SDL_Rect, SDL_Rect);
    Vector2X CheckCollisions(Vector2X, GameObject*);
};

#endif // PHYSICS_H
Run Code Online (Sandbox Code Playgroud)

但如果我在GameObject.h中#include"Physics.h",现在就像这样:

#include "Texture2D.h"
#include "Vector2X.h"
#include <SDL.h>
#include "Physics.h"

class GameObject
{
private:
    SDL_Rect collisionBox;
public:
    Texture2D texture;
    Vector2X position;
    double gravityForce;
    int weight;
    bool isOnGround;
    GameObject(void);
    GameObject(Texture2D, Vector2X, int);
    void UpdateObject(int);
    void Draw(SDL_Surface*);
    void SetPosition(Vector2X);
    SDL_Rect GetCollisionBox(); …
Run Code Online (Sandbox Code Playgroud)

c++ header include-guards include

39
推荐指数
2
解决办法
7万
查看次数

OpenGL GL_POLYGON_SMOOTH 2D抗锯齿创建四边形

更新:

我在安装NVIDIA控制面板时找到它,如果我卸载它可以正常工作.

在OpenGL中旋转四边形时,边缘会变得锯齿状.

如果我调用glEnable(GL_POLYGON_SMOOTH),边缘会变得平滑,但OpenGL会在我的所有图像中绘制一条白色对角线,就像它创建了我的四边形一样.

这是它的样子: GL_POLYGON_SMOOTH

有没有办法禁用该行,或者我可以用另一种简单的方式获得抗锯齿?我试过GL_MULTISAMPLE但没有任何反应.

在我的代码中我也有:

glShadeModel(GL_SMOOTH);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glDisable(GL_DEPTH_TEST);

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

c c++ opengl rotation antialiasing

6
推荐指数
1
解决办法
3480
查看次数

OpenGL 旋转 2D 纹理

更新

更新见底部。


我一直在互联网上寻找很多,我发现了一些教程来解释我想要实现的目标,但我无法让它工作,要么教程不完整,要么不适用于我的代码。

我正在尝试像围绕其原点(中心)旋转 2D 图像一样简单的方法。

我使用 xStart、xEnd、yStart 和 yEnd 来翻转 0 或 1 的纹理。

这就是代码的样子

GameRectangle dest = destination;
Vector2 position = dest.getPosition();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, this->image);

//If the rotation isn't 0 we'll rotate it
if (rotation != 0)
{
    glMatrixMode(GL_TEXTURE);

    glLoadIdentity();
    glTranslatef(0.5, 0.5, 0);
    glRotatef(rotation, 0, 0, 1);

    glMatrixMode(GL_PROJECTION);
}

glBegin(GL_QUADS);
glTexCoord2d(xStart,yStart);
glVertex2f(position.x, position.y);

glTexCoord2d(xEnd,yStart);
glVertex2f(position.x + this->bounds.getWidth(), position.y);

glTexCoord2d(xEnd,yEnd); 
glVertex2f(position.x + this->bounds.getWidth(), position.y + this->bounds.getHeight());

glTexCoord2d(xStart,yEnd);
glVertex2f(position.x, position.y + this->bounds.getHeight());

glEnd();

glDisable(GL_TEXTURE_2D);

//Reset the rotation so next object …
Run Code Online (Sandbox Code Playgroud)

c c++ opengl 2d rotation

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

快速了解一下c ++中的const

我知道声明返回类型const的正确方法是写:

int foo() const;
Run Code Online (Sandbox Code Playgroud)

但在某些情况下,这对我不起作用,那么我可以使用:

const int foo();
Run Code Online (Sandbox Code Playgroud)

这些之间有什么区别,为什么我可以在所有情况下使用后者而不是第一个.

我不能使用第一个的例子是当我想返回在方法之外定义的bool数组时.

亲切的问候,

/马库斯

c++ methods const return

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

C++ Int位操作是2UL = 10UL?

我有一个快速的问题.

我一直在c/c ++中使用位操作一段时间,我最近发现当我将2UL和10UL与常规的无符号int进行比较时,它们似乎返回相同的位.

例如,

#define JUMP 2UL
#define FALL 10UL

unsigned int flags = 0UL;
this->flags |= FALL;

//this returns true
this->is(JUMP);

bool Player::is(const unsigned long &isThis)
{
return ((this->flags & isThis) == isThis);
}
Run Code Online (Sandbox Code Playgroud)

请确认2U是否等于10U,如果是,如果我需要一个无符号整数中的8(?)个标志,我将如何绕过它.

亲切的问候,

-Markus

c c++ bit-manipulation

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