0

私はC++の初心者ですが、Javaを少し学び、同時に初めてSDLを使用していますが、オブジェクト(パドル)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' はこのスコープで宣言されていません

4

2 に答える 2

0

明確な質問をしていないので、正しい答えを出すのは難しいですが、OnEvent-/OnLoop-Methodでp1とp2にアクセスすることはできないと思います。

2つのパドルオブジェクトをグローバル名前空間に配置することは絶対に必要ですか?このシナリオでは、Pongクラスの一部として2つのパドルメンバーを使用するのが最適だと思うので、次のような初期化リストも使用します。

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-fileに実装され、redraw-Methodがヘッダーファイルに実装されていることを確認すると、インライン化についてもう少し詳しく知りたいと思うかもしれません。この例ではそれほど問題にはなりませんが、特にライブラリを作成する場合は、通常、より複雑なメソッドを変換ユニット(cppファイル)に移動することをお勧めします。

于 2012-08-06T19:49:37.940 に答える
0

パドルが定義されているファイル以外でもパドルを表示したい場合は、ヘッダー ファイルに宣言を追加する必要があります。

extern paddle p1;
extern paddle p2;

そのため、他の .cpp ファイルはそれらが存在することを認識します。

于 2012-08-06T19:24:58.307 に答える