В этой программе я построил QPropertyanimation
и добавлю к нему свой товар и pos()
. I override KeyPressEvent
. И с помощью клавиш состоят из J, ф, г вещи идти forward
, идти back
и jump
.использование qpropretyanimation желательно
Под действием силы тяжести, когда прыжок пункта должен падать. Для этого я вызываю функцию down
. Но предмет сразу после прыжка не падает. У меня также есть еще одна проблема: когда первое нажатие j и f (вперед и назад) элемент анимируется желательно, но для пункта следующего раза идти вперед и возвращать всю сцену.
Я имею в виду, он должен анимировать, например, 40 пикселей, но он анимированный 800 пикселей.
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
QPoint start;
QPoint end;
~MainWindow();
private:
QGraphicsView* view;
QGraphicsScene* scene;
void keyPressEvent(QKeyEvent* k);
MyQgraphicsObject* m;
QPropertyAnimation* pr;
QElapsedTimer* timer;
int f;
int u;
int b;
void forward();
void up();
void back();
void down();
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
view=new QGraphicsView;
scene=new QGraphicsScene;
m=new MyQgraphicsObject;
pr=new QPropertyAnimation(m,"pos");
view->setScene(scene);
view->resize(800,800);
view->setFixedSize(800,800);
setCentralWidget(view);
scene->addItem(m);
start= QPoint(0,0);
f=30;
u=-30;
b=-30;
}
void MainWindow::keyPressEvent(QKeyEvent *k)
{
switch (k->key()) {
case Qt::Key_J: {
forward();
break;
}
case Qt::Key_Z: {
up();
down();
break;
}
case Qt::Key_F: {
back();
break;
}
default:
break;
}
}
void MainWindow::forward()
{
end.setX(f);
pr->setEndValue(end);
pr->setDuration(1000);
pr->setEasingCurve(QEasingCurve::Linear);
pr->start();
f+=40;
}
void MainWindow::up()
{
end.setY(u);
pr->setEndValue(end);
pr->setDuration(1000);
pr->setEasingCurve(QEasingCurve::Linear);
pr->start();
u-=30;
pr->pause();
}
void MainWindow::back()
{
end.setX(b);
pr->setEndValue(end);
pr->setDuration(1000);
pr->setEasingCurve(QEasingCurve::Linear);
pr->start();
b-=40;
}
void MainWindow::down()
{
u+=30;
end.setY(u);
pr->setEndValue(end);
pr->setDuration(1000);
pr->setEasingCurve(QEasingCurve::Linear);
pr->start();
}
Код слишком низкого качества. Я не могу догадаться, для чего нужны однобуквенные переменные. Также вызов 'down()' сразу после 'up()' не будет делать то, что вам нужно. Анимация асинхронна. Вам нужно настроить 'QTimer' и периодически вызывать' down() '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''). Кроме того, если пользователь нажимает клавишу при выполнении анимации, нужно сделать еще одну анимацию, но это не будет сделано, потому что 'pr-> start()' ничего не делает, если анимация уже выполняет. –
извините за мой код. Вы сказали, что я должен использовать [QTimer]. Где я его использую? Call down() снова после up.if возможно поставить пример кода для руководства me.i действительно нужно для этой программы. Я очень новичок в qt. особенно в [QGraphicsView] и анимации. – sarina