Рисуем спрайт на спрайте

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Рисуем спрайт на спрайте

Сообщение Don Leno » 19.02.2019 (Вт) 19:53

Написал простенький класс для своих спрайтов (исходник ниже). Теперь задался вопросом как мне отрисовать на одном спрайте другой? К примеру:

Код: Выделить всё
Dim Spr1 asw New Sprite
Dim Spr2 asw New Sprite

Spr1.Draw Spr2


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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Рисуем спрайт на спрайте

Сообщение Mikle » 19.02.2019 (Вт) 22:39

Don Leno писал(а):как достучаться до их массивов?

Вычисляешь область пересечения приёмника и источника, построчно вызываешь CopyMemory, передавая туда ByVal указатели, как например вычисляется указатель в SR2D:
Код: Выделить всё
Public Property Get DataPTR(ByVal x As Long, ByVal y As Long) As Long
  DataPTR = VarPtr(cBuf(x + y * meWidth))
End Property

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Рисуем спрайт на спрайте

Сообщение Don Leno » 20.02.2019 (Ср) 6:20

Спс Mikle. Обязательно воспользуюсь! А есть еще какие нитб альтернативные варианты? Спрашиваю интереса ради. Кстати я написал сабу Draw но если закинуть ее в мой главный цикл сжирает сразу аж 80 фпс!!! Ужас!

У меня проблема выскакивает ошибка если метод применить на еще не созданом спрайте, ведь тогда массив не инициализируется и выкидывает сообщение "нижний индекс вне диапозона". Как не допустить такой ошибки. Есть возможность проверить создан ли спрайт прежде чем с ним работать?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Рисуем спрайт на спрайте

Сообщение Mikle » 20.02.2019 (Ср) 22:30

Don Leno писал(а):У меня проблема выскакивает ошибка если метод применить на еще не созданом спрайте, ведь тогда массив не инициализируется и выкидывает сообщение "нижний индекс вне диапозона". Как не допустить такой ошибки. Есть возможность проверить создан ли спрайт прежде чем с ним работать?

Возможность есть, но нужно ли это? Если идёт обращение к неинициализированному спрайту, значит что-то недосмотренно в программе, так быть не должно.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Рисуем спрайт на спрайте

Сообщение Don Leno » 21.02.2019 (Чт) 5:20

Я просто думал отлавливать данную ошибку и выводить мессенджбокс с сообщением "экземпляр спрайта не был создан!" Или тп. А все таки как делается подобная проверка? Или это слишком сложно?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Рисуем спрайт на спрайте

Сообщение Mikle » 21.02.2019 (Чт) 8:20

Don Leno писал(а):Я просто думал отлавливать данную ошибку и выводить мессенджбокс с сообщением "экземпляр спрайта не был создан!" Или тп.

Это можно сделать с помощью On Local Error в процедуре Draw.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Рисуем спрайт на спрайте

Сообщение The trick » 21.02.2019 (Чт) 9:13

Don Leno писал(а):Я просто думал отлавливать данную ошибку и выводить мессенджбокс с сообщением "экземпляр спрайта не был создан!" Или тп. А все таки как делается подобная проверка? Или это слишком сложно?

Да просто изначально создавай спрайт 1x1 пиксел в Class_Initialize и не будет возникать такой ошибки.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Рисуем спрайт на спрайте

Сообщение Mikle » 21.02.2019 (Чт) 9:24

The trick писал(а):Да просто изначально создавай спрайт 1x1 пиксел в Class_Initialize и не будет возникать такой ошибки.

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

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Рисуем спрайт на спрайте

Сообщение The trick » 21.02.2019 (Чт) 9:32

Mikle писал(а):Я так сделал в SR2D, но иногда сомневаюсь в этом решении. Если я допускаю ошибку, забываю где-то загрузить изображение, то программа работает, как ни в чем не бывало, но результат неверный и это не всегда явно видно.

Такой подход используется в GDI, там при создании DC в него автоматом выбирается монохромный битмап 1x1 пиксель:
Note: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it. If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap. To create a color bitmap, use the HDC that was used to create the memory device context, as shown in the following code:

Ссылка.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Рисуем спрайт на спрайте

Сообщение Don Leno » 21.02.2019 (Чт) 18:31

Так по мне msgbox вызывать лучше. Так я узнаю о своей ошибке. Потом можно вообще эту функцию удалить за ненадобностью... спс всем))

Mikle, так?
Код: Выделить всё
On Local Error Goto Err

Err:
msgbox "No Create Sprite!"

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Рисуем спрайт на спрайте

Сообщение Mikle » 21.02.2019 (Чт) 20:09

Don Leno писал(а):так?

Так. Точнее так:
Код: Выделить всё
Sub Draw ()
  On Local Error Goto Err
  ' Здесь рисуем
  Exit Sub
Err:
  ' Анализируем причины ошибки
  msgbox "Причина ошибки"
EndSub


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList