FreeBasic
Главная
Вход
Регистрация
Среда, 24.04.2024, 20:11Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Freebasic » Вопросы по языку FreeBasic » Спрайты (Спрайты и всё что с ними связано)
Спрайты
RoloverДата: Пятница, 19.07.2013, 23:38 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Не знаю даже как начать. И так есть графический экран пока что черного цвета. Есть картинка примитив 20x20 нарисована в paint. Согласно уроков с сайта, по программированию игр, спрайты загружаются в невидимый экран  потом с помощью GET разрезаются и сохраняются по заранее определенным указателям (теперь хоть понятно для чего они эти указатели smile ) при этом фон тоже вырезается и сохраняются в память по  указателю
Воросы

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 след уже не остаётся, а картинка начинает помигивать периодически, терь
понятно зачем буферизация ...ни в коем случае я не усомнился в уроках smile
Вопросы

2 Ну с одним спрайтом понятно, а вот когда фон появится всегда нужно использовать команду CLS в цикле т.е. стираем вообще все и спрайт и фон, а потом рисуем заново но спрайт с новыми координатами?
Или есть вариации чтобы только стирать спрайт, а фон оставался постоянно??


Объяснив другому, поймешь, что понял сам.

Сообщение отредактировал Rolover - Пятница, 19.07.2013, 23:41
 
haavДата: Суббота, 20.07.2013, 08:46 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Привет Rolover!

Цитата (Rolover)
нужно ли всегда загружать изображение в невидимый экран и потом его оттуда с помощью вырезания копировать в память?


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

Цитата (Rolover)
НО можно ли картинку разрезать сразу в памяти ???


Стандартными встроенными средствами нет. Bload грузит картинку целиком. Другое дело, если изучить формат BMP и загружать своими кустарными средствами, то можно.

Цитата (Rolover)
Ну с одним спрайтом понятно, а вот когда фон появится всегда нужно использовать команду CLS в цикле т.е. стираем вообще все и спрайт и фон, а потом рисуем заново но спрайт с новыми координатами?
Или есть вариации чтобы только стирать спрайт, а фон оставался постоянно??


CLS необходим.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Воскресенье, 21.07.2013, 13:28 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Процессы и вывод спрайтов на экран.

Скажите пожалуйста, вот когда нужно вывести несколько спрайтов на экран. Например одновременно двигающихся 2 и более спрайта, причем у каждого свой маршрут движения не зависимый от других,  при этом нужно использовать процессы? Или сами процессы к этому отношение не имеют и применяются для решения задач совершенно иного рода??

И вообще, процессы применяются в создании игр, если да, то в каких случаях?


Объяснив другому, поймешь, что понял сам.

Сообщение отредактировал Rolover - Воскресенье, 21.07.2013, 14:00
 
haavДата: Воскресенье, 21.07.2013, 18:59 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Ну как бы я считаю процессом отдельно выполняемую программу. Игра подходит под это определение. Для рисования графики (в том числе анимированной), проигрывания музыки , видео и пр. дополнительный процесс не требуется. Конечно есть исключения, когда необходим дополнительный создаваемый процесс, например для многопользовательской сетевой игры...

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Понедельник, 22.07.2013, 19:59 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Спасибо за объяснения  о процессах в программе. Успокоили если честно smile
Возник очередной вопрос...Меня интересует возможность реализации игрового меню ну например типа пунктов меню, ну там ИГРАТЬ, ПРАВИЛА, ВЫХОД при наведении на них курсора мышки чтобы как-то выделялись ну и соответственно при нажатии левой кнопки мышки срабатывали. Так вот вопрос

Возможна ли реализация обработка событий, типа как в DOM JavaScript (извиняюсь за сравнение если кого обидел) ну например программа проверяет находится ли указатель мышки над данным объектом и тогда сменить изображение объекта (например выделить кнопку), а если произойдет клик выполнить процедуру или функцию .......

Или все же нужно вычислять по координатно находится ли курсор в области между х1.... х2  и y1....y2 тогда сменить  изображение кнопки и т.д.


Объяснив другому, поймешь, что понял сам.

Сообщение отредактировал Rolover - Понедельник, 22.07.2013, 20:00
 
haavДата: Понедельник, 22.07.2013, 19:59 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Что-то похожее я писал: http://free-basic.ru/simpleclassmenu.html

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Понедельник, 22.07.2013, 20:00 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Спрайты В зашифрованном виде или в теле программы..такой вариант возможен ??

Имеется ли возможность "компиляции" *.bmp файлов или включение их в тело программы.... Или только вариант через POINT? ну в смысле прорисовка каждого пикселя кодом.. тогда только это можно скомпилировать в отдельный файл как библиотеку или включить в тело программы при компиляции.


Объяснив другому, поймешь, что понял сам.

