FreeBasic
Главная
Вход
Регистрация
Пятница, 19.04.2024, 08:11Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум » Freebasic » Вопросы по языку FreeBasic » Спрайты (Спрайты и всё что с ними связано)
Спрайты
haavДата: Воскресенье, 28.07.2013, 12:31 | Сообщение # 16
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (Rolover)
Скорость Игры.
Не могу понять, есть цикл Do...Loop ну в нем как всегда отрисовка пересчет и sleep(15,1) типа притормаживание на 15 мсек
Так вот, заметил, что при такой скорости спрайты движутся нормальненько так жвавенько ...а вот стоит только поставить 16 в место 15 ....sleep(16,1)
Так так все начинает притормаживать причем это как бы ступеньками с sleep(1,1)...sleep(15,1) одна скорость
с sleep(16,1)....sleep(31,1) другая скорость и т.д.

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


А как это тестировалось, на глазок? Хотелось увидеть проект, в котором данное утверждение по скорости ясно бы было видно. Я ничего подобного не замечал. Вот простой пример, который показывает на сколько поставишь тормоз, такая задержка и будет:

Код
Screen 17,32
Color ,&hffffff

Var im = ImageCreate(100,100)

Do
   
  Var t= Timer
  Put (Rnd*500,Rnd*500),im
  Sleep(16)
  cls
  Draw String (10,10), Str(Timer-t),0
   
Loop Until MultiKey(1)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Воскресенье, 28.07.2013, 13:18 | Сообщение # 17
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Вот )))
Ой файлы не отправляются сейчас картинки
Ну в общем подставил ваш код  к себе
Код
            
              Var t= Timer
            sleep(16,1) 'немножко спим
               Draw String (10,10), Str(Timer-t),0         
                 
            Pcopy 'копируем отрисованный экран в видимую область
                     
Loop Until Multikey(SC_ESCAPE)

и получил вот такие результаты в атачах
в первом рисунке 15  во втором 16
У меня только Screen 18,32
Разницы через ScreenSet и Pcopy
ScreenLock  и UnLock особо никакой

Даже смущает не то что оно быстрее или медленнее, то понятно как справляется, а смущает то что при изменении в 1 мсек скорость изменяется в 2 раза .. да  и что тут справляться разница между стартом и  выводом на экран 1 строка пауза blink

А есть какие-от способы искусственного торможения.. не используя sleep ?????
Буду очень признателен
Прикрепления: 2475287.gif (1.2 Kb) · 5321894.gif (2.0 Kb)


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

Сообщение отредактировал Rolover - Воскресенье, 28.07.2013, 14:01
 
haavДата: Воскресенье, 28.07.2013, 14:18 | Сообщение # 18
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
У меня такого как на рисунках не наблюдается, а работает , выводя верные результаты.

Цитата
А есть какие-от способы искусственного торможения.. не используя sleep ?????


Кроме системной айпишки Sleep, я ничего подходящего не знаю. Все кустарные остановки, вроде дополнительных циклов и пр. хрени, может нормально работать на одном компе, и совершенно по другому на другом. Лучше чем ориентироваться на время (а это как раз и делает sleep) я представить не могу.


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

Код
Screen 17,32,2
Color ,&hffffff

ScreenSet 1

Do
      cls
   Var t= Timer
   Sleep(15)

   Draw String (10,10), Str(Timer-t),0
   
     Var e= Timer
   Sleep(16)

   Draw String (10,30), Str(Timer-e),0
    
   sleep(250)  'это чтобы четко заметить  
   Pcopy   
Loop Until MultiKey(1)
кстати в текстовом окне консоли та же ситуация

Ладно пусть останется потомкам для размышления, мож у кого встретится такая же ситуация
Прикрепления: 9954454.gif (1.5 Kb)


Объяснив другому, поймешь, что понял сам.
 
haavДата: Воскресенье, 28.07.2013, 14:48 | Сообщение # 20
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Вот мой результат:

