Kamera funktio

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Kamera funktio

Post by otto90x »

Silloin tällöin tulee joku kysymään, että kuinka voi tehdä kaksi "ruutua" ja siksipäs tein siitä tälläisen esimerkkikoodin (tai siis kevyesti päivitin vanhoilta foorumeilta "pelastamani" koodinpätkän).

Kyseessä on siis funktio jolla saa tehtyä helposti useita "ruutuja" esimerkiksi moninpeliin.Funktio ottaa kuvan pelimaailmasta ja tallentaa sen annettuun kuvamuuttujaan.

Funktiota käytetään seuraavasti:

Code: Select all

Camera(kuvamuuttuja, kuvalähteen x koordinaatti, kuvalähteen y koordinaatti) 
Huom. Koordinaatit ovat maailmakoordinaatteja.

Ja sitten esimerkkejä.

Tässä on esimerkkiohjelma kahdella ruudulla :
Näppäimet: wasd ja nuolet

Code: Select all

'Camera function by Otto90x

SCREEN 1024,768 'tehdään ikkunasta vähän suurempi

ruutu1 = MakeImage(512,768) 'tehdään pelaajan numero yksi kuva

ruutu2 = MakeImage(512,768) 'tehdään pelaajan numero kaksi kuva

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp") 'ladataan kartta

PlayObject kartta,0,0,1 ' animoidaan kartta

ukko = LoadObject ("Media\guy.bmp",72) 'ladataan ukko 1

ukko2 = LoadObject("media\guy.bmp",72) 'ladataan ukko 2

PositionObject ukko2,-100,0 'sijoitetaan ukko2 hieman eri paikkaan

SetupCollision ukko, kartta, 1, 4, 2 'Määritellään törmäykset
SetupCollision ukko2,kartta,1,4,2
SetupCollision ukko,ukko2,2,2,2
SetupCollision ukko2,ukko,2,2,2

Repeat 'Päälooppi alkaa

   MoveObject ukko,( UpKey() - DownKey() ) * 3      'Ukon ohjaus
   TurnObject ukko,( LeftKey() - RightKey() ) * 5
   
   MoveObject ukko2,( KeyDown(cbkeyW) - KeyDown(cbKeyS) ) * 3    'Ukon 2 ohjaus
   TurnObject ukko2,( KeyDown(cbkeyA) - KeyDown(cbKeyD) ) * 5
   

   camera(ruutu1,ObjectX(ukko),ObjectY(ukko)) 'Otetaan kuvat ukkojen luota
   camera(ruutu2,ObjectX(ukko2),ObjectY(ukko2)) 
   
   DrawImage ruutu1,0,0 ' Piirretään otetut kuvat ruudulle
   DrawImage ruutu2,512,0
  
   DrawScreen 'piirretään näyttö

Forever 'Pääluuppi loppuu


Function camera(img,x,y) 'Funktio joka ottaa kuvan pelimaailmasta

l=ImageWidth(img) 'tarkistetaan kuvan leveys
k=ImageHeight(img) 'tarkistetaan kuvan korkeus

UpdateGame ' laitetaan tämä kaiken varalta

DrawToImage img 'piirretään kuvaan
   
    ClsColor cbblack 'mustataan kuvan tausta
    Cls

    PositionCamera x,y 'siirretään kamera koordinaatteihin
    PositionCamera CameraX()+((ScreenWidth()-l)/2),CameraY()-((ScreenHeight()-k)/2) 'keskitetään kamera kuvan keskelle
    DrawGame 'piirretään pelin grafiikat

DrawToScreen 'piirretään taas ruudulle

EndFunction
Tässä vähän fiksumpi esimerkki, jos joku tarvitsee useampaa kuin kahta ruutua. Ei suositella ihan aloittelijoille.
Näppäimet: wasd, nuolet, ijkl sekä numpad

Code: Select all

 'Camera function by Otto90x

SCREEN 800,600

Type pelaaja 
    Field obj
    Field kuva
    Field kontrollit$
End Type

Global isäntäukko, kartta

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp") 'ladataan kartta

isäntäukko = LoadObject ("Media\guy.bmp",72)
ShowObject isäntäukko,OFF

LisääPelaaja("200 203 208 205") ' nuolet
LisääPelaaja("17 30 31 32") ' wasd
LisääPelaaja("72 75 76 77") ' numpad
LisääPelaaja("23 36 37 38") ' ijkl

