|
03.12.2007, 22:08
|
#1
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Скроллинг в 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, 22:11
|
#2
|
AnyKey`щик
Регистрация: 08.11.2007
Сообщений: 13
Написано одно полезное сообщение (для 3 участников)
|
Re: Скроллинг в 2д мире.
Очень доходчиво и наглядно, спасибо )
|
(Offline)
|
|
03.12.2007, 23:15
|
#3
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Скроллинг в 2д мире.
Сколько жрут домики ресующиесяза картой по сравнению с теми что на экране?
Имеет смысл делать проверку видимости домика?
|
(Offline)
|
|
03.12.2007, 23:29
|
#4
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Скроллинг в 2д мире.
Протестил вообще с рисованием "домиков" и без.
С рисованием ~16 . И без ~16.
О_о.
то есть эти "домики" почти не жрут ...
Это при 500.
А вот при 50000 "домиков" разница есть.
Если скрывать - 75 примерно мс. а елси нет - 145 ....
|
(Offline)
|
|
03.12.2007, 23:48
|
#5
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Скроллинг в 2д мире.
ну значит при карте больше 500х100 тайтлов есть смысл прятать
Есть провереный алгоритм видимости\невидимости?
|
(Offline)
|
|
03.12.2007, 23:50
|
#6
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Скроллинг в 2д мире.
If X-CameraX < ШиринаЭкрана And Y-CameraY < ВысотаЭкрана then
ага, как раз 50000 получается =) конечно лучше все остальные скрывать =) а показывать только те, что на экране =)
|
(Offline)
|
|
04.12.2007, 00:52
|
#7
|
Дэвелопер
Регистрация: 19.03.2006
Сообщений: 1,241
Написано 10 полезных сообщений (для 17 пользователей)
|
Re: Скроллинг в 2д мире.
ЖЖоте.
В зоне ли видемости проверяется перво наперво, и если НЕТ то вомногих случаю дальнейшее обновление прекрощяется!
|
(Offline)
|
|
04.12.2007, 06:20
|
#8
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Скроллинг в 2д мире.
В зоне ли видемости проверяется перво наперво, и если НЕТ то вомногих случаю дальнейшее обновление прекрощяется!
|
Простейший пример- стратегия. Там мало что видно на экрне, но обновляются все юниты.
Еще один пример - PoH. Если игрок хотя бы раз увидел монтсра - то он уже обновляется всегда.
|
(Offline)
|
|
04.12.2007, 11:37
|
#9
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Re: Скроллинг в 2д мире.
хм... а я использую SetOrigin() и SetViewPort()
|
(Offline)
|
|
04.12.2007, 13:09
|
#10
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Скроллинг в 2д мире.
Данил
Одно дело, когда обновляются все юниты, совсем другое - когда рисуются. Хотя обычно драйвер достаточно умный, чтобы не выполнять ненужные рисования.
|
(Offline)
|
|
04.12.2007, 13:15
|
#11
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Скроллинг в 2д мире.
случаю дальнейшее обновление прекрощяется!
|
я овтетил на имннно обновление, а не действие, где рисуется
|
(Offline)
|
|
04.12.2007, 16:21
|
#12
|
Мастер
Регистрация: 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, 16:26
|
#13
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Скроллинг в 2д мире.
Протестировал - одинаково.
|
(Offline)
|
|
19.06.2009, 21:58
|
#14
|
AnyKey`щик
Регистрация: 07.02.2009
Сообщений: 14
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Скроллинг в 2д мире.
Неправда, с SetViewport() и SetOrigin() быстрее, но на маленьких примерах незаметно. Да и кода меньше получается
dimanche13 спс за пример
|
(Offline)
|
|
05.07.2009, 20:38
|
#15
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Ответ: Скроллинг в 2д мире.
Давай код)
ибо я тестировал с большим количеством объектов-прямоугольников)
У меня одинаково было)
А то что кода меньше - да... согласен (:
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:28.
|