15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
|||||||||||||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||||||||||||
Qt, лего игрушка (2д), трудности с наследованием и "детальками"06.06.2021, 11:21. Показов 34852. Ответов 406
Здравствуйте
К чему стремлюсь: лего-стройка, 2д, детали крепятся в пазы (собственно, как в лего), детали не могут висеть в воздухе, не стыкуемые - не стыкуются, детальки можно вертеть (т.к. есть г-образные). В общем, думаю нет смысла сильно углубляться в лего В моем представлении: деталь (класс element) должна состоять из прототипов (класс block) Деталь должна как бы "заполняться" прототипами, примерно так: элемент3х1 (деталь) заполняется (состоит из) 3-мя блоками по горизонтали, и сам элемент (деталь) является объектом, к которому мы потом можем обращаться по this в функциях (совсем круто, если каким то образом мы сможем обращаться !помимо этого! еще и к конкретным блокам-прототипам, из которых состоит элемент-деталь (кажется, это пригодится для состыковки по клеткам) На моменте "складывания" детали из блока я окончательно иссяк Прошу помочь реализовать block.h Кликните здесь для просмотра всего текста
block.cpp Кликните здесь для просмотра всего текста
mainwindow.h Кликните здесь для просмотра всего текста
mainwindow.cpp Кликните здесь для просмотра всего текста
element.h Кликните здесь для просмотра всего текста
element.cpp Кликните здесь для просмотра всего текста
mainwindow.ui Кликните здесь для просмотра всего текста
// Еще хотелось бы узнать для чего необходим третий параметр, и для чего вторая строчка (знаю что вопросы из разряда сиди я сам открою, но что то до меня никак не доходит, пишу такие вещи просто копипастом)
1
|
06.06.2021, 11:21 | |
Ответы с готовыми решениями:
406
Некоторые трудности с наследованием В 90-е годы у детей была популярная игрушка - тамагочи. Игрушка представляла собой виртуальный домашний питомец Создание лего 2д лего. QGraphicsItemGroup? программа для роботов Лего на С++ |
фрилансер
5838 / 5358 / 1102
Регистрация: 11.10.2019
Сообщений: 14,324
|
|
06.06.2021, 17:04 | 2 |
QObject *parent - указатель на объект, который будет владеть данным объектом (относится к Qt, читать справку по классу QObject)
вызывается конструктор предка Block, то есть QObject, и в этот конструктор передаётся как раз "родитель" - будущий владелец нашего объекта. После запятой - инициализация ещё одного предка (в данном случае можно не записывать, так как параметры всё равно никакие в конструктор не переданы) (относится к C++, читать про наследование)
2
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
|
06.06.2021, 20:51 | 3 |
обратите внимание на
зы интересно, а как вообще выглядит это лего 2д?
1
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
|
06.06.2021, 22:07 [ТС] | 4 |
Алексей1153, благодарю Вас за ответ. Справки читаю, но поскольку область для меня новая - многие вещи доходят как до жирафа
что означает "будет владеть"? я так понимаю допустим: Кликните здесь для просмотра всего текста
[CPP] Element elem; //допустим, являющийся потомком QObject Block blox; blox(0,0,Element elem); [/CPP ] здесь получается, что elem - parent, то есть в дальнейшем я смогу получать доступ из elem к полям blox? Буду благодарен, если Вы сможете более подробно объяснить что дает нам (Block'у) вызов данного конструктора QObject //______________________ sdf45, благодарю Вас за ответ. Надеюсь, я смогу разобраться с идеей, изложенной Вами. Примерно так я себе это и представлял, но пока не очень понимаю как реализовать это в рамках ООП, совсем недавно начал с ним знакомиться. Многие вещи для меня в новинку ЗЫ Так же как и шахматы с видом сверху А если по простому - примерно как тетрис из лего. Только детальки выбираем сами, размещаем сами, не убираем "заполненный" ряд, ну и еще пару мелочей
0
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
|
06.06.2021, 22:17 | 5 |
дык вид сверху или сбоку? если свеху то нижний слой фигур перекрывается фигурами, лежащими сверху?
а если сбоку то да, получается тетрис Добавлено через 2 минуты ну если код который выше выложили-Ваш, то вполне понимаете
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
06.06.2021, 22:25 | 6 |
Владеть - значит контролировать время жизни. Если объект создан динамически, то владеет им тот, кто вызывает delete.
Добавлено через 5 минут Дает корректную инициализацию объекта. Если вы ничего не напишите, то будет вызван конструктор по умолчанию. Но в данном случае автору кода, видимо, было интересно, чтобы наследнику (Block) тоже можно было назначить владельца, на общих для всех классов Qt основаниях. Поэтому необходим был вызов конструктора, который пробросит указатель на владельца в базовый класс QObject, т.к. в нем сосредоточена вся нужная для работы машинерия. Что это дало в целом для программы - надо у автора спрашивать. Иными словами, если этот механизм не интересен, то это минус один повод вообще наследоваться от QObject. Что из литературы читаете?
1
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
|
06.06.2021, 22:32 [ТС] | 7 |
sdf45, пардоньте, правильно излагаете, вид сбоку
ну как тут сказать. Что то представляю, что то понимаю. Но многие вещи я делаю впервые, а большую их часть я делаю а-ля, из каких либо материалов интернетов или лекций, учебников если вас не затруднит, могли бы Вы предложить какой то прототип для создания детали: здесь у меня какой то клин. потому что, так как я придумываю, эта деталь получается просто контейнером под блоки, без какого либо логического смысла. то есть, просто переменная под три блока в ряд Добавлено через 5 минут DrOffset, по Qt - больше интернетов. Также, имеется курс лекций одного из местных университетов, с практическими примерами, собственно, хищения кода происходят преимущественно из этих лекций по C++ - Павловская, Щупак, в свое время один хороший преподаватель порекомендовал именно эти книги
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
06.06.2021, 22:41 | 8 |
Это же не относиться к Qt непосредственно. В ваших вопросах вещи-то общие для всего C++.
Ну понятно. Загляните сюда: Литература C++
1
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
||||||||||||||||
06.06.2021, 23:18 | 9 | |||||||||||||||
Сообщение было отмечено Serg1234321 как решение
Решение
ну правильно, так и есть, вот у Вас для блока переопределен boundingRect() и paint() - габариты и отрисовка, и этого вполне достаточно для блока, думаю для него не стоит определять события для мыши.
то имеем (схематически) класс блока
1
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
|||||||||||
06.06.2021, 23:34 [ТС] | 10 | ||||||||||
sdf45, премного благодарен, думаю, у меня получится использовать данные наработки!
возникли еще некоторые вопросы, в основном касательно запрета перемещения при столкновении блоков: Кликните здесь для просмотра всего текста
1-й вопрос, касательно положения курсора. изначально я хотел при столкновении запрещать движение посредством того, чтобы возвращать курсор в положение до столкновения. но у меня возникли проблемы с глобальными координатами курсора и координатами сцены (условно, столкновение произошло в точке сцены 0х0, в таком случае, курсор выкидывало за сцену в 0х0 монитора), поэтому сделал костыль:
2-й вопрос, я думаю, что существуют методы, запрещающие движение по какой либо из координат в +(-). к сожалению, найти таких мне не удалось. но здесь, возникает вопрос о том, как, и по какому событию возвращать права на движение
0
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
||||||
07.06.2021, 00:08 | 11 | |||||
mapToScene(event->pos()).x() попробуйте так, и это же и есть координаты курсора.
попробуйте выводить интерисующие данные в qDebug(а я частенько вывожу в какойнить QTextEdit а то и вовсе в setWindowTitle(QString::number(mapToScene(event->pos()).x() )) как-то так) Добавлено через 1 минуту и кстати event->scenePos().x() лутше так Добавлено через 19 минут я про такие не знаю, думаю это самому надо реализовывать примерно так (хотя могу ошибаться, я эту тему только сам начал изучать так что сорри если что )
1
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
||||||
07.06.2021, 00:08 [ТС] | 12 | |||||
sdf45, qDebug'ом пользуюсь постоянно, отслеживаю в нем все подряд с чем возникают проблемы, порой полезно просто посмотреть какую информацию в себе хранит тот или иной объект
и прошу прощения за вопрос касательно mapToScene. вчера уже под ночь сидел с этим, очень много всего перепробовал и почему то не получалось. сейчас за пару минут:
не думаю, что я действительно мог не попробовать сразу так сделать... невероятно sdf45, большое спасибо, Ваши ответы помогли решить многие мои вопросы! ЗЫ скоро будут вопросы касательно реализации "стыковок"
1
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
|
07.06.2021, 00:11 | 13 |
всегда рад помочь
1
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
|||||||||||||||||||||||||||||||
10.06.2021, 10:06 [ТС] | 14 | ||||||||||||||||||||||||||||||
Здравствуйте.
Пытаюсь создать класс детали, в котором (внутри) буду создавать группу блоков, но что то никак до меня не дойдет что я делаю не так. Конечно с QGraphicsItemGroup я работаю впервые. Я думал получится так: внутри класса создали указатель на QGraphicsItemGroup создали 2 блока, задали им координаты добавили эти блоки в группу. Но что то я видимо не так понял... .h Кликните здесь для просмотра всего текста
.cpp Кликните здесь для просмотра всего текста
Вызов с кнопки: Кликните здесь для просмотра всего текста
судя по дебагу блоки то добавляются... не пойму совсем "процедурно", вроде бы получилось, но я хочу получать объект класса, и дописывать ему свои методы... вызов с кнопки: Кликните здесь для просмотра всего текста
Добавлено через 3 часа 45 минут пардоньте. вопрос снимаю. вроде как разобрался но все же, любые рекомендации, или подсказки где можно сделать лучше - приветствуются! как сделал: .h Кликните здесь для просмотра всего текста
.cpp Кликните здесь для просмотра всего текста
черновые версии
0
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
||||||||||||||||||||||||||
10.06.2021, 17:23 | 15 | |||||||||||||||||||||||||
несовсем понял проблему, ну так как решилось - и ладно
Я похоже сделал, с Вашего кода скопипастил отрисовку, задается геометрия детали в сетке 3х3, деталь двигается мышкой. Можно тетрис зафигачить Сорри за эту простыню, как сделать чтобы блок кода сворачивался? Сделал обработку мыши в классе детали-но по феншую, имхо, надо бы в кастомной сцене ловить. Ну и, геометрию задавать массивом - наверное не очень красиво, но больше ничего не придумалось. block.h
https://www.cyberforum.ru/atta... 1623334974
0
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
||||||
10.06.2021, 18:24 | 16 | |||||
mainwindow.cpp очепятался
main.cpp дефолтный. Добавлено через 15 минут и тут ерунду конечно написал костыли
_blocks.append(new block(x*30, y*30)); без auto и так далее либо в классе детали определить размеры блока, чет у меня разум за ум зашол уже Добавлено через 19 минут если кто из спецов это читает, как кастануть мой класс (block) в QGraphicsItem? методом тыка пробовал static_cast, dynamic_cast, qgraphics_cast но видимо надо выпрямитель для рук, ничего не вышло
0
|
фрилансер
5838 / 5358 / 1102
Регистрация: 11.10.2019
Сообщений: 14,324
|
|
10.06.2021, 18:30 | 17 |
sdf45, а зачем явно кастить, он же потомок? Что именно не получилось ?
0
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
||||||||||||||||
10.06.2021, 18:42 [ТС] | 18 | |||||||||||||||
sdf45, здравствуйте
я реализовал вот так (пока тоже довольно черновые варианты): block и тд - старые прототип детали.h Кликните здесь для просмотра всего текста
прототип детали.cpp Кликните здесь для просмотра всего текста
вызов с кнопки: Кликните здесь для просмотра всего текста
картинка прилагается но, тут один важный вопрос появляется. если раньше можно было "стыковать" блоки 1х1 с помощью scene()->collidingItems(this), то теперь у нас есть QGraphicsItemGroup, и если деталь неправильной формы (как у Вас, или как у меня на скрине) - то данный подход кажется не получится использовать, т.к. QGraphicsItemGroup вернет нам форму (не уверен что правильно называю это) квадрата (как если бы матрица была заполнена 3х3) возможно, существуют способы вернуть форму, отличную от овала или прямоугольника? не знаю даже, я думал о том, что возможно, придется писать собственные методы для проверки на столкновение, наезды, стыковки, но что то ничего умного не придумал здесь еще добавляется вопрос о том, что несколько деталей могут образовывать дополнительные "неправильные" формы, и каждое столкновение нужно рассматривать по типу: каждый блок (из которого набирается наша деталь) каким то волшебством должна "ощущать" столкновение с блоками (!именно блоками) другой (сборной из блоков) детали, и "упираться", либо допускать стыковку, и в этом случае проверять возможность стыковки следующего блока этой детали. пока это лучшее, что удалось придумать. реализацией пока не занимался. но думаю, дополнительно в поле "геометрии - стыкуемости" (матрица) детали - нужно хранить центральные точки каждого блока, из которого состоит деталь Не по теме: ЗЫ в спойлер оборачивать - на панельке кнопочка +
0
|
15 / 11 / 4
Регистрация: 03.08.2019
Сообщений: 209
|
|
10.06.2021, 18:47 [ТС] | 19 |
Не по теме: ЗЫ ЗЫ а как картинку то выложить?
0
|
1081 / 685 / 184
Регистрация: 30.03.2021
Сообщений: 2,138
|
||||||
10.06.2021, 18:53 | 20 | |||||
простите это я уже черте-что понавыдумывал, вся моя проблема вот тут вот
Добавлено через 6 минут немножко позжее попробую разобраться, надо тестить, сейчас немогу сказать, сорри
0
|
10.06.2021, 18:53 | |
10.06.2021, 18:53 | |
Помогаю со студенческими работами здесь
20
3D Конструктор в стиле лего с облетом камеры Игрушка Игрушка Игрушка Игрушка на с++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |