2016-03-19 9 views
0

私はちょっとしたゲームを作っています。私は基本的に私のキャラクター(赤い三角形)を左右、ジャンプなどに動かしたいと思っています。Qt Creator Platformerゲーム - 動作しない(QGraphics初心者)

プログラムはまだこの状態では非常に小さく、私はそのようなことをどうすればいいのか知りたいと思います。

私はPlayer Class(QObject, QGraphicsPolygonItem)Game Class(QGraphicsView)を作成しました。私はPlayerクラスにKeyPressEventのメソッドを渡したときに最初はうまくいきましたが、ジャンプループに問題がありました。私はジャンプループ内でscene-> update()を実行したかったのですが、シーンが私のゲームクラスの属性。

次に、GameクラスにPressKeyEvent methodを与えようとしました。それで、Player *プレーヤー属性を移動します。

基本的に、私が望むのは、自分のforループの繰り返しごとに私のrect更新の位置を見ることができることです。 できますか?

これは意味があり、いつものように、たくさんの人に感謝します。

Player.h & Player.cpp

#pragma once 
#include <QGraphicsPolygonItem> 
#include <QBrush> 

class Player : 
    public QObject, public QGraphicsPolygonItem 
{ 
    Q_OBJECT 
public: 
    Player(); 
    // Setters 
    void setIsJumping(bool); 
    // Getters 
    bool getIsJumping(); 
    public slots: 
private: 
    bool isJumping; 
}; 

#include "Player.h" 


Player::Player() 
{ 
    // *************** 
    // Draw the player 
    // *************** 
    QVector<QPointF> gemPoints; 
    gemPoints << QPointF(0, 2) << QPointF(1, 0) << QPointF(2, 2); 
    // Size 
    int SCALE_BY = 8; 
    for (size_t i = 0; i < gemPoints.size(); i++) 
    { 
     gemPoints[i] *= SCALE_BY; 
    } 
    // Create the polygon 
    QPolygonF gemModel(gemPoints); 
    setPolygon(gemModel); 
    setPos(400, 500); 
    // Color 
    QBrush brush; 
    brush.setStyle(Qt::SolidPattern); 
    brush.setColor(Qt::red); 
    setBrush(brush); 
    // Make player focusable 
    this->setFlag(QGraphicsItem::ItemIsFocusable); 
    this->setFocus(); 

} 


void Player::setIsJumping(bool jump) 
{ 
    if (jump == true) 
    { 
     isJumping = true; 
    } 
    else 
    { 
     isJumping = false; 
    } 
} 

bool Player::getIsJumping() 
{ 
    return isJumping; 
} 

がGame.h & Game.cpp

#pragma once 
    #include <QGraphicsView> 
    #include <QGraphicsScene> 
    #include <QKeyEvent> 
    #include "Player.h" 

    class Game : 
     public QGraphicsView 
    { 
     Q_OBJECT 
    public: 
     // Constructors 
     Game(QWidget* parent = NULL); 
     // Methods 
     void start(); 
     void jump(); 
     void keyPressEvent(QKeyEvent *event); 
     // Attributes 
     QGraphicsScene* scene; 
     Player* player; 
    }; 

#include "Game.h" 

Game::Game(QWidget* parent) 
{ 
    // Set up the screen 
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    setFixedSize(1024, 768); 

    // Set up the scene 
    scene = new QGraphicsScene(); 
    scene->setSceneRect(0, 0, 1024, 768); 
    setScene(scene); 
} 


void Game::start() 
{ 
    scene->clear(); 
    player = new Player(); 
    scene->addItem(player); 

} 

void Game::keyPressEvent(QKeyEvent * event) 
{ 
    if (event->key() == Qt::Key_Left) 
    { 
     player->setPos(x() - 3, y()); 
    } 
    else if (event->key() == Qt::Key_Right) 
    { 
     player->setPos(x() + 3, y()); 
    } 
    else if (event->key() == Qt::Key_Space) 
    { 
     for (size_t i = 0; i < 10; i++) 
     { 
      player->setIsJumping(true); 
      this->jump(); 
     } 
    } 
} 

void Game::jump() 
{ 
    if (player->getIsJumping() == true) 
    { 
     for (size_t i = 0; i < 100; i++) 
     { 
      this->player->setPos(x(), y() - 0.1); 
      this->update(); 
     } 
     player->setIsJumping(false); 
    } 
} 

MAIN.CPP

#include "plateforme.h" 
#include <QtWidgets/QApplication> 
#include "Game.h" 


int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Game game; 
    game.show(); 
    game.start(); 
    return a.exec(); 
} 

問題は、私はできないということです今プレイヤーを正しく動かせば、それは一度だけ奇妙な方法で動きます。どんな助けもありがとうございます。

+0

あなたの 'setIsJumping(bool jump)'は 'isJumping = jump;'のみを含むべきですif-elseは不要です:) – juzzlin

+0

ありがとう、ありがとう。これは私から少しダムだった:) – CBinet

答えて

0

playerの位置を設定すると、playerの座標を変更し、thisの座標を変更しないと問題が発生します。そのため、あなたはplayer、使用を移動したいとき:

player->setPos(player->x() - 3, player->y()); 
       ^   ^ 

と同じあなたのループにジャンプする:あなたはsetPos(x()-3, y())を使用する場合

player->setPos(player->x(), player->y() - 0.1); 
       ^  ^

、それはあなたのQGraphicsViewの位置にプレイヤーの位置を設定し、 、それはなぜそれが見えなくなるからです。あなたのゲームで幸運!

+0

うわー、感謝の仲間、私はなぜ私はそれについて早く考えなかったのか分からない! :) また、ジャンプする部分については、私はそれを実装する方法がわかりません。私は状態を設定する必要があります。「スペースバー」が押されたときにジャンプし、次にジャンプメソッドを呼び出すのですか?私はそれをどこに呼び出すべきかわからない。 – CBinet

+0

ようこそ。あなたがその答えを受け入れることを助けてくれたならば、Stackoverflowに感謝する最良の方法です。ジャンプ部分について:それは主観的な質問であり、常にあなたのデザインを実装するいくつかの方法があります。オブジェクト指向設計の初心者であれば、試行錯誤だけで、ソフトウェアの設計方法に関する知識と優れたプラクティスを得ることができます。そのジャンプ部分についてあなた自身を求めるいくつかの質問:本当に 'bool'変数が必要ですか?あなたはループとしてジャンプを実装する必要がありますか?すべての決定を下すために、私はKISSの原則をお勧めします。 – vicrucann

+0

さて、私は三角形を上げることに成功しましたが、滑らかなやり方でそれをやりたいのですが、三角形を移動させてシーンを更新するforループを実行しても、反復ごとに意味があります。それは? :p ありがとうございました – CBinet