Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > BlitzMax > FAQ и уроки

Ответ
 
Опции темы
Старый 03.12.2007, 19:08   #1
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Плохо Скроллинг в 2д мире.

Скроллинг в 2д мире.
Во многих играх есть передвижение по карте... В очень многих

Сейчас я вам расскажу, как это реализовано...

А реализовано это у нас очень просто

Имеем две переменных - координаты камеры.
Допустим, CameraX и CameraY.

И имеем еще две координаты - координаты домика.
Допустим, X и Y.

Надо нам сделать так, чтобы при перемещение камеры домик двигался как положено. То есть, двигаем камеру влево - домик вправо, и в итоге выходил за пределы....

Ну а что делать, если координаты камеры 5000, а координаты домика - 5500 ?)

Думаю, редко у кого такое расширение стоит ^^

Правильно это выщитывается по простейшей формуле - X - CameraX.
то есть, если у нас положение камеры - 5000, а положение домика 5500, то координаты домика на экране 5500 - 5000 = 500 пх.

Graphics 640,480

Global CameraX:Int , CameraY:Int
Global ListHouse:TList=New TList
Global MX:Int, MY:Int
Type THouse
Field X:Int
Field Y:Int
Field R:Int
Field G:Int
Field B:Int
Field W:Int
Field H:Int
Field ANg:Int
Method Draw ()
	SetRotation Ang
	SetColor R,G,B
	DrawRect X-CameraX , Y-CameraY,W,H
End Method
End Type

Function CreateHouse()
Local House:THouse=New THouse
	House.X = Rand(0,5000)
	House.Y = Rand(0,5000)
	House.R = Rand(0,255)
	House.G = Rand(0,255)
	House.B = Rand(0,255)
	House.W = Rand(0,200)
	House.H = Rand(0,200)
	House.Ang = Rand(0,360)
ListAddLast (ListHouse , House)
End Function 

For i = 0 To 500
CreateHouse()
Next

While Not KeyDown (Key_escape)
Cls
SetRotation 0
SetColor 50,150,50
DrawRect 0 , 0 , 640,480

For Local House:THouse= EachIn ListHouse
House.Draw
Next

MX = MouseX()
MY = MouseY()

If MX < 40 Then CameraX:-5
If MX > 600 Then CameraX:+5
If MY < 40 Then CameraY:-5ф
If MY > 440 Then CameraY:+5

Flip
Wend
Пример. Здесь у нас большая куча прямоугольников аля домиков и перемещение по карте. =)
DrawRect X-CameraX , Y-CameraY,W,H а эта типо самый главный код, выщитывающий положение домика на экране

Вначале мну не дошло, пока не объяснил JohnK. =) (за что ему респект )
В итоге ко мне постучалса чел, и попросил помочь. А я тутор написал, хотя, это не тутор - а нечто меньшее =)))


Мож кому-нибудь потребуется...
(Offline)
 