Прикрепления: 1902771.png (1.1 Kb)


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

про оператор sleep
нашел строки
The accuracy of Sleep is variable depending on the OS cycle time (Windows NT/2K/XP: 15 ms, 9x/Me: 50 ms, Linux 10ms, DOS 55 ms).

Точность сна изменяется в зависимости от времени цикла ОС (Windows NT/2K/XP: 15 мс, 9x/Me: 50 мс,  Linux :10 мс  DOS 55 мс).

У меня как раз XP точность 15 мс..и все же ОС влияет biggrin
Время опроса шаг 15 мс так что  что 1...что 15 будет 15
что 16 ..... что 31 будет 30

Добавлено (30.07.2013, 22:52)
---------------------------------------------
ImageDestroy

В уроках написано

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

Хотелось бы уточнить.... одну деталь....Вот когда происходит выход из программы.....
То ImageDestroy Всегда обязательно использовать.. ну подчищать за собой ..или тогда уже все равно?
Просто например выбрал Выход прописал END и все, или все же нужно еще и уничтожать объект???


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

Сообщение отредактировал Rolover - Понедельник, 29.07.2013, 16:39
 
haavДата: Среда, 31.07.2013, 08:07 | Сообщение # 22
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (Rolover)
Хотелось бы уточнить.... одну деталь....Вот когда происходит выход из программы.....
То ImageDestroy Всегда обязательно использовать.. ну подчищать за собой ..или тогда уже все равно?
Просто например выбрал Выход прописал END и все, или все же нужно еще и уничтожать объект???


Если программа завершается, то необязательно, по крайней мере под Windows. За DOS и LINUX точно сказать не могу.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Понедельник, 09.09.2013, 23:52 | Сообщение # 23
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Всем доброго времени суток.
Вопрос.. в базовой конфигурации FB есть понятие слои??
Просто картинки он выводит послойно, а вот возможность управлять ими, слоями, есть???
И еще такой вопрос, есть область карты, географической )))) 
так вот, как известно она не ровная...А надо бы как-то наблюдать курсор в её области... и опять старый вопрос... как-то можно определить нахождение курсора над картинкой ..или все же придется определять вхождение точек... а может есть какой буфер???


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


Слои - это и есть изображения. Управляя изображениями, управляешь слоями.

Цитата (Rolover)
И еще такой вопрос, есть область карты, географической ))))
так вот, как известно она не ровная...А надо бы как-то наблюдать курсор в её области...


Вот это вообще не понял. Курсор по умолчанию виден.

Цитата (Rolover)
как-то можно определить нахождение курсора над картинкой ..или все же придется определять вхождение точек... а может есть какой буфер???


Смотрим функции GetMouse и\или ScreenEvent в справке. Они определяют координаты в окне. А определения мыши над картинками - по сути простые вычисления, исходя из координат мыши и картинки.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
RoloverДата: Вторник, 10.09.2013, 21:52 | Сообщение # 25
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Цитата (Rolover)
Вот это вообще не понял. Курсор по умолчанию виден.
-"Наблюдать курсор в её области"
Имелось ввиду, что при наведении курсора на эту область она бы выделялась или как-то подсвечивалась.
Возьмем карту России...И пальцем в небо.... о!... Свердловская область..
http://www.infokart.ru/wp-content/uploads/2009/10/russia-map.jpg
под Республикой Коми ))))
Так вот, края (граница... периметр...) у этой области ну совсем не прямые линии ....
и соответственно определение, находится точка  с координатами (X ,Y) в данной  области... путём Xmous > X1обл  и  Xmous < X2 обл  а также Ymous>Y1обл     и    Ymous<Y2обл      ну никак не вычислить(простым сравнением)  ..... потому как это ни квадрат ни прямоугольник и даже не круг

сколько точек по Х и по Y в неё входит..?? одним словом чтобы при пересечении периметра этой области с любой стороны хоть на 1 пиксель она уже подсвечивалась

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