Repeat
    
    pelaajamäärä = 0
    
    For p.pelaaja=Each pelaaja
    
        pelaajamäärä + 1
    
        MoveObject p\obj, ( KeyDown(  Int( GetWord(p\kontrollit,1) ) ) - KeyDown(  Int( GetWord(p\kontrollit,3) ) ) ) * 3
        TurnObject p\obj, ( KeyDown(  Int( GetWord(p\kontrollit,2) ) ) - KeyDown(  Int( GetWord(p\kontrollit,4) ) ) ) * 5
        
        camera(p\kuva,ObjectX(p\obj),ObjectY(p\obj))

        Select pelaajamäärä
        
            Case 1
                DrawImage p\kuva,0,0
            Case 2
                DrawImage p\kuva,400,0
            Case 3
                DrawImage p\kuva,0,300
            Case 4
                DrawImage p\kuva,400,300
        End Select 

    Next p
    
DrawScreen 

Forever


Function LisääPelaaja(_kontrollit$)
    If CountWords (_kontrollit$) = 4 Then 
        p.pelaaja=New(pelaaja)
        p\kontrollit=_kontrollit$
        p\kuva=MakeImage(400,300)
        p\obj=CloneObject(isäntäukko)
        SetupCollision p\obj,kartta,2,4,2
    EndIf
End Function 

Function camera(img,x,y) 'Funktio joka ottaa kuvan pelimaailmasta

l=ImageWidth(img) 'tarkistetaan kuvan leveys
k=ImageHeight(img) 'tarkistetaan kuvan korkeus

UpdateGame ' laitetaan tämä kaiken varalta

DrawToImage img 'piirretään kuvaan
   
    ClsColor cbblack 'mustataan kuvan tausta
    Cls

    PositionCamera x,y 'siirretään kamera koordinaatteihin
    PositionCamera CameraX()+((ScreenWidth()-l)/2),CameraY()-((ScreenHeight()-k)/2) 'keskitetään kamera kuvan keskelle
    DrawGame 'piirretään pelin grafiikat

DrawToScreen 'piirretään taas ruudulle

EndFunction
Ja tässä pelkkä funktio ilman esimerkkejä:

Code: Select all

Function camera(img,x,y) 'Funktio joka ottaa kuvan pelimaailmasta

l=ImageWidth(img) 'tarkistetaan kuvan leveys
k=ImageHeight(img) 'tarkistetaan kuvan korkeus

UpdateGame ' laitetaan tämä kaiken varalta

DrawToImage img 'piirretään kuvaan
   
    ClsColor cbblack 'mustataan kuvan tausta
    Cls

    PositionCamera x,y 'siirretään kamera koordinaatteihin
    PositionCamera CameraX()+((ScreenWidth()-l)/2),CameraY()-((ScreenHeight()-k)/2) 'keskitetään kamera kuvan keskelle
    DrawGame 'piirretään pelin grafiikat

DrawToScreen 'piirretään taas ruudulle

EndFunction

Last edited by otto90x on Wed Aug 29, 2007 7:24 am, edited 1 time in total.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Mr.Demolition
Newcomer
Posts: 21
Joined: Tue Aug 28, 2007 6:54 am

Re: Kamera funktio

Post by Mr.Demolition »

Onko tämä siis sellainen funkkari, joka jakaa ruudun kahteen osaan? Jos on, niin tällähän voisi väsätä jonkinlaisen Fahrenheintin kloonin tai jotain sinnepäin. Enpä päässyt vielä kokeilemaan, mutta kun pääsen koulusta aion testata tämän.
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Kamera funktio

Post by otto90x »

Mr.Demolition wrote:Onko tämä siis sellainen funkkari, joka jakaa ruudun kahteen osaan? Jos on, niin tällähän voisi väsätä jonkinlaisen Fahrenheintin kloonin tai jotain sinnepäin. Enpä päässyt vielä kokeilemaan, mutta kun pääsen koulusta aion testata tämän.
No tuo ensimmäinen esimerkki on juuri tuollainen, mutta sen lisäksi voit käyttää tätä monin eri tavoin, esimerkiksi kamerana ja kaukoputkena.

Eli voit tehdä pelaajalle kameran, jolla hän voi ottaa kuvia (myös muun kokoisia kuin koko ikkunan) pelialueesta. Tai sitten voit tehdä myös kaukoputken jonka kanssa hän näkee ruudun ulkopuolelle. Ja kyllähän tällä saa näitä ruutuja tehtyä ihan minkä kokoisia ja kuinka monta tahansa. Kyllä tälle käyttöä tulee jos vain kekseliäisyyttä ja taitoa riittää.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Mr.Demolition
Newcomer
Posts: 21
Joined: Tue Aug 28, 2007 6:54 am

Re: Kamera funktio

Post by Mr.Demolition »

No pääsinpäs nyt kokeilemaan ja vaikutti erittäin hyvältä. Jos osaisi, ja jos saisi tuon One Saintin joskus valmiiksi voisi tehdä pelin "Celsius" :D
Post Reply