forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Тип Камеры (http://forum.boolean.name/showthread.php?t=3609)

jimon 12.06.2007 15:03

Тип Камеры
 
я чуствую что занимаюсь велосепедизмом .. но все же

Код:

Global Camera:TCamera

Type TCamera

        Field camera_x,camera_y
       
        Method DrawImages(image:TImage,x,y)
                DrawImage image,x - camera_x, y - camera_y
        End Method
       
        Method Move(x,y)
                camera_x = camera_x + x
                camera_y = camera_y + y
        End Method
       
        Method SetXY(x,y)
                camera_x = x
                camera_y = y
        End Method
       
        Method GetX()
                Return camera_x
        End Method

        Method GetY()
                Return camera_y
        End Method
       
        Method GetMouseX()
                Return MouseX() + camera_x
        End Method

        Method GetMouseY()
                Return MouseY() + camera_y
        End Method
       
        Method GetScrX(x)
                Return x - camera_x
        End Method
       
        Method GetScrY(y)
                Return y - camera_y
        End Method
       
        Function CreateCamera()
                Camera = New TCamera
        End Function

End Type

Function DrawImg(image:TImage,x,y)
        Camera.DrawImages(image,x,y)
End Function

и примерно как юзать
Код:


TCamera.CreateCamera()
............


if KeyDown(KEY_D) Camera.Move(1,0)
If KeyDown(KEY_A) Camera.Move(-1,0)
If KeyDown(KEY_W) Camera.Move(0,-1)
If KeyDown(KEY_S) Camera.Move(0,1)
DrawImg (img,0,0)


просто я пока плохо перевариваю ограничение екрана :) мне надо больше :)

alcoSHoLiK 12.06.2007 15:29

Re: Тип Камеры
 
Молодец) Сделай поддержку нескольких камер и переход между ними: через фейд или перелет.

moka 12.06.2007 20:50

Re: Тип Камеры
 
Я это реализовываю немного другим путём:
Я не создаю новый класс, у меня есть только 5 значений:
1,2 - Размер экрана.
3,4 - Позиция камеры (левый верхний угол, хотя сделать центр несложно).
5 - Коэфицент Зуума.
И далее в других классах есть отрисовка, например для линий есть локальная функция TLine.Render() где происходит перебор эллементов, каждый проверяется попала линия в экран исходя из 5 значений для камеры, если да то отрисовывать опять исходя из 5 значений.
Вот и всё. А заводить новый класс зачем? Я решил что мне не нужно много камер, я сделал плавное перемещение камеры и всё, даже если точку куда нужно переместить камеры, поставить очень далеко, то она не сразу туда двинется, а полетит.
А вообще хз, каждый по своему делает, кому как удобнее. ;)

Да и относительно перемещения камеры, сделай так:
2 перменные отвечающие за точку куда должна переместиться камера, и двигай по формуле:
camera_x:+(camera_trgx-camera_x)*.01
camera_y:+(camera_trgy-camera_Y)*.01
А x и y в методе TCamera.Move прибоавляй к координатам цели. ;) Будет приятнаое сглаживание.

А вообще твой способ в определённых ситуациях удобен, мне например координату мышки нужно было складывать постоянно, ну и т.п. а у тебя сразу, но совет: В начале цикла привязывай координаты мышки к переменным, а потом их юзай вместо вызова MouseX() и MouseY().

jimon 08.10.2007 18:38

Re: Тип Камеры
 
да кстати, вот последний тип камеры из jAqua

Код:

