Спрайты
|
|
Rolover | Дата: Пятница, 19.07.2013, 23:38 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Не знаю даже как начать. И так есть графический экран пока что черного цвета. Есть картинка примитив 20x20 нарисована в paint. Согласно уроков с сайта, по программированию игр, спрайты загружаются в невидимый экран потом с помощью GET разрезаются и сохраняются по заранее определенным указателям (теперь хоть понятно для чего они эти указатели ) при этом фон тоже вырезается и сохраняются в память по указателю Воросы
1. нужно ли всегда загружать изображение в невидимый экран и потом его оттуда с помощью вырезания копировать в память? Ведь можно с помощью Bload сразу загрузить по нужному указателю
Про много спрайтовые объекты типа война, да я понимаю проще загрузить один файл целиком и потом его разрезать чем загружать каждый по отдельности.
НО можно ли картинку разрезать сразу в памяти ???
Теперь самое прикольное, вывод картинки на экран с помощью PUT в цикле, но и соответственно опрос клавиш управления и т.д. если не использовать ScreenSet и ScreenLock, приведу код цикла (экран не буферизируется ни как ) и обратите внимание на метод вывода PUT .....Trans Код Do Put (korzina.x,korzina.y),spryte_korziny,Trans sleep(5,1) IF MultiKey(SC_RIGHT) THEN korzina.x+=korzina.speed IF korzina.x >=580 THEN korzina.x = 580 IF MultiKey(SC_LEFT) THEN korzina.x-=korzina.speed IF korzina.x <=0 THEN korzina.x = 0 Loop Until Multikey(SC_ESCAPE) так вот объект выводится но при этом при его перемещении в право в лево на экране остаётся полоска "след" хорошо, вводим в цикл CLS след уже не остаётся, а картинка начинает помигивать периодически, терь понятно зачем буферизация ...ни в коем случае я не усомнился в уроках Вопросы
2 Ну с одним спрайтом понятно, а вот когда фон появится всегда нужно использовать команду CLS в цикле т.е. стираем вообще все и спрайт и фон, а потом рисуем заново но спрайт с новыми координатами? Или есть вариации чтобы только стирать спрайт, а фон оставался постоянно??
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Пятница, 19.07.2013, 23:41 |
|
| |
haav | Дата: Суббота, 20.07.2013, 08:46 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Привет Rolover!
Цитата (Rolover) нужно ли всегда загружать изображение в невидимый экран и потом его оттуда с помощью вырезания копировать в память?
Нет конечно, зависит только от программиста. Если спрайты или фон уже готовые ( нарезанные в самих файлах) , то загружаются для удобства в цикле, каждый под своим указателем.
Цитата (Rolover) НО можно ли картинку разрезать сразу в памяти ???
Стандартными встроенными средствами нет. Bload грузит картинку целиком. Другое дело, если изучить формат BMP и загружать своими кустарными средствами, то можно.
Цитата (Rolover) Ну с одним спрайтом понятно, а вот когда фон появится всегда нужно использовать команду CLS в цикле т.е. стираем вообще все и спрайт и фон, а потом рисуем заново но спрайт с новыми координатами? Или есть вариации чтобы только стирать спрайт, а фон оставался постоянно??
CLS необходим.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Воскресенье, 21.07.2013, 13:28 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Процессы и вывод спрайтов на экран.
Скажите пожалуйста, вот когда нужно вывести несколько спрайтов на экран. Например одновременно двигающихся 2 и более спрайта, причем у каждого свой маршрут движения не зависимый от других, при этом нужно использовать процессы? Или сами процессы к этому отношение не имеют и применяются для решения задач совершенно иного рода??
И вообще, процессы применяются в создании игр, если да, то в каких случаях?
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Воскресенье, 21.07.2013, 14:00 |
|
| |
haav | Дата: Воскресенье, 21.07.2013, 18:59 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Ну как бы я считаю процессом отдельно выполняемую программу. Игра подходит под это определение. Для рисования графики (в том числе анимированной), проигрывания музыки , видео и пр. дополнительный процесс не требуется. Конечно есть исключения, когда необходим дополнительный создаваемый процесс, например для многопользовательской сетевой игры...
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Понедельник, 22.07.2013, 19:59 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Спасибо за объяснения о процессах в программе. Успокоили если честно Возник очередной вопрос...Меня интересует возможность реализации игрового меню ну например типа пунктов меню, ну там ИГРАТЬ, ПРАВИЛА, ВЫХОД при наведении на них курсора мышки чтобы как-то выделялись ну и соответственно при нажатии левой кнопки мышки срабатывали. Так вот вопрос
Возможна ли реализация обработка событий, типа как в DOM JavaScript (извиняюсь за сравнение если кого обидел) ну например программа проверяет находится ли указатель мышки над данным объектом и тогда сменить изображение объекта (например выделить кнопку), а если произойдет клик выполнить процедуру или функцию .......
Или все же нужно вычислять по координатно находится ли курсор в области между х1.... х2 и y1....y2 тогда сменить изображение кнопки и т.д.
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Понедельник, 22.07.2013, 20:00 |
|
| |
haav | Дата: Понедельник, 22.07.2013, 19:59 | Сообщение # 6 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Что-то похожее я писал: http://free-basic.ru/simpleclassmenu.html
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Понедельник, 22.07.2013, 20:00 | Сообщение # 7 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Спрайты В зашифрованном виде или в теле программы..такой вариант возможен ??
Имеется ли возможность "компиляции" *.bmp файлов или включение их в тело программы.... Или только вариант через POINT? ну в смысле прорисовка каждого пикселя кодом.. тогда только это можно скомпилировать в отдельный файл как библиотеку или включить в тело программы при компиляции.
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Понедельник, 22.07.2013, 20:02 |
|
| |
haav | Дата: Понедельник, 22.07.2013, 20:43 | Сообщение # 8 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата (Rolover) Спрайты В зашифрованном виде или в теле программы..такой вариант возможен ??
Имеется ли возможность "компиляции" *.bmp файлов или включение их в тело программы.... Или только вариант через POINT? ну в смысле прорисовка каждого пикселя кодом.. тогда только это можно скомпилировать в отдельный файл как библиотеку или включить в тело программы при компиляции.
Вот этот инструмент может записать графический файл в ресурсы программы.
Можно взять этот принцип и записать все спрайты в один архив. С этим архивом можно делать что хочешь (зашифровать каким-то алгоритмом, сжать и пр.) . В принципе даже если не криптовать и не сжимать файл, вряд ли кто-то будет тырить спрайты. Но уж если кому понадобится их стырить, то никакое шифрование не поможет, поскольку всегда можно сделать дамп памяти и вытащить все необходимое.
Есть и более сложный вариант с помощью ассемблерных вставок, помещая все файлы в секцию данных EXE файла. Но при этом варианте изучение формата BMP необходимо. Этот способ так же не защитит от умелых рук.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Четверг, 25.07.2013, 19:01 | Сообщение # 9 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Есть проблема со спрайтами. И так представьте себе простую вещь, спрайт на 3 вида... а точнее вращение предмета. Соответственно в память вам нужно загрузить эти 3 вида, и где-то там в цикле с помощью счетчиков каждый из них выводить.. ну одним словом когда предмет движется то он вращается.. .Это все красиво и замечательно. Кусочек кода. Про оптимизацию речь не идет
Код Dim as Any Pointer vid1, vid2, vid3
vid1 = ImageCreate(20,20) vid2 = ImageCreate(20,20) vid3 = ImageCreate(20,20)
Bload("*.bmp", vid1) Bload("*.bmp", vid2) Bload("*.bmp", vid3) А теперь классы! Вот собственно тут и начинается проблема из-за недопонимания. Как я это все представляю.... простой класс с 3-я свойствами это внешний вид vid1, vid2, vid3
И один метод - это движение объект перемещается
Класс (это шаблон). Т.е. по сути я могу объявлять объекты (спрайты) и это будут экземпляры класса... и могу объявить сока угодно много )))
Код Type Obj x As Short ' координата Х y As Short ' координата Y speed as Byte ' скорость
Declare Sub Move() ' движение Declare Constructor() ' конструктор Declare Destructor() ' деструктор End Type
Constructor Obj() Dim as Any Pointer vid1, vid2, vid3
vid1 = ImageCreate(20,20) vid2 = ImageCreate(20,20) vid3 = ImageCreate(20,20)
Bload("*.bmp", vid1) Bload("*.bmp", vid2) Bload("*.bmp", vid3) End Constructor
Destructor Obj() ImageDestroy(vid1) ImageDestroy(vid2) ImageDestroy(vid3) End Destructor
Sub Obj.Move() this.x += this.speed End Sub За this. извиняюсь... понятно, что можно было бы и без него, но мне с ним понятнее сразу видно, что обращение идет к свойству класса, а не к переменной метода..Ой я что-то отвлекся....
и так создадим 2 объекта
Код Dim Spryte1 as Obj Dim Spryte2 as Obj Так вот при создании одного экземпляра класса, в памяти создадутся те самые 3 вида вращения, Отработает конструктор.. НО!!! при создании 2 экземпляра они опять что ли будут создаваться??? Если да, и я все понял правильно, то как этого избежать??? как сделать правильно.. что бы создать их один раз и потом при очередном создании экземпляра класса, чтобы они больше не создавались
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Четверг, 25.07.2013, 19:09 |
|
| |
haav | Дата: Четверг, 25.07.2013, 22:10 | Сообщение # 10 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата НО!!! при создании 2 экземпляра они опять что ли будут создаваться???
Верно. Цитата Если да, и я все понял правильно, то как этого избежать??? как сделать правильно.. что бы создать их один раз и потом при очередном создании экземпляра класса, чтобы они больше не создавались
Я думаю, что сказать как сделать правильно, вряд ли кто-то сможет. Нет четких расписанных правил в стиле написания кода, есть только предпочтения и у всех они разные.
Я расскажу, как сделал бы я.
Нужно создать отдельный класс для инициализации\деинициализации хендлов изображений. В нем создавать, загружать и удалять изображения. Другие вещи, строго приватные для каждого создаваемого объекта (например его скорость, координаты, метод движения и пр.) вынести в отдельный класс.
Что-то типа этого:
Код '{ класс изображений
Type ClassImage As Any Pointer vid1, vid2, vid3 Declare Constructor() ' конструктор Declare Destructor() ' деструктор End Type
Constructor ClassImage()
vid1 = ImageCreate(20,20) vid2 = ImageCreate(20,20) vid3 = ImageCreate(20,20)
BLoad("*.bmp", vid1) BLoad("*.bmp", vid2) BLoad("*.bmp", vid3) End Constructor
Destructor ClassImage() If vid1<>0 Then ImageDestroy(vid1) EndIf If vid2<>0 Then ImageDestroy(vid2) EndIf If vid3<>0 Then ImageDestroy(vid3) EndIf End Destructor
'}
'{ класс объектов
Type Obj ci As ClassImage Ptr x As Short ' координата Х y As Short ' координата Y speed As Byte ' скорость Declare Sub Move() ' движение Declare Constructor(As ClassImage Ptr) ' конструктор End Type
Constructor obj(ci As ClassImage Ptr) this.ci = ci End Constructor
Sub Obj.Move() this.x += this.speed End Sub
'}
' создаем класс изображений один раз и ' далее можем использовать в любых объектах Dim ci As ClassImage Ptr = New ClassImage
' создаем классы объектов dim obj_1 As Obj Ptr = New obj(ci) Dim obj_2 As Obj Ptr = New obj(ci)
' удаляем объекты Delete obj_1 Delete obj_2 Delete ci
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Пятница, 26.07.2013, 22:45 | Сообщение # 11 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Ага а дальше обращение к картинке через указатель на класс картинок ???
Код Obj_1 -> ci -> vid1 'например Чет сильно PHP напоминает ))) особенно с его объявлением экземпляров класса типа $obj = new Class()
Объяснив другому, поймешь, что понял сам.
|
|
| |
haav | Дата: Суббота, 27.07.2013, 07:59 | Сообщение # 12 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата (Rolover) Ага а дальше обращение к картинке через указатель на класс картинок ???
Код Obj_1 -> ci -> vid1 'например
Хоть в общем коде, хоть в объектах достаточно будет и так:
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Суббота, 27.07.2013, 16:31 | Сообщение # 13 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Спасибо большое за уроки и примеры Цитата (haav) Хоть в общем коде, хоть в объектах достаточно будет и так:Код ci -> vid1 да да .. Это я уже понял сегодня )))) пораскинув мозгами с этими указателями пока не очень улавливаю, что к чему. Но! Тут идея была? почему просто не использовать указатель сi, что бы просто картинки доставать, а всё остальное через класс Obj и зачем их связывать.....через ci ....и тут понял! 1. Ну во первых эти 2 класса не могут существовать каждый автономно.. по крайней мере Obj не может без ClassImage соответственно связь тут сильная 2. Ну и если в классе Obj захочется сделать метод управляющий теми самыми видами... то тут без связки через ci ну ни как!!
Объяснив другому, поймешь, что понял сам.
|
|
| |
haav | Дата: Суббота, 27.07.2013, 18:51 | Сообщение # 14 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата (Rolover) да да .. Это я уже понял сегодня )))) пораскинув мозгами biggrin с этими указателями пока не очень улавливаю, что к чему. Но! Тут идея была? почему просто не использовать указатель сi, что бы просто картинки доставать, а всё остальное через класс Obj и зачем их связывать.....через ci ....и тут понял! 1. Ну во первых эти 2 класса не могут существовать каждый автономно.. по крайней мере Obj не может без ClassImage соответственно связь тут сильная 2. Ну и если в классе Obj захочется сделать метод управляющий теми самыми видами... то тут без связки через ci ну ни как!!
Так данный пример был просто в образовательных целях. В конце концов я ведь не знаю ни конечную цель, ни цели каждого отдельного класса. Я писал свой код на основе примера, который был приведен и исходя из заданного вопроса. Вовсе можно не связывать класс Obj с классом ClassImage, если в нем не будет обращения к изображениям. Но даже если будет, можно расшарить класс ClassImage и вести обращение к его внутренностям по глобальному указателю.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Воскресенье, 28.07.2013, 00:12 | Сообщение # 15 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Скорость Игры. Не могу понять, есть цикл Do...Loop ну в нем как всегда отрисовка пересчет и sleep(15,1) типа притормаживание на 15 мсек Так вот, заметил, что при такой скорости спрайты движутся нормальненько так жвавенько ...а вот стоит только поставить 16 в место 15 ....sleep(16,1) Так так все начинает притормаживать причем это как бы ступеньками с sleep(1,1)...sleep(15,1) одна скорость с sleep(16,1)....sleep(31,1) другая скорость и т.д.
Это что с разрядностью системы связано?
Объяснив другому, поймешь, что понял сам.
|
|
| |
|