crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> как оптимизировать множественную анимацию
freydev
  опции профиля:
сообщение 19.3.2010, 14:38
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.3.2010
Пользователь №: 1549

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго дня, подскажите как отрисовать на сцене множество объектов(около 100), каждый из которых анимирован...
анимация построена на замене картинки по таймеру...есть класс, он загружает картинку и по интервалу меняет её на другую,
при добавлении в сцену объектов этого класса в количестве 3 или больше, анимация идет только если водить мышкой по сцене, с графикой никогда не работал, может чтото не правельно сделал, заранее спасибо, вот исходник...

Раскрывающийся текст
#include <QtGui>
#include <QObject>

class QSprite : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
public:
    QSprite(QObject *parent = 0)
    {
        tTimer = new QTimeLine(1000, this);
        connect(tTimer, SIGNAL(frameChanged( int )), this, SLOT(nextFrame( int )));
        tTimer->setFrameRange(0, 3);
        tTimer->setLoopCount(0);
        tTimer->start();
    }

    ~QSprite()
    {
    }

    QBitmap bMask;
    QPixmap pImage;

    void loadImage(QString filename)
    {
        pImage = QPixmap(filename);
        bMask = pImage.createMaskFromColor(QColor(132,116,116));
        pImage.setMask(bMask);
        setPixmap(pImage);
        update(QRectF(pImage.rect()));
    }

public slots:
    void nextFrame(int i)
    {
        if (i == 0) loadImage("f:\\frame1.bmp");
        if (i == 1) loadImage("f:\\frame2.bmp");
        if (i == 2) loadImage("f:\\frame3.bmp");
        if (i == 3) loadImage("f:\\frame4.bmp");
    }

private:
    QTimeLine *tTimer;
};


не нашел кнопки редактирования... вот так это добавляется в сцену...

Раскрывающийся текст
    QSprite *lab[50];
    for (int i = 0; i < 49; i++)
    {
       lab[i] = new QSprite();
       lab[i]->setPos(rand() % 900 + 1, rand() % 700 + 1);
       scene.addItem(lab[i]);
    }


Цитата(freydev @ 19.3.2010, 16:34) *
Доброго дня, подскажите как отрисовать на сцене множество объектов(около 100), каждый из которых анимирован...
анимация построена на замене картинки по таймеру...есть класс, он загружает картинку и по интервалу меняет её на другую,
при добавлении в сцену объектов этого класса в количестве 3 или больше, анимация идет только если водить мышкой по сцене, с графикой никогда не работал, может чтото не правельно сделал, заранее спасибо, вот исходник...

Раскрывающийся текст
#include <QtGui>
#include <QObject>

class QSprite : public QObject, public QGraphicsPixmapItem
{
Q_OBJECT
public:
    QSprite(QObject *parent = 0)
    {
        tTimer = new QTimeLine(1000, this);
        connect(tTimer, SIGNAL(frameChanged( int )), this, SLOT(nextFrame( int )));
        tTimer->setFrameRange(0, 3);
        tTimer->setLoopCount(0);
        tTimer->start();
    }

    ~QSprite()
    {
    }

    QBitmap bMask;
    QPixmap pImage;

    void loadImage(QString filename)
    {
        pImage = QPixmap(filename);
        bMask = pImage.createMaskFromColor(QColor(132,116,116));
        pImage.setMask(bMask);
        setPixmap(pImage);
        update(QRectF(pImage.rect()));
    }

public slots:
    void nextFrame(int i)
    {
        if (i == 0) loadImage("f:\\frame1.bmp");
        if (i == 1) loadImage("f:\\frame2.bmp");
        if (i == 2) loadImage("f:\\frame3.bmp");
        if (i == 3) loadImage("f:\\frame4.bmp");
    }

private:
    QTimeLine *tTimer;
};


не нашел кнопки редактирования... вот так это добавляется в сцену...

Раскрывающийся текст
    QSprite *lab[50];
    for (int i = 0; i < 49; i++)
    {
       lab[i] = new QSprite();
       lab[i]->setPos(rand() % 900 + 1, rand() % 700 + 1);
       scene.addItem(lab[i]);
    }


