ООП вложение/наследование объектов логики/аппаратной обработки

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Делаю подобие игрушки, в основе 2D спрайты, которые движутся по нарисованному фону, каждое отображение спрайта по факту это передача на дисплей растра изображения по SPI DMA из памяти. Не могу сообразить как правильно/логично сделать вложение объектов, вижу несколько вариантов:

1. Сделать начальный класс с примитивами работы с "железом" - передача данных по SPI, каждый следующий класс (спрайт или фон или текстовая надпись) уже наследовать от этого начального класса.
Не очень мне нравиться вариант - хотелось бы отделить логику от "железа".

2. Сделать в main модуле внешние callback функции работы с SPI, в каждом создаваемом объекте прописать void * адрес на нее и соответственно вызывать по мере надобности.
Как то не красиво это будет смотреться в main.cpp :(

Как правильно реализуется подобный механизм?

 

rkit
Offline
Зарегистрирован: 23.11.2016

Не надо ничего наследовать. Объяви экземпляр класса глобальной переменной и всё.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

хм....те как то так?:
 

// в main.cpp объявляю парочку обьектов глобальных
f303mc mymc;
spitft mydysplay;
// а уже где то внутри логического объекта обращаюсь к их функции
sprite::show() {
mydisplay.sendbuffer(this->pointerMem);
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

При инициализации класса передать функцию sendbuffer...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

направление понятно, спасибо, буду пробовать.

b707
Offline
Зарегистрирован: 26.05.2017

andycat, а вы обьекты напрямую в дисплей передаете или сначала в буфере в памяти рисуете?

Я бы сделал так - обЪекты рисовал в экранном буфере и сделал независимыми от железа вовсе. А для работы с дисплеем создал отдельный класс, который просто сбрасывал бы в дисплей буфер экрана без оглядки на содержимое

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

andycat, а вы обьекты напрямую в дисплей передаете или сначала в буфере в памяти рисуете?

в зависимости от ситуации, фоновый рисунок целиком из flash памяти в экран, спрайт сначала в буфер, прозрачный цвет, например 0x0000, заменяю пикселями с фоновой картинки и потом уже буфер в экран.

rkit
Offline
Зарегистрирован: 23.11.2016

andycat пишет:

f303mc mymc;
spitft mydysplay;

понятия не имею, как расшифровать эти сочетания букв и цифр

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

rkit пишет:

andycat пишет:

f303mc mymc;
spitft mydysplay;

понятия не имею, как расшифровать эти сочетания букв и цифр

объявление глобальных объектов, пока нет полного кода, напишу позже.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

rkit пишет:

Не надо ничего наследовать. Объяви экземпляр класса глобальной переменной и всё.


Удобно, работает, спасибо!

Morroc
Offline
Зарегистрирован: 24.10.2016

b707 пишет:

Я бы сделал так - обЪекты рисовал в экранном буфере и сделал независимыми от железа вовсе. А для работы с дисплеем создал отдельный класс, который просто сбрасывал бы в дисплей буфер экрана без оглядки на содержимое

Если дисплей цветной и мега328, то это непозволительно долго для игры :( а небольшие спрайты совсем другое дело.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Morroc пишет:

мега328

у меня STM32F303CCT6, быстродействия более чем достаточно, да и Мега думаю справится, соответственно если хочется чтоб спрайты красиво передвигались, буфер все равно нужен под размер спрайта, еще со времен ZX Spectrum так писалось всегда.
ЗЫ. Впрочем я уже закончил "игрушку", мозг потренировал, птичка весело по экрану за червяком летает, крылышками машет.