私はちょっとしたゲームを作っています。私は基本的に私のキャラクター(赤い三角形)を左右、ジャンプなどに動かしたいと思っています。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();
}
問題は、私はできないということです今プレイヤーを正しく動かせば、それは一度だけ奇妙な方法で動きます。どんな助けもありがとうございます。
あなたの 'setIsJumping(bool jump)'は 'isJumping = jump;'のみを含むべきですif-elseは不要です:) – juzzlin
ありがとう、ありがとう。これは私から少しダムだった:) – CBinet