Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: iks от Ноябрь 21, 2011, 22:05



Название: [решено] Непонятное поведение при движени
Отправлено: iks от Ноябрь 21, 2011, 22:05
Есть вот такой класс
Код:
#include "myscene.h"
#include "../math/mymath.h"
#include <QtCore/QTimer>
#include <QtGui/QGraphicsEllipseItem>

myScene::myScene()
{
    mathMy = new myMath;

    /// раскидаем кометы
    int numKom = 20;
    for(int i=0; i<numKom; i++)
    {
        _rg = rand()%150+70;
        float toX=rand()%470+15.0, toY=rand()%470+15.0;
        item = this->addEllipse(toX, toY, 10, 10, QPen(Qt::NoPen), QBrush(QColor(_rg, _rg, 50)));
        lst_RG << _rg;  /// R

        lstX << toX;  /// точная координата x
        lstY << toY;  /// точная координата y
        /// высчитаем единицу перемещения для x и y
        int _ugol = rand()%45;
        int _y = 510.0 * tan(QString::number(_ugol * M_PI / 180).toDouble());
        float _X = 510.0/mathMy->lengthLine(0,0, 510,_y);  /// mathMy->lengthLine(x1,x2, y1,y2) возращает длину вектора sqrt(pow((x2-x1),2)+pow((y2-y1),2));
        float _Y = _y/510.0;

        if (i < numKom/8) { toX=_Y-_Y*2; toY=_X-_X*2.0; }     /// направление полета вверх-лево
        else if (i < numKom/8*2) { toX=_Y; toY=_X-_X*2.0; }   /// --- вверх-право
        else if (i < numKom/8*3) { toX=_X; toY=_Y-_Y*2.0; }   /// --- право-вверх
        else if (i < numKom/8*4) { toX=_X; toY=_Y; }          /// --- право-низ
        else if (i < numKom/8*5) { toX=_Y; toY=_X; }          /// --- низ-право
        else if (i < numKom/8*6) { toX=_Y-_Y*2.0; toY=_X; }   /// --- низ-лево
        else if (i < numKom/8*7) { toX=_X-_X*2.0; toY=_Y; }   /// --- лево-низ
        else { toX=_X-_X*2; toY=_Y-_Y*2; }                    /// --- лево-вверх
        lstToX << toX*4.0;  /// единица перемещения по x
        lstToY << toY*4.0;  /// единица перемещения по y

        lstEl << item;
    }

    /// запустим таймер на 0.42 сек. что приблизительно равно 24 кадра в секунду
    QTimer *timer = new QTimer;
    connect(timer, SIGNAL(timeout()), this, SLOT(polet()));
    timer->start(42);

    return;
}

/// полет комет
void  myScene::polet()
{
    for(int i=0; i<lstEl.count(); i++)
    {
        float xX = lstX.at(i)+lstToX.at(i);
        float yY = lstY.at(i)+lstToY.at(i);

        if(xX < -10) xX = 500;
        else if(xX > 500) xX = -10;
        if(yY < -10) yY = 500;
        else if(yY > 500) yY = -10;

        lstEl.at(i)->setPos( xX, yY );
        lstX[i] = xX;
        lstY[i] = yY;
}
Я его подрезал, оставил только проблемотичный код, вообще на этот таймер повещена работа более 1000 item, но вопрос не в этом.
Именно эти item появляются не скраев и исчезают тоже не с краю, а вот где глюк понять не могу. Короче летают как им угодно, а нет так как положено =)
Окно размером 500x500


Название: Re: Непонятное поведение дижущихся объекто
Отправлено: iks от Ноябрь 22, 2011, 10:03
Отвечу сам себе.
Изменив место создания объекта на координаты x=0 y=0 и после этого переместив его на рандомно выбранную координату, он нормально начинает себя вести, то есть получается что начальная координата при рождении объекта играет свою роль.
Приведу исправленный кусок кода
Код:
        item = this->addEllipse(0, 0, 10, 10, QPen(Qt::NoPen), QBrush(QColor(_rg, _rg, 50)));
        item->setPos( toX, toY );