Räiskintäpelirunko

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
nixe
Newcomer
Posts: 21
Joined: Tue Aug 28, 2007 5:47 pm
Location: Haapavesi
Contact:

Räiskintäpelirunko

Post by nixe »

Kaivoin naftaliinista vanhan Enter-lehden, johon kirjoitin vuonna 2005 (nro 6) "Näin toimii CoolBasic" -artikkelin. Artikkelissa valotettiin CoolBasicin taustoja ja ohjelmoinnin alkeita, sekä tehtiin yksinkertainen räiskintäpelirunko. Oppaasta otin alkuperäisen koodin ja parantelin sitä hieman, mm. viholliset ovat nyt tyyppikokoelmana. Perusrunko on kuitenkin pysynyt samana. Koodista on alkujaankin pyritty tekemään mahdollisimman yksinkertainen ja helppolukuinen. Sitä on myös kommentoitu niin, että hieman erikoisemmat kohdat "aukeavat". Toivottavasti tästä joku hyötyy ja aina mukavempi jos joku tämän pohjalta intoutuu jotakin oikeaakin tekemään.

Koodi käyttää hyväkseen CoolBasicin mukana tulevia kuvia, ääniä ja tilekarttaa, joten kannattanee ainakin ensi vaiheessa tallentaa koodi CB:n sovelluskansioon (c:\program files\coolbasic\, tai mikä nyt kelläkin sattuu olemaan).

Pelaajaa liikutetaan nuolista ja ampuminen tapahtuu oikeanpuoleisella ctrl-näppäimellä.

Code: Select all

SCREEN 800,600,0,1
FrameLimit 40

playerpoints = 0
font = LoadFont("Verdana",32,1,1)
SetFont font

// Luodaan tyyppikokoelma ammuksia varten
Type BULLETS
    Field obj
End Type

// Ladataan media
Gosub LoadMedia

// Määritetään tyyppikokoelma vihollisille ja luodaan pari vihollista
Type ENEMIES
    Field obj
    Field energy
End Type
Gosub MakeEnemies


/////// PÄÄSILMUKKA ///////
Repeat
    Gosub CheckButtons
    Gosub EnemyAI
    Gosub CheckBullets
    Gosub DrawGUI
        
    // Siirretään kameraa pelaajan mukana
    CloneCameraPosition player
    
    // Tarkistetaan onko taustamusiikki pysähtynyt ja käynnistetään tarvittaessa uudelleen
    If SoundPlaying(backgroundmusic) = 0 Then
        backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
    EndIf
    
    DrawScreen 

Until EscapeKey()


/////// ALIOHJELMAT ///////
// Aliohjelma jossa ladataan pelissä tarvittava media
LoadMedia:
    // Ladataan kartta ja animoidaan se
    map = LoadMap("Media\cdm2.til", "Media\Tileset.bmp")
    PlayObject map,0,0,0.5
    
    // Ladataan panosobjektin grafiikat ja piilotetaan objekti
    bulletobject = LoadObject("Media\bullet.bmp", 72)
    ShowObject bulletobject, OFF
    
    // Ladataan pelaaja ja asetetaan törmäyksentunnistus kartan seinien ja pelaaja välille
    player = LoadObject("Media\soldier.bmp", 72)
    SetupCollision player,map,2,4,2
    
    // Ladataan vihollinen ja piilotetaan objekti
    enemyobject = LoadObject("Media\guy.bmp", 72)
    ShowObject enemyobject, OFF
    
    // Ladataan äänet
    backgroundmusic = PlaySound("Media\SK_Battle2.mp3", 40)
    shot = LoadSound("Media\gun 1.wav")
    scream = LoadSound("Media\scream1.wav")
Return

// Aliohjelma joka tarkistaa näppäinpainallukset
CheckButtons:
    If UpKey() Then MoveObject player,4
    If DownKey() Then MoveObject player,-4
    If LeftKey() Then TurnObject player,5
    If RightKey() Then TurnObject player,-5    
    
    // Tarkistetaan painetaanko ampumisnäppäintä ja jos, 
    // niin luodaan ammus ja törmäystunnistus sille
    If KeyHit(cbkeyrcontrol) Then
        PlaySound shot, 40
        blt.BULLETS = New(BULLETS)
        blt\obj = CloneObject(bulletobject)
        CloneObjectPosition blt\obj, player
        CloneObjectOrientation blt\obj, player
        MoveObject blt\obj,15
        SetupCollision blt\obj,map,2,4,1
        ResetObjectCollision blt\obj
    EndIf