gif не предлагать)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 19.3.2010, 15:24
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


По-моему, каждый раз загружать картинку и создавать для него маску это грубо. :)
Проще это сделать в конструкторе один раз, а по срабатыванию таймера только установить их.

По проблеме с анимацией, попробуй установить для своего QGraphicsView флаг QGraphicsView::BoundingRectViewportUpdate:
view.setViewportUpdateMode( QGraphicsView::BoundingRectViewportUpdate );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
freydev
  опции профиля:
сообщение 19.3.2010, 20:57
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.3.2010
Пользователь №: 1549

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 19.3.2010, 17:24) *
По-моему, каждый раз загружать картинку и создавать для него маску это грубо. :)
Проще это сделать в конструкторе один раз, а по срабатыванию таймера только установить их.

По проблеме с анимацией, попробуй установить для своего QGraphicsView флаг QGraphicsView::BoundingRectViewportUpdate:
view.setViewportUpdateMode( QGraphicsView::BoundingRectViewportUpdate );


грубо да) но это прототип, и там много спрайтов будет разной формы, придется наверно динамически добавлять удалять, спасибо за совет, но флаг не помог(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 19.3.2010, 21:14
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(freydev @ 19.3.2010, 20:57) *
грубо да) но это прототип, и там много спрайтов будет разной формы, придется наверно динамически добавлять удалять, спасибо за совет, но флаг не помог(

Выложи в архиве весь проект, что бы он компилировался. Посмотрю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
freydev
  опции профиля:
сообщение 19.3.2010, 22:57
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.3.2010
Пользователь №: 1549

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 19.3.2010, 23:14) *
Цитата(freydev @ 19.3.2010, 20:57) *
грубо да) но это прототип, и там много спрайтов будет разной формы, придется наверно динамически добавлять удалять, спасибо за совет, но флаг не помог(

Выложи в архиве весь проект, что бы он компилировался. Посмотрю.


http://files.mail.ru/KQKMDF
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 19.3.2010, 23:33
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(freydev @ 19.3.2010, 22:57) *
Цитата(BRE @ 19.3.2010, 23:14) *
Цитата(freydev @ 19.3.2010, 20:57) *
грубо да) но это прототип, и там много спрайтов будет разной формы, придется наверно динамически добавлять удалять, спасибо за совет, но флаг не помог(

Выложи в архиве весь проект, что бы он компилировался. Посмотрю.


http://files.mail.ru/KQKMDF

Ну у меня работает, без дополнительных движений.
Linux + Qt 4.6.2
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
freydev
  опции профиля:
сообщение 19.3.2010, 23:36
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.3.2010
Пользователь №: 1549

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 20.3.2010, 1:33) *
Цитата(freydev @ 19.3.2010, 22:57) *
Цитата(BRE @ 19.3.2010, 23:14) *
Цитата(freydev @ 19.3.2010, 20:57) *
грубо да) но это прототип, и там много спрайтов будет разной формы, придется наверно динамически добавлять удалять, спасибо за совет, но флаг не помог(

Выложи в архиве весь проект, что бы он компилировался. Посмотрю.


http://files.mail.ru/KQKMDF

Ну у меня работает, без дополнительных движений.
Linux + Qt 4.6.2

Windows =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.3.2010, 23:45
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


freydev, не цитируй целыми сообщениями. Тяжело читать.
О том, как быстро процитировать часть сообщения, смотри тему Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
freydev
  опции профиля:
сообщение 20.3.2010, 20:02
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 19.3.2010
Пользователь №: 1549

Спасибо сказали: 0 раз(а)




Репутация:   0  


запустил на linux'e, тоже норм работает, хм, а что может мешать в винде?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IMPOMEZIA
  опции профиля:
сообщение 21.3.2010, 9:55
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 42
Регистрация: 18.2.2009
Пользователь №: 560

Спасибо сказали: 2 раз(а)




Репутация:   0  


freydev
С вашим кодом всё в порядке, попробуйте Qt 4.6.0 под Windows, всё будет работать, как задумано.

P.S. Сообщите кто нибуть об этом, если троли ещё не в курсе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 1:29