А есть второй вариант рассмотрение этой области как картинки в целом....... и тогда уже, просто проверка, находится ли курсор над данной картинкой или нет...не зависимо от координат..вернее мы их не проверяем ... мы констатируем как бы факт курсор над картинкой или нет ?? (ну это из области DOM и скорее всего так не получится  в FB dry )


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

Сообщение отредактировал Rolover - Вторник, 10.09.2013, 21:59
 
haavДата: Среда, 11.09.2013, 07:53 | Сообщение # 26
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Теперь стало ясно о чем речь.

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


Этот вообще не вариант, я бы его даже рассматривать не стал. После определения точек первой же страны, любой человек это дело забросит.

Цитата (Rolover)
А есть второй вариант рассмотрение этой области как картинки в целом....... и тогда уже, просто проверка, находится ли курсор над данной картинкой или нет...не зависимо от координат..вернее мы их не проверяем ... мы констатируем как бы факт курсор над картинкой или нет ?? (ну это из области DOM и скорее всего так не получится в FB


А вот в этом что-то есть. Хотя тоже надо сказать трудоемок , по крайней мере пока будет отделение стран в отдельные картинки. У картинок должны быть четко выделены границы каким нибудь отдельным цветом. Имея картинки, я бы попробовал создавать регионы с помощью WINAPI CreateRectRgn + CombineRgn. Далее массивы сохранял в файлы. А при загрузке программы, загружал бы массивы в память, создавал на основе их регионы с помощью ExtCreateRegion и определял бы эти регионы для окон с помощью SetWindowRgn. Далее у этих окон сменил бы стиль на дочерний прикрепил бы к основному окну по нужным координатам. Ну а имея отдельные окна для каждой "кривой" картинки, определить над ними курсор - простейшая задача. Наверно возник вопрос, зачем все сохранять в файлы. Ответ прост: CreateRectRgn + CombineRgn работают ооочень медленно. Поэтому данную базу лучше сохранить в файлы. По крайней мере данный способ в какой-то степени более автоматизирован.

И да, если на другом языке это сделать в разы проще, то тут и думать нечего.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Четверг, 12.09.2013, 09:02 | Сообщение # 27
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Я тут подумал над вариантом получения координат разных областей. Если взять географическую карту и любой нормальный редактор графики (например GIMP). Можно выделять вручную различные области (страны) и закрашивать их разными цветами. К примеру Россия красным цветом, Китай синим и т. д. Затем пишется простая программка которая зондирует цвет и и определяет координаты для этого цвета. Конечно же все это дело сохраняется в файле, по типу:

[1]
100,100
100,101
....

[2]
500,500
500,501
...

В итоге для каждой станы будет определена своя база координат.


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

Я кстати над этим тоже думал  ))) есть оператор Point )))
можно попробовать приспособить ))

Но Ваш вариант интереснее в плане, еще и сохранять данные )))
Отлично будет над чем подумать!!

Добавлено (18.10.2013, 22:58)
---------------------------------------------
Доброго времени суток !
У меня возникла проблема  потребления большого количества памяти, при создании изометрического или просто плоского изображения локации.

Что делал:

1. Вариант создания локации путем перебора 2-х циклов  для X и Y соответственно вычисляя координаты расположения определенного тайла или блока  на экране ... Приведу часть кода
Код
....

Screen 19,32,2

.....

dim img as Any Pointer = png_load("pic/tayl1.png")

Dim max_pole as short = 19    'количество тайлов
..........

Do
.................................

For i as ushort= 0 to max_pole
       For j as ushort = 0 to max_pole
       
           'вычисляем координаты запоминаем в массив
           tyli(i,j).x = (i - j) * W/2 + sx
           tyli(i,j).y = (i + j) * H/2 + sy
       
              
           ' и формируем саму карту
           Put (   tyli(i,j).x,    tyli(i,j).y    ),  img, Alpha

         Next j
Next i
.........

Loop until MultiKey(SC_ESCAPE)

