我是C ++的新人,但我已经学习了一点Java和I / m同时第一次使用SDL,但我的问题是我正在尝试创建一个对象(paddle)p1和p2。
此
#ifndef PONG_H_
#define PONG_H_
#undef main
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
class paddle{
private:
int y;
int yv;
int x;
public:
paddle(){
y = 0;
yv = 0;
x = 0;
}
paddle(int ex, int why, int vel){
y = why;
yv = vel;
x = ex;
}
void setY(int ycoord) {y = ycoord;}
void setV(int velocity){ yv = velocity;}
void setX(int xcoord) {x = xcoord;}
int getX() {return x;}
int getY() {return y;}
int update(){y += yv; return y;}
};
class Pong { //pong class where everythin gets its name and a purpose.
private:
SDL_Surface * Paddle;
SDL_Surface * Ball; //SDL_Surface pointer for Ball
SDL_Surface * screen; //SDL_Surface pointer to backbuffer
public:
int Running;
Pong(); //eh..
int OnExecute(); //another function returning a value.
int w; //width of screen
int h; //height of screen
bool OnInit();
void OnEvent(SDL_Event* Event);
void OnLoop();
void OnRender();
void OnCleanup();
void redraw( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { //Make a temporary rectangle to hold the offsets
SDL_Rect offset; //Give the offsets to the rectangle
offset.x = x; offset.y = y;
SDL_BlitSurface( source, NULL, destination, &offset );//Blit the surface
offset.x =0; offset.y=0; //resets the offsets sicne they apaprently dont reset per use.
};
};
#endif /* PONG_H_ */
是我的头文件,它包含了pong类的主要功能,但是我省略了那些让事情变得不那么令人费解的文件。如果需要这些答案,请告诉我。
我在这里宣布对象......
#include <iostream>
#include <SDL/SDL.h>
#include "Pong.h"
paddle p1;
paddle p2;
Pong::Pong(){
h = 768;
w = 1024;
screen = NULL;
Paddle = NULL;
Ball = NULL;
Running = true;
atexit(SDL_Quit);
}
int Pong::OnExecute() {
if(OnInit() == false)
return-1;
SDL_Event Event;
while(Running) {
while(SDL_PollEvent(&Event)) {
OnEvent(&Event);
}
OnLoop();
OnRender();
}
OnCleanup();
return 0;
}
int main( int argc, char* args[]) {
Pong theApp;
return theApp.OnExecute();
}
但是什么样的困难是我在...中使用它:
#include "Pong.h"
void Pong::OnEvent(SDL_Event* Event) {
if(Event->type == SDL_QUIT)
Running = false;
switch(Event->type)
{
case SDL_KEYDOWN: //look for key holds
switch(Event->key.keysym.sym) //check key values and changes coords respectiely
{
default:
break;
case SDLK_UP:
p2.setV(-2);
break;
case SDLK_DOWN:
p2.setV(2);
break;
case SDLK_w:
p1.setV(-2);
break;
case SDLK_s:
p1.setV(2);
break;
case SDLK_ESCAPE:
Running = false;
break;
}
break;
case SDL_KEYUP:
switch(Event->key.keysym.sym)
{
default:
break;
case SDLK_UP:
p2.setV(0);
break;
case SDLK_DOWN:
p2.setV(0);
break;
case SDLK_w:
p1.setV(0);
break;
case SDLK_s:
p1.setV(0);
break;
}
break;
break;//break of Key holding event check
}
}
我很难问这个问题,因为我不知道从哪里开始。我尝试了许多不同的奇怪事物,现在我迷失了。如果您需要更多信息,我很乐意提供。
void Pong::OnLoop(){
if(p1.getY()<=0){
p1.setV(0);
p1.setY(0);
}
if(p2.getY()<=0){
p2.setV(0);
p2.setY(0);
}
if(p1.getY()>=h - Paddle->h){
p1.setV(0);
p1.setY(h - Paddle->h);
}
if(p2.getY()>=h - Paddle->h){
p2.setV(0);
p2.setY(h - Paddle->h);
}
}
.. \ src \ Pong_OnLoop.cpp:11:5:错误:'p1'未在此范围内声明
.. \ src \ Pong_OnLoop.cpp:15:5:错误:'p2'未在此范围内声明
.. \ src \ Pong_OnLoop.cpp:19:5:错误:'p1'未在此范围内声明
.. \ src \ Pong_OnLoop.cpp:23:5:错误:'p2'未在此范围内声明
答案 0 :(得分:0)
如果您希望paddles在其定义的文件中可见,则必须向头文件添加声明
extern paddle p1;
extern paddle p2;
所以其他的.cpp文件会知道它们存在。
答案 1 :(得分:0)
由于您没有提供明确的问题,很难提供正确的答案,但我的猜测是您无法在OnEvent- / OnLoop-Method中访问p1和p2。
是否绝对有必要让两个paddle-object存在于全局命名空间中?因为在这种情况下我认为最好有2个paddle-member作为Pong类的一部分,我也会使用这样的初始化列表:
class Pong {
private:
SDL_Surface * Paddle;
SDL_Surface * Ball; //SDL_Surface pointer for Ball
SDL_Surface * screen; //SDL_Surface pointer to backbuffer
paddle p1;
paddle p2;
public:
Pong() :
h(768),
w(1024),
screen(NULL),
Paddle(NULL),
Ball(NULL),
Running(true),
p1(10, 384, 0),
p2(1014, 384, 0) {
atexit(SDL_Quit);
};
// ...
};
您可能根本不需要所有初始化程序,具体取决于优化设置和默认内存初始化,但这不是重点。这样您就可以在所有Pongs自己的方法中访问p1和p2。 Bo Perssons的回答也可以起作用,但我认为这是一个更加客观,因而面向C ++的方法。
旁注:您说头文件包含更多方法 - 看到您的构造函数是在cpp文件中实现的,并且在头文件中有重绘方法,您可能想要了解更多关于内联的内容。在这个例子中,这不是什么大问题,但通常最好将更复杂的方法移到翻译单元(cpp-files),特别是在创建库时。