Noun wrote:Tattis paljon noista kartantallennusavuista. Mutta nyt, kuinka saan estettyä kameraa näyttämästä kartan ulkopuolista aluetta? Niin, että se pysähtyisi kun tullaan maailman laidalle.
Tässäpä koodiesimerkki:
Code: Select all
FrameLimit 60 'rajoita nopeutta
// Ikkunan leveys ja korkeus jo vakioissa, säästytään usealta
// ScreenWidth() ja ScreenHeight() -kutsulta
Const ScreenW = 640
Const ScreenH = 480
SCREEN ScreenW,ScreenH
// Kartan leveys ja korkeus, säästytään usealta
// MapWidth() ja MapHeight() -kutsulta
Const MapW = 40
Const MapH = 40
kartta = MakeMap( MapW, MapH, 32, 32 )
tileset = LoadImage("Media\tileset.bmp")
PaintObject kartta, tileset
// Reunat
For i=1 To MapW
EditMap map,0,i,1,113 'Kuva
EditMap map,2,i,1,1 'Törmäys
EditMap map,0,i,MapW,113
EditMap map,2,i,MapW,1
Next i
For i=1 To MapH
EditMap map,0,1,i,113
EditMap map,2,1,i,1
EditMap map,0,MapW,i,113
EditMap map,2,MapW,i,1
Next i
// Kartan lattia
For x=2 To MapW-1
For y=2 To MapH-1
EditMap map,0,x,y,153
Next y
Next x
// Animoidaan vielä reunat ;)
SetTile 113, 1
PlayObject kartta,0,0,1
ukko = LoadObject ("Media\guy.bmp",72)
// Asetetaan törmäys ukolle ja kartalle
SetupCollision ukko,kartta,1,4,2
Repeat
'Ukon ohjaus
If LeftKey() Then TurnObject ukko,10
If RightKey() Then TurnObject ukko,-10
If UpKey() Then MoveObject ukko,5
If DownKey() Then MoveObject ukko,-5
// Rajoitetaan kamera kartan reunoihin
camX = ObjectX(ukko)
camY = ObjectY(ukko)
If camX < (ScreenW-ObjectSizeX(kartta))/2 Then camX = (ScreenW-ObjectSizeX(kartta))/2
If camX > (ObjectSizeX(kartta)-ScreenW)/2 Then camX = (ObjectSizeX(kartta)-ScreenW)/2
If camY < (ScreenH-ObjectSizeY(kartta))/2 Then camY = (ScreenH-ObjectSizeY(kartta))/2
If camY > (ObjectSizeY(kartta)-ScreenH)/2 Then camY = (ObjectSizeY(kartta)-ScreenH)/2
PositionCamera camX, camY
DrawScreen
Forever
Tuossa se maaginen kohta on siis tämä:
Code: Select all
camX = ObjectX(ukko)
camY = ObjectY(ukko)
If camX < (ScreenW-ObjectSizeX(kartta))/2 Then camX = (ScreenW-ObjectSizeX(kartta))/2
If camX > (ObjectSizeX(kartta)-ScreenW)/2 Then camX = (ObjectSizeX(kartta)-ScreenW)/2
If camY < (ScreenH-ObjectSizeY(kartta))/2 Then camY = (ScreenH-ObjectSizeY(kartta))/2
If camY > (ObjectSizeY(kartta)-ScreenH)/2 Then camY = (ObjectSizeY(kartta)-ScreenH)/2
PositionCamera camX, camY
Siinä lasketaan suurimmat ja pienimmät x- ja y-koordinaatit, jotka kameralle voi tulla ja pidetään huoli ettei kamera ylitä niitä arvoja ja lopuksi asetetaan kamera kyseisiin koordinaatteihin.
Kannattaa ehkä ottaa ObjectSizeX(kartta) ja ObjectSizeY(kartta) johonkin vakioon/muuttujaan ylös, niin säästyy parit turhat ja toistuvat funktiokutsut.