我正在尝试重新编写lazyfoo.net的鼠标事件教程的一部分,仅用于练习。在本网站上有人建议我做之后,我重新考虑了我的设计。我已经决定尝试添加一个图形类,并确保一个类的成员不从它们所属的类继承,这是我上次发布问题时遇到的问题之一。请耐心等待我,因为我不是一个非常有经验的程序员,而且我正在学习SDL2.0。
我在64位戴尔笔记本电脑上运行Windows 10并使用Code :: Blocks 16.01。
我试过谷歌搜索这个问题,我不认为我发现的任何问题与我的具体问题有关,所以在解决了一堆其他错误后,我终于遇到了一个错误,我不知道知道如何解决。
在尝试编译以下代码后,我收到一条错误消息,上面写着"' mSpriteClips'未在此范围内宣布"尽管我将包含mSpriteClips的CentralClass包含在我的cpp文件中。
这是代码。
lbutton.cpp
#include "lbutton.h"
#include "lButtonSprite.h"
#include "global.h"
#include "graphics.h"
#include "ltexture.h"
#include "central_class.h"
LButton::LButton()
{
mButtonPosition.x = 0;
mButtonPosition.y = 0;
mCurrentSprite = button::MOUSE_OUT;
}
void LButton::setPosition( int x, int y )
{
mButtonPosition.x = x;
mButtonPosition.y = y;
}
void LButton::handleEvent(SDL_Event* e)
{
//If mouse event happened
if(e->type == SDL_MOUSEMOTION || e->type == SDL_MOUSEBUTTONDOWN || e->type == SDL_MOUSEBUTTONUP)
{
//Get mouse position
int x, y;
SDL_GetMouseState( &x, &y );
//Check if mouse is in button
bool inside = true;
//Mouse is left of the button
if(x < mButtonPosition.x)
inside = false;
//Mouse is right of the button
else if(x > mButtonPosition.x + global::BUTTON_WIDTH)
inside = false;
//Mouse above the button
else if(y < mButtonPosition.y)
inside = false;
//Mouse below the button
else if(y > mButtonPosition.y + global::BUTTON_HEIGHT)
inside = false;
//Mouse is outside button
if(!inside)
mCurrentSprite = button::MOUSE_OUT;
}
//Mouse is inside button
else
{
//Set mouse over sprite
switch(e->type)
{
case SDL_MOUSEMOTION:
mCurrentSprite = button::MOUSE_OVER_MOTION;
break;
case SDL_MOUSEBUTTONDOWN:
mCurrentSprite = button::MOUSE_DOWN;
break;
case SDL_MOUSEBUTTONUP:
mCurrentSprite = button::MOUSE_UP;
break;
}
}
}
void LButton::render(Graphics &graphics)
{
//Show current button sprite
mButtonSpriteSheet->render(mButtonPosition.x, mButtonPosition.y, graphics, &mSpriteClips[mCurrentSprite]);
}
并且没有声明具有编译器所说成员的文件。
#ifndef CENTRAL_CLASS_H_INCLUDED
#define CENTRAL_CLASS_H_INCLUDED
#include <SDL.h>
#include "lButtonSprite.h"
#include "global.h"
#include "graphics.h"
class LButton;
class CentralClass : public Graphics
{
// Button objects
LButton *mButtons[global::TOTAL_BUTTONS];
// Mouse button sprite rectangles
SDL_Rect mSpriteClips[button::TOTAL];
public:
// Call all functions
CentralClass();
// Starts up SDL and creates window
bool init();
// Loads media
//bool loadMedia();
// Main part of the program
void mainLoop();
// Frees media and shuts down SDL
void close();
// Clean up
~CentralClass();
};
#endif // CENTRAL_CLASS_H_INCLUDED
感谢任何帮助。我希望这些错误消息实际上告诉你问题是什么。这将使编码更加愉快。
答案 0 :(得分:4)
我收到一条错误消息,上面写着&#34;&#39; mSpriteClips&#39;未被宣布 这个范围&#34;尽管事实上我包括了CentralClass,但是 mSpriteClips存在的地方,
不,它没有。该头文件未声明一个名为&#34; mSpriteClips&#34;的对象。它确实声明了一个恰好具有该名称成员的类:
class CentralClass : public Graphics
{
// ...
SDL_Rect mSpriteClips[button::TOTAL];
详情很重要。 mSpriteClips
不是全局对象,它是类的成员。您的错误消息显然来自此处:
void LButton::render(Graphics &graphics)
{
mButtonSpriteSheet->render(mButtonPosition.x, mButtonPosition.y, graphics, &mSpriteClips[mCurrentSprite]);
}
这个名为render()
的名为LButton
的方法,显然不是CentralClass
;因此,有一个班级成员提到一些完全不相关的班级的成员不太可能成功。
目前尚不清楚这块代码的意图是什么。即使render()
可以在某个地方找到CentralClass
类的实例,也无法完成任何操作,因为mSpriteClips
是私有类成员,而LButton
将无法访问无论如何,对这个私人班级成员。
但是,这确实回答了为什么会出现编译错误的问题。