В общем цикле выводим , в массив запоминаем
Одним словом  рисуется красиво  если количество тайлов (блоков) мало

но при его увеличении ну например 100  х  100  приходится каждый виток вновь и вновь перебирать эти циклы  ну еще спрайт  юнита вывести  и двигаться его заставить короче всё начинает жутко тормозить
Этот способ откинул как сильно тормозящий ну и никак не подходит.... за память молчу и не проверял даже .... хотя должна быть не велика... только то что занимает спрайт

2. Вариант..... это создание локации как сплошного фона короче говоря сплошной картинкой... ну или комбинацией из разных тайлов .. идея какая ...... должна получиться сплошная картинка  и тогда в цикле просто выводить её как фон ...... пример кода

Код
......

Screen 19,32,2

.....

dim img as Any Pointer = png_load("pic/tayl1.png")

Dim max_pole as short = 19    'количество тайлов
..........

'объявили место в памяти под будущую картинку
dim map as Any Pointer = ImageCreate(800,600)

For i as ushort= 0 to max_pole
       For j as ushort = 0 to max_pole
       
           tyli(i,j).x = (i - j) * W/2 + sx
           tyli(i,j).y = (i + j) * H/2 + sy
       
              
           ' и формируем саму карту
           Put  map, (   tyli(i,j).x,    tyli(i,j).y    ),  img, Alpha

         Next j
Next i

Do
.................................

       
              
           ' выводим локацию
           Put (   tyli(i,j).x,    tyli(i,j).y    ), map, Alpha

.........

Loop until MultiKey(SC_ESCAPE)


в принципе код не сильно отличается от пред идущего кроме дополнительного пространства под статическую картинку фон
800, 600 . да этот вариант срабатывает.. да скорость увеличивается в разы.... но что делать с памятью .. она пропорционально увеличивается размеру фона
хотя бы тот что есть
выводим тайлы    64 х  32

800 / 64 = 12  округлим  итого 12 штук по х  соответственно и по y столько же возьмем ... это чтобы в экран влезло

И так посчитаем  :

64 * 32  = 2048  точек     на один тайл(блок) .. примем что это сплошной прямоугольник (каким он по факту является за исключением по углам прозрачного фона)

12 * 12 = 144 блока (тайла)
144 * 2048 = 294 912  точек всего
294 912 *  4 байта =  1 179 648  байт   с учетом 4 байта на цвет для одной точки

если бы это была сплошная картинка  то
800 * 600 * 4 = 1 920 000 байт

итого метр

а ща чуток увеличим

19 * 19 = 361 * 2048 = 739 328 * 4 = 2 957 312    а тут уже почти  3

Я конечно могу что-то не правильно считать но это не меняет сути.

А как же теперь быть со скроллингом  когда нужно чтобы фон двигался это должен быть сплошняком огрооомная картинка  чтобы это все дело шло плавно и не тормозило при создании очередного экрана для отображения... а уж сколько это памяти скушает .....

А есть ли возможность или способ чтобы как-то ускорить первый вариант ...... чтобы хранилось в памяти например с десятка полтора  тайлов,  а их потом в двух циклах в нужных местах выводить.. чтобы не создавать предварительно статической картинки в памяти  ?

Или много оконную буфферизацию делать... просто прошу подсказать как правильно ... я не прошу готового кода .. просто подтолкнуть на мысль  smile в нужном направлении... А то у меня уже просто идеи закончились...


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

Сообщение отредактировал Rolover - Пятница, 18.10.2013, 23:04
 
haavДата: Четверг, 24.10.2013, 19:29 | Сообщение # 29
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Тоже кстати интересует этот вопрос. Могу посоветовать только:

1) Самый верный - обратиться с вопросом на http://www.gamedev.ru/
2) Есть игра на freebasic Y.A.G.A.C , довольно шустрая (правда с использованием OpenGl), может в ее исходниках подсмотреть идею


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Freebasic » Вопросы по языку FreeBasic » Спрайты (Спрайты и всё что с ними связано)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: