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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: PacMan  (Прочитано 14733 раз)
Impuls
Гость
« Ответ #15 : Октябрь 26, 2010, 17:53 »

нене) Никаких обид) просто нужен пример и ряд готовых решений-примеров что бы от него можно было "на примерах" плясать в решении простых задач.
Есть пример какого Qt-шного гейм-примера что бы начать разбираться?
В конце концов мне не нужен совсем-совсем-серьезный гейм-движок, но что-то простое что бы "просто работало"))))
Выкладываю код моего зверя. На вершину оптимизации не тянет, сделано по лузерски, но работает как тру решение (в плане того, что ничего не глючит))). Пробовал рисовать по 50 колобков на сцене, работало без всяких тормозов и глюков. Заодно может и посоветуете что-нибудь дельное)))
Записан
Denjs
Гость
« Ответ #16 : Октябрь 27, 2010, 00:43 »

спасибо большое. Буду разбираться на досуге)
Записан
ufna
Гость
« Ответ #17 : Октябрь 27, 2010, 11:51 »

Я счас в свободное время работаю над движковой структурой для 2д проектов на Qt, потом выложу. Пример выше со скрином мне не выложить по понятным причинам коммерции Улыбающийся
Записан
ufna
Гость
« Ответ #18 : Октябрь 27, 2010, 12:04 »

Выкладываю код моего зверя. На вершину оптимизации не тянет, сделано по лузерски, но работает как тру решение (в плане того, что ничего не глючит))). Пробовал рисовать по 50 колобков на сцене, работало без всяких тормозов и глюков. Заодно может и посоветуете что-нибудь дельное)))

у тебя есть слайд апдейтер и сам пакман, причем они завязаны друг на друга - как следствие, это на данный момент просто лишнее разделение на два класса

"поворот" лучше реализовывать в спрайтах, а не поворотом айтема Улыбающийся

решение работает, но очень не универсально. Хотя для целей начала сабжа думаю подойдет, но главная проблема что тебе встретится - для каждого индивидуального объекта, у которого чуть больше стейтов или другое поведение картинки - придется писать еще два доп. класса, или один, а апдейтер слайда расширять. Т.е. пока это грубая реализация. Я когда вот эту штуку писал, тоже сделал что все для нее работало, но код совершенно не расширяем оказался в итоге.

попробую на днях описать детальнее как лучше организовать создание спрайтов для Qt "без геммороя"
Записан
Impuls
Гость
« Ответ #19 : Октябрь 27, 2010, 13:08 »

у тебя есть слайд апдейтер и сам пакман, причем они завязаны друг на друга - как следствие, это на данный момент просто лишнее разделение на два класса

"поворот" лучше реализовывать в спрайтах, а не поворотом айтема Улыбающийся

решение работает, но очень не универсально. Хотя для целей начала сабжа думаю подойдет, но главная проблема что тебе встретится - для каждого индивидуального объекта, у которого чуть больше стейтов или другое поведение картинки - придется писать еще два доп. класса, или один, а апдейтер слайда расширять. Т.е. пока это грубая реализация. Я когда вот эту штуку писал, тоже сделал что все для нее работало, но код совершенно не расширяем оказался в итоге.