Type TCamera

        'camera coordinates
        Field camera_x#,camera_y#
       
        Field Zoom# = 1.0
        Field GlobalAlpha# = 1.0
       
        Field EnableZoom% = 1
        Field EnableGlobalAlpha% = 1
       
        Field GrapX#
        Field GrapY#
       
        Method Serealize()
                SerFloat(camera_x)
                SerFloat(camera_y)
                SerFloat(Zoom)
                SerFloat(GlobalAlpha)
                SerInt(EnableZoom)
                SerInt(EnableGlobalAlpha)
        End Method
       
        'draw image with camera
        Method DrawImages(image:TImage,x#,y#,frame%=0)
                If image = Null Then
                        RuntimeError "WTF ?! null image in camera.drawimages , please debug again :)"
                End If
               
                If EnableGlobalAlpha = 1 Then SetAlpha(GetAlpha()*GetGlobalAlpha())
               
                If EnableZoom = 1 Then
                        Local scx#,scy#
                        GetScale scx,scy
                        SetScale scx*GetZoom(),scy*GetZoom()
                End If
               
                DrawImage image,GetScrX(x),GetScrY(y),frame
        End Method
       
        Method GetZoom#()
                If EnableZoom = 1 Then
                        Return Zoom
                Else
                        Return 1.0
                End If
        End Method
        Method GetGlobalAlpha#()
                If EnableGlobalAlpha = 1 Then
                        Return GlobalAlpha
                Else
                        Return 1.0
                End If
        End Method
       
        'move camera
        Method Move(x#,y#)
                camera_x :+ x
                camera_y :+ y
        End Method
       
        'set camera positon
        Method SetXY(x#,y#)
                camera_x = x
                camera_y = y
        End Method
       
        'get camera position
        Method GetX#()
                Return camera_x
        End Method
        Method GetY#()
                Return camera_y
        End Method
       
        'get mouse position with camera
        Method GetMouseX#()
                Return GetWorldX(MouseX())
        End Method
        Method GetMouseY#()
                Return GetWorldY(MouseY())
        End Method
       
        'get screen coordinates from world
        Method GetScrX#(x#)
                Return (x - camera_x)*GetZoom()
        End Method
        Method GetScrY#(y#)
                Return (y - camera_y)*GetZoom()
        End Method

        'get world coordinates from screen
        Method GetWorldX#(x#)
                Return x/GetZoom() + camera_x
        End Method
        Method GetWorldY#(y#)
                Return y/GetZoom() + camera_y
        End Method
       
        'return 1 if cordinates in current viewport
        Method InViewPort%(x#,y#)
                Local x2#,y2#
                x2 = GetScrX(x)
                y2 = GetScrY(y)
               
                If x2 >= 0 And x2 <= GrapX And y2 >= 0 And y2 <= GrapY Then
                        Return 1
                Else
                        Return 0
                End If
        End Method
        Method BoxInViewPort%(x#,y#,Width#,Height#)
                Local x2#,y2#,x3#,y3#
                x2 = GetScrX(x + Width/2.0)
                y2 = GetScrY(y + Height/2.0)
                x3 = GetScrX(x - Width/2.0)
                y3 = GetScrY(y - Height/2.0)
               
                If x2 >= 0 And x3 <= GrapX And y2 >= 0 And y3 <= GrapY Then
                        Return 1
                Else
                        Return 0
                End If
        End Method
        Method ImageInViewPort%(Img:TImage,x#,y#)
       
                Local x2#,y2#,x3#,y3#
                x2 = GetScrX(x + Float(Img.width)/2.0)
                y2 = GetScrY(y + Float(Img.height)/2.0)
                x3 = GetScrX(x - Float(Img.width)/2.0)
                y3 = GetScrY(y - Float(Img.height)/2.0)
               
                If x2 >= 0 And x3 <= GrapX And y2 >= 0 And y3 <= GrapY Then
                        Return 1
                Else
                        Return 0
                End If
        End Method
       
       
        Function Create:TCamera()
                Local cam:TCamera = New TCamera
                cam.GrapX = GraphicsWidth()
                cam.GrapY = GraphicsHeight()
               
                Return cam
        End Function
       
End Type

можете удалить метод Serealize нафиг :)
ибо вам он не нужен

Igorr 18.10.2007 22:07

Re: Тип Камеры
 
Я это делал так. Если кому интересно. :-)
Код:


Type
TCamera
Field CameraX#,CameraY#
Field GW#,GH#

MethodNew()
GW#=
GraphicsWidth()
GH#=
GraphicsHeight()
EndMethod

Method GetRenderingCoords(x# Var,y# Var)
x#=GW#/2+x#
y#=GW#/2-y#
EndMethod

Method Refresh()
GW#=
GraphicsWidth()
GH#=
GraphicsHeight()
EndMethod

Method Position(NewX#,NewY#)
CameraX#=newX#
CameraY#=newY#
EndMethod

Method Move(SpeedX#,SpeedY#)
CameraX#:+SpeedX#
CameraY#:+SpeedY#
EndMethod
EndType



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

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