forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ и уроки (http://forum.boolean.name/forumdisplay.php?f=110)
-   -   Скроллинг в 2д мире. (http://forum.boolean.name/showthread.php?t=5185)

Данил 03.12.2007 22:08

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

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

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

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

И имеем еще две координаты - координаты домика. :crazy:
Допустим, 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 а эта типо самый главный код, выщитывающий положение домика на экране :crazy:

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


Мож кому-нибудь потребуется...

Ende 03.12.2007 22:11

Re: Скроллинг в 2д мире.
 
Очень доходчиво и наглядно, спасибо )

Trilliput 03.12.2007 23:15

Re: Скроллинг в 2д мире.
 
Сколько жрут домики ресующиесяза картой по сравнению с теми что на экране?
Имеет смысл делать проверку видимости домика?

Данил 03.12.2007 23:29

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

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


А вот при 50000 "домиков" разница есть.
Если скрывать - 75 примерно мс. а елси нет - 145 ....

Trilliput 03.12.2007 23:48

Re: Скроллинг в 2д мире.
 
ну значит при карте больше 500х100 тайтлов есть смысл прятать :)
Есть провереный алгоритм видимости\невидимости?

Данил 03.12.2007 23:50

Re: Скроллинг в 2д мире.
 
If X-CameraX < ШиринаЭкрана And Y-CameraY < ВысотаЭкрана then

ага, как раз 50000 получается =) конечно лучше все остальные скрывать =) а показывать только те, что на экране =)

ЛысыЙ_Чук-Иванчук 04.12.2007 00:52

Re: Скроллинг в 2д мире.
 
ЖЖоте.
В зоне ли видемости проверяется перво наперво, и если НЕТ то вомногих случаю дальнейшее обновление прекрощяется!

Данил 04.12.2007 06:20

Re: Скроллинг в 2д мире.
 
Цитата:

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

Еще один пример - PoH. Если игрок хотя бы раз увидел монтсра - то он уже обновляется всегда.

dimanche13 04.12.2007 11:37

Re: Скроллинг в 2д мире.
 
хм... а я использую SetOrigin() и SetViewPort()

alcoSHoLiK 04.12.2007 13:09

Re: Скроллинг в 2д мире.
 
Данил
Одно дело, когда обновляются все юниты, совсем другое - когда рисуются. Хотя обычно драйвер достаточно умный, чтобы не выполнять ненужные рисования.

Данил 04.12.2007 13:15

Re: Скроллинг в 2д мире.
 
Цитата:

случаю дальнейшее обновление прекрощяется!
я овтетил на имннно обновление, а не действие, где рисуется ;)

dimanche13 04.12.2007 16:21

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() надо бы протестить какой способ шустрее. Да и ставить графический режим, а потом объявлять переменные это как-то... странно.

Данил 04.12.2007 16:26

Re: Скроллинг в 2д мире.
 
Протестировал - одинаково.

christian [I <3 Blitz3D] 19.06.2009 21:58

Ответ: Скроллинг в 2д мире.
 
Неправда, с SetViewport() и SetOrigin() быстрее, но на маленьких примерах незаметно.:tongue: Да и кода меньше получается:)
dimanche13 спс за пример:)

Данил 05.07.2009 20:38

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


Часовой пояс GMT +4, время: 19:05.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot