Russian Qt Forum
Ноябрь 02, 2024, 00:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Непонятное поведение при движени  (Прочитано 1610 раз)
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
« Последнее редактирование: Ноябрь 22, 2011, 10:15 от iks » Записан
iks
Гость
« Ответ #1 : Ноябрь 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 );
« Последнее редактирование: Ноябрь 22, 2011, 10:06 от iks » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 21.