Ответить с цитированием
Старый 03.12.2007, 19:11   #2
Ende
AnyKey`щик
 
Регистрация: 08.11.2007
Сообщений: 13
Написано одно полезное сообщение
(для 3 участников)
Re: Скроллинг в 2д мире.

Очень доходчиво и наглядно, спасибо )
(Offline)
 
Ответить с цитированием
Старый 03.12.2007, 20:15   #3
Trilliput
Знающий
 
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений
(для 7 пользователей)
Re: Скроллинг в 2д мире.

Сколько жрут домики ресующиесяза картой по сравнению с теми что на экране?
Имеет смысл делать проверку видимости домика?
(Offline)
 
Ответить с цитированием
Старый 03.12.2007, 20:29   #4
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Скроллинг в 2д мире.

Протестил вообще с рисованием "домиков" и без.
С рисованием ~16 . И без ~16.
О_о.

то есть эти "домики" почти не жрут ...
Это при 500.


А вот при 50000 "домиков" разница есть.
Если скрывать - 75 примерно мс. а елси нет - 145 ....
(Offline)
 
Ответить с цитированием
Старый 03.12.2007, 20:48   #5
Trilliput
Знающий
 
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений
(для 7 пользователей)
Re: Скроллинг в 2д мире.

ну значит при карте больше 500х100 тайтлов есть смысл прятать
Есть провереный алгоритм видимости\невидимости?
(Offline)
 
Ответить с цитированием
Старый 03.12.2007, 20:50   #6
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Скроллинг в 2д мире.

If X-CameraX < ШиринаЭкрана And Y-CameraY < ВысотаЭкрана then

ага, как раз 50000 получается =) конечно лучше все остальные скрывать =) а показывать только те, что на экране =)
(Offline)
 
Ответить с цитированием
Старый 03.12.2007, 21:52   #7
ЛысыЙ_Чук-Иванчук
Дэвелопер
 
Регистрация: 19.03.2006
Сообщений: 1,241
Написано 10 полезных сообщений
(для 17 пользователей)
Re: Скроллинг в 2д мире.

ЖЖоте.
В зоне ли видемости проверяется перво наперво, и если НЕТ то вомногих случаю дальнейшее обновление прекрощяется!
(Offline)
 
Ответить с цитированием
Старый 04.12.2007, 03:20   #8
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Скроллинг в 2д мире.

В зоне ли видемости проверяется перво наперво, и если НЕТ то вомногих случаю дальнейшее обновление прекрощяется!
Простейший пример- стратегия. Там мало что видно на экрне, но обновляются все юниты.

Еще один пример - PoH. Если игрок хотя бы раз увидел монтсра - то он уже обновляется всегда.
(Offline)
 
Ответить с цитированием
Старый 04.12.2007, 08:37   #9
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Скроллинг в 2д мире.

хм... а я использую SetOrigin() и SetViewPort()
__________________
(Offline)
 
Ответить с цитированием
Старый 04.12.2007, 10:09   #10
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Скроллинг в 2д мире.

Данил
Одно дело, когда обновляются все юниты, совсем другое - когда рисуются. Хотя обычно драйвер достаточно умный, чтобы не выполнять ненужные рисования.
(Offline)
 
Ответить с цитированием
Старый 04.12.2007, 10:15   #11
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Скроллинг в 2д мире.

случаю дальнейшее обновление прекрощяется!
я овтетил на имннно обновление, а не действие, где рисуется
(Offline)
 
Ответить с цитированием
Старый 04.12.2007, 13:21   #12
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Скроллинг в 2д мире.

Global CameraX:Int , CameraY:Int
Global ListHouse:TList=New TList
Global MX:Int, MY:Int

Type THouse
Field X:Int
Field Y:Int
Field R:Int
Field G:Int
Field B:Int
Field W:Int
Field H:Int
Field ANg:Int

Method New()
	ListAddLast (ListHouse , Self)
End Method

Method Draw ()
	SetRotation Ang
	SetColor R,G,B
	DrawRect X , Y,W,H
End Method
End Type

Function CreateHouse()
Local House:THouse=New THouse
	House.X = Rand(0,5000)
	House.Y = Rand(0,5000)
	House.R = Rand(0,255)
	House.G = Rand(0,255)
	House.B = Rand(0,255)
	House.W = Rand(0,200)
	House.H = Rand(0,200)
	House.Ang = Rand(0,360)
End Function 

For i = 0 To 500
CreateHouse()
Next

Graphics 640,480
' отображать только то, что помещается во вьюпорте - а вьюпорт от 0,0 до ширины/высоты окна
SetViewport(0,0,640,480)

While Not KeyDown (Key_escape)
Cls
SetRotation 0

' здесь рисуем то, что не зависит от камеры
SetOrigin(0,0)
SetColor 50,150,50
DrawRect 0 , 0 , 640,480

MX = MouseX()
MY = MouseY()

If MX < 40 Then CameraX:-5
If MX > 600 Then CameraX:+5
If MY < 40 Then CameraY:-5
If MY > 440 Then CameraY:+5

' здесь сдвигаем ориджин в новое место, соответствующее координатам камеры
SetOrigin(-CameraX, -CameraY)

For Local House:THouse= EachIn ListHouse
	House.Draw
Next

Flip
Wend
переделал с setOrigin() надо бы протестить какой способ шустрее. Да и ставить графический режим, а потом объявлять переменные это как-то... странно.
__________________
(Offline)
 
Ответить с цитированием
Старый 04.12.2007, 13:26   #13
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Re: Скроллинг в 2д мире.

Протестировал - одинаково.
(Offline)
 
Ответить с цитированием
Старый 19.06.2009, 17:58   #14
christian [I <3 Blitz3D]
AnyKey`щик
 
Регистрация: 07.02.2009
Сообщений: 14
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Скроллинг в 2д мире.

Неправда, с SetViewport() и SetOrigin() быстрее, но на маленьких примерах незаметно. Да и кода меньше получается
dimanche13 спс за пример
(Offline)
 
Ответить с цитированием
Старый 05.07.2009, 16:38   #15
Данил
Модератор
 
Аватар для Данил
 
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений
(для 1,693 пользователей)
Ответ: Скроллинг в 2д мире.

Давай код)
ибо я тестировал с большим количеством объектов-прямоугольников)
У меня одинаково было)
А то что кода меньше - да... согласен (:
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Физика в 3Д мире beZ_probleM Программирование 2 20.12.2011 01:24
Коллизия - столкновение обектов в 3Д мире beZ_probleM Программирование 3 05.01.2011 19:00
Самые дорогие вещи в мире Dzirt Болтовня 3 22.09.2009 11:42
плавный скроллинг в тайл движке? dimanche13 2D-программирование 15 30.05.2007 11:40
Скроллинг мышой X-Ranger 3D-программирование 3 28.05.2007 21:58


Часовой пояс GMT +1, время: 04:20.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com