Сообщение отредактировал Rolover - Понедельник, 22.07.2013, 20:02
 
haavДата: Понедельник, 22.07.2013, 20:43 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (Rolover)
Спрайты В зашифрованном виде или в теле программы..такой вариант возможен ??

Имеется ли возможность "компиляции" *.bmp файлов или включение их в тело программы.... Или только вариант через POINT? ну в смысле прорисовка каждого пикселя кодом.. тогда только это можно скомпилировать в отдельный файл как библиотеку или включить в тело программы при компиляции.


Вот этот инструмент может записать графический файл в ресурсы программы.

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

Есть и более сложный вариант с помощью ассемблерных вставок, помещая все файлы в секцию данных EXE файла. Но при этом варианте изучение формата BMP необходимо. Этот способ так же не защитит от умелых рук.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Четверг, 25.07.2013, 19:01 | Сообщение # 9
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Есть проблема со спрайтами.
И так представьте себе простую вещь, спрайт на 3 вида... а точнее вращение предмета. Соответственно в память
вам нужно загрузить эти 3 вида, и где-то там в цикле с помощью счетчиков каждый из них выводить.. ну одним словом когда предмет движется то он вращается.. .Это все красиво и замечательно. Кусочек кода. Про оптимизацию речь не идет smile

Код
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-я свойствами это внешний вид smile 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Ага а дальше обращение к картинке через указатель на класс картинок ???

Код
Obj_1 -> ci -> vid1  'например
Чет сильно PHP напоминает ))) особенно с его объявлением экземпляров класса  типа $obj = new Class()


Объяснив другому, поймешь, что понял сам.
 
haavДата: Суббота, 27.07.2013, 07:59 | Сообщение # 12
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (Rolover)
Ага а дальше обращение к картинке через указатель на класс картинок ???

Код
Obj_1 -> ci -> vid1 'например


Хоть в общем коде, хоть в объектах достаточно будет и так:

Код
ci -> vid1


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Суббота, 27.07.2013, 16:31 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Спасибо большое за уроки и примеры 
Цитата (haav)
Хоть в общем коде, хоть в объектах достаточно будет и так:Код
ci -> vid1

да да .. Это я уже понял сегодня )))) пораскинув мозгами  biggrin с этими указателями пока не очень улавливаю, что к чему. Но! Тут идея была? почему просто не использовать указатель сi,  что бы просто картинки доставать, а всё остальное через класс Obj и зачем их связывать.....через ci ....и тут понял!
1. Ну во первых эти 2 класса не могут существовать каждый автономно.. по крайней мере Obj не может без ClassImage соответственно связь тут сильная
2. Ну и если в классе Obj захочется сделать метод управляющий теми самыми видами... то тут без связки через ci  ну ни как!!


Объяснив другому, поймешь, что понял сам.
 
haavДата: Суббота, 27.07.2013, 18:51 | Сообщение # 14
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (Rolover)
да да .. Это я уже понял сегодня )))) пораскинув мозгами biggrin с этими указателями пока не очень улавливаю, что к чему. Но! Тут идея была? почему просто не использовать указатель сi, что бы просто картинки доставать, а всё остальное через класс Obj и зачем их связывать.....через ci ....и тут понял!
1. Ну во первых эти 2 класса не могут существовать каждый автономно.. по крайней мере Obj не может без ClassImage соответственно связь тут сильная
2. Ну и если в классе Obj захочется сделать метод управляющий теми самыми видами... то тут без связки через ci ну ни как!!


Так данный пример был просто в образовательных целях. В конце концов я ведь не знаю ни конечную цель, ни цели каждого отдельного класса. Я писал свой код на основе примера, который был приведен и исходя из заданного вопроса. Вовсе можно не связывать класс Obj с классом ClassImage, если в нем не будет обращения к изображениям. Но даже если будет, можно расшарить класс ClassImage и вести обращение к его внутренностям по глобальному указателю.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Воскресенье, 28.07.2013, 00:12 | Сообщение # 15
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Скорость Игры.
Не могу понять, есть цикл Do...Loop ну в нем как всегда отрисовка пересчет и sleep(15,1) типа притормаживание на 15 мсек
Так вот, заметил, что при такой скорости  спрайты движутся нормальненько так жвавенько ...а вот стоит только поставить 16 в место 15 ....sleep(16,1)
Так так все начинает притормаживать причем это как бы ступеньками с  sleep(1,1)...sleep(15,1) одна скорость
с sleep(16,1)....sleep(31,1) другая скорость и т.д.

Это что с разрядностью системы связано?


Объяснив другому, поймешь, что понял сам.
 
Форум » Freebasic » Вопросы по языку FreeBasic » Спрайты (Спрайты и всё что с ними связано)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: