0

私はQTにかなり慣れておらず、基本的なペイントの例を機能させるのに苦労しています。メインのゲームコントローラーでウィジェットをインスタンス化するゲームを作成しています。これを複数の異なるオブジェクトに渡して、各オブジェクトが独自のpaintEventを持ち、それに応じてオブジェクトをペイントできるようにします。(つまり、キャラクターは別々にペイントします、風景など)

これが私の「アニメーション化されたオブジェクト」ヘッダーです:

class Animated_object: public QWidget {

    public:
        Animated_object(char * _image_url, QWidget * window);
        ~Animated_object();

    protected:
        QImage * get_image();//this will return the image for this object
        QRect * get_rectangle();//this will return the rectangle of coordinates for this point


    protected:
        virtual void paintEvent(QPaintEvent * event) = 0;
        virtual void set_image(char * _image_url) = 0;


    protected:
        QWidget * window;
        char * image_url;//this is the imageurl
        QImage * image;
        QRect * rectangle;

};

私のアニメーションオブジェクトコンストラクター:

Animated_object::Animated_object(char * _image_url, QWidget * _window) : QWidget(_window) {....}

これが私のキャラクターヘッダーです(キャラクターはanimated_objectから継承します)

class Character : public Animated_object {

    public:
        Character(QWidget * _window);   
        ~Character();
        void operator()();//this is the operator for the character class -- this is responsible for running the character
        void set_image(char * _image_url) {};
        void paintEvent(QPaintEvent * event);

};

コンストラクターにメインウィジェットポインターを渡すことで、キャラクターをインスタンス化します。したがって、複数の文字を呼び出すことができる別のクラスがあり、それらはすべて同じウィジェットにペイントされます(うまくいけば)。

私のキャラクターpaintEventは次のようになります:

void Character::paintEvent(QPaintEvent * event) {

    QPainter painter(this);//pass it in window to ensure that it is painting on the correct widget!

    cout << "PAINT EVENT " << endl;
    QFont font("Courier", 15, QFont::DemiBold);
    QFontMetrics fm(font);
    int textWidth = fm.width("Game Over");

    painter.setFont(font);

    painter.translate(QPoint(50, 50));
    painter.drawText(10, 10, "Game Over");

}

それは呼び出されていますが(私はそれをテストするためにstd :: coutを使用しました)、何もペイントしていません...

最後に、ここで私のメインウィジェットが呼び出されます。

Hill_hopper::Hill_hopper(): Game(500,500, "Hill Hopper") {

    Character * character = new Character(window);

    window->show();
    application->exec();


}

そして、これがゲームコンストラクターです:

Game::Game(int _height, int _width, char * title): height(_height), width(_width) {


    int counter = 0;
    char ** args;


    application = new QApplication(counter, args);

    window = new QWidget();

    desktop = QApplication::desktop();

    this->set_parameters(title);

}

どんな助けでも大歓迎です

4

2 に答える 2

1

ヘッダーにQ_OBJECTマクロがないようです。とにかく呼び出されればそれは問題ではないかもしれませんが。

いずれにせよ、新しいクラスを作成するためにQt Creatorを使用することをお勧めします。これにより、このようなものを忘れないように、.hおよび.cppファイルスケルトンが作成されます。

更新の速いゲームの場合、すべてを動かして描画するゲームエリアウィジェットが1つだけあるはずです。QPixMapsのみを描画している場合(直接のテキストや線画はありません。最初にテキストをQPixmapsに変換します)、ウィジェットをQGLWidgetに変換するだけで、OpenGLコードを自分で作成しなくても、QPixMapの「スプライト」の回転とスケーリングが非常に高速になります。提案されたQGraphicsViewが十分に高速である場合、それはあなたのために働くならそれは多くのことをするでしょう、あなたは最初にそれを実験するべきです。

于 2012-10-16T04:43:31.723 に答える
0

この種の考え方のために設計されたQGraphicsViewウィジェットを使用する必要があります。QGraphicsViewのシーン(QGraphicsScene)では、ウィジェットを直接追加できます。組み込みシステムはウィジェットを管理し、必要に応じてペイントイベントを発生させます。さらに、ウィジェットを検索、移動などするための便利な機能がたくさんあります。

于 2012-10-15T22:13:27.560 に答える