попробую на днях описать детальнее как лучше организовать создание спрайтов для Qt "без геммороя"
Дело в том, что мне нужно было сделать таймер в отдельном потоке (ибо в потоке есть цикл обработки событий). В общем, у меня не получилось сделать все в одном классе(((

Вот почему поворот лучше в спрайтах? Если у меня будет спрайт из 20 слайдов - придется поворачивать каждый из 20 слайдов, а так только один айтем (хотя наверное это действительно более универсальный способ).
Насчет грубой реализации - да. Ее придется еще долго шлифовать напильником((

Кстати, у меня назрел еще один вопрос: как мне сделать сглаживание картинки?
« Последнее редактирование: Октябрь 27, 2010, 13:11 от Impuls » Записан
ufna
Гость
« Ответ #20 : Октябрь 27, 2010, 13:23 »

поворот в спрайтах - это подсказка насчет необходимости наличия менеджера ресурсов как большой единицы архитектуры Улыбающийся

т.к. ладно счас у тебя колобок бегает в четырех направлениях. А если ты захочешь менять картинку для движения? К примеру вверх - ты видишь его попу, вниз - перед и т.п. - и в таком случае возможны проблемы с текущей реализацией. Обычно все возможные состояния объектов прорисовываются отдельно.

таймер в отдельный поток то зачем совать? QTimer и так по-моему создает себе нечто подобное.


сглаживание - посмотри флаги для вьюпорта какие есть, смотри setRenderHints(..)
Записан
Impuls
Гость
« Ответ #21 : Октябрь 27, 2010, 14:39 »

таймер в отдельный поток то зачем совать? QTimer и так по-моему создает себе нечто подобное.
сглаживание - посмотри флаги для вьюпорта какие есть, смотри setRenderHints(..)
Такое я могу сделать:
Код:
timer = new QTimer(this);
timer->start(100);
А такое не могу:
Код:
QPacMan::QPacMan(QGraphicsItem * parent):QGraphicsPixmapItem(parent)
{
  timer = new QTimer(this);
  Start(100);
}
QPacMan::Start(int timeOut)
{
  timer->start(timeOut);
}
Все из за того, что в QGraphicsPixmapItem нет цикла обработки событий.
А сглаживание я могу поставить только для QPainter. Для QPixmap такого метода нету((((
Записан
ufna
Гость
« Ответ #22 : Октябрь 27, 2010, 14:55 »

QPixmap он себя не рисует, поэтому у него сглаживания и нет - это просто контейнер данных

рисует QPainter, а у тебя в данном случае - QGrapicsView, ему и задаются эти параметры - рисовать со сглаживанием или нет.


делай timer = new QTimer();, а затем в декструкторе delete timer; вручную и все.
Записан
Impuls
Гость
« Ответ #23 : Октябрь 27, 2010, 15:50 »

QPixmap он себя не рисует, поэтому у него сглаживания и нет - это просто контейнер данных
рисует QPainter, а у тебя в данном случае - QGrapicsView, ему и задаются эти параметры - рисовать со сглаживанием или нет.

делай timer = new QTimer();, а затем в декструкторе delete timer; вручную и все.
Такс... Со сглаживанием разобрался...
А вот с таймером понапряжней будет.
class QPacMan : public QGraphicsPixmapItem - не наследуется от QObject, следовательно я не могу вызвать connect(timer,SIGNAL(timeout()),this,SLOT(UpdateSlide())); Вот такая вот трагедия.
Или я туплю и чего-то не понимаю?
___________________________________________________________________
А все. Это я туплю))) Сделал без отдельного потока
« Последнее редактирование: Октябрь 27, 2010, 16:31 от Impuls » Записан
ufna
Гость
« Ответ #24 : Октябрь 27, 2010, 18:27 »

как сделал? Улыбающийся (обычно принято решения в темы показывать, т.к. по поиску люди ищут)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #25 : Октябрь 27, 2010, 21:21 »

Цитировать
QPixmap он себя не рисует, поэтому у него сглаживания и нет - это просто контейнер данных
Зато у него есть такой метод:
Код
C++ (Qt)
QPixmap QPixmap::scaled ( const QSize & size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation ) const
Записан

Qt 5.11/4.8.7 (X11/Win)
ufna
Гость
« Ответ #26 : Октябрь 27, 2010, 21:23 »

и что? тем не менее он себя не рисует, это лишь выбор алгоритма, которым изменяется размер пиксмапа Улыбающийся)
Записан
Impuls
Гость
« Ответ #27 : Октябрь 28, 2010, 10:43 »

как сделал? Улыбающийся (обычно принято решения в темы показывать, т.к. по поиску люди ищут)
Обязательно выложу. Вот подправленные исходники.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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