Return

// Aliohjelma, jossa tehdään viholliselle alkeellinen tekoäly
EnemyAI:
    For enem.ENEMIES = Each ENEMIES
        // Tarkistetaan näkeekö vihollisobjekti pelaajaobjekti ja
        // jos näkee niin aloitetaan liikuttamaan pelaajaa kohti
        If ObjectSight(enem\obj,player) Then
            PointObject enem\obj, player
            MoveObject enem\obj, 2
        EndIf
    Next enem
Return

// Aliohjelma, jossa läpikäydään ammukset
CheckBullets:
    For blt.BULLETS = Each BULLETS
        MoveObject blt\obj, 10
        For enem.ENEMIES = Each ENEMIES
            // Tarkistetaan osuuko ammus viholliseen
            If ObjectsOverlap(blt\obj, enem\obj, 2) Then
                deleteobj = 1
                enem\energy = enem\energy - 20
                playerpoints = playerpoints + 5
            EndIf
        Next enem
        bulcollisions = CountCollisions(blt\obj)
        For i = 1 To bulcollisions
            // Tarkistetaan onko ammus osunut seinään
            If GetCollision(blt\obj, i) > 1 Then deleteobj = 1
        Next i
        If deleteobj = 1 Then
            DeleteObject blt\obj
            Delete blt
            deleteobj = 0
        EndIf
    Next blt
Return

// Aliohjelma jossa piirretään "käyttöliittymä"
DrawGUI:
    DrawGame
    DrawToWorld ON
    // Käydään viholliset läpi
    For enem.ENEMIES = Each ENEMIES
        PosX = ObjectX(enem\obj) - (ObjectSizeX(enem\obj)/2)
        PosY = ObjectY(enem\obj) + ObjectSizeY(enem\obj)
        EnWidth = enem\energy / 3
        Color cbWhite
        Box PosX,PosY,33,6
        Color cbRed
        Box PosX+1,PosY-1,EnWidth-2,4
        If enem\energy <= 0 Then
            // Jos energia nollassa, niin toistetaan huuto ja poistetaan vihollistyyppi
            PlaySound scream,40
            DeleteObject enem\obj
            Delete enem
        EndIf
    Next enem
    DrawToWorld OFF
    
    // Kirjoitetaan pisteet näytölle (ensimmäinen on varjostus)
    Color cbBlack : Text 12,12, playerpoints
    Color cbWhite : Text 10,10, playerpoints
Return

// Aliohjelma, jossa määritetään kaksi vihollista ja niiden energia
MakeEnemies:
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,0,-500
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = 100
    
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,0,500
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = 100
Return
Tuossapa vielä kuvakaappausta malliksi
Image
EDIT:

Pari kommenttia lisätty

p33l0mp1 kuin k0ulul41n3n
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Räiskintäpelirunko

Post by MaGetzUb »

Selkeälukuista koodia tuo oli, pelissähän olisi voinut alussa asettaa enemmänkin vihollisia kuin nuo kaksi. :) Ehkä yksinkertainen funktio vihujen tekoon olisi kätevä, että saisivat aloitteliat vähän leikkiäkkin. :D
Tyyliin:

Code: Select all

Function CreateEnemy(x, y, health)    
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,x,y
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = health
End Function
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Räiskintäpelirunko

Post by Latexi95 »

MaGetzUb wrote:Selkeälukuista koodia tuo oli, pelissähän olisi voinut alussa asettaa enemmänkin vihollisia kuin nuo kaksi. :) Ehkä yksinkertainen funktio vihujen tekoon olisi kätevä, että saisivat aloitteliat vähän leikkiäkkin. :D
Tyyliin:

Code: Select all

Function CreateEnemy(x, y, health)    
    enem.ENEMIES = New(ENEMIES)
    enem\obj = CloneObject(enemyobject)
    PositionObject enem\obj,x,y
    SetupCollision enem\obj,map,2,4,1
    SetupCollision enem\obj,player,2,2,2
    SetupCollision player,enem\obj,2,2,2
    ResetObjectCollision enem\obj
    enem\energy = health
End Function
Pilkkominen funktioiden avulla kyllä lisäisi koodin käytettävyyttä ja funktiothan kuuluvat keskeisenä osana ohjelmointiin ja hyviin koodaustapoihin*. :D
*hitaan funktio kutsun takia, ei ehkä cb:n tapauksessa, mutta yleisesti.
Post Reply