Yksinkertainen räiskintäpelin alku aloittelijoille!

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Yksinkertainen räiskintäpelin alku aloittelijoille!

Post by MaGetzUb » Wed Mar 09, 2011 5:57 pm

Niin, eli tämä samainen koodihan löytyy tyhmistä kysymyksistä, mutta ajattelin sen laittaa tännekkin, koska tämähän on esimerkit ja tutoriaalit alue. :)

Code: Select all

//Vihut Tyyppikokoelma, sisältää objektimuuttujan ja latausaika-muuttujan. 
Type Vihut
    Field obj                'Itse objekti
    Field reload             'Vihollisen latausaika
End Type 

//Ammus tyyppikokoelma, sisältää lentävän luodin objektimuuttujan.
Type AMMUS
    Field obj                
End Type 


SCREEN 800, 600


imglife = LoadImage("Media\life.jpg") //Ladataan energiapalkki kuva, joka merkitsee pelaajan energiamäärää.
Global ukko //Tehdään allaolevasta ukosta "globaali" eli tämä sama muuttuja näkyy jokapuolella koodia, myös 
            //repeat-silmukan alapuolella.
ukko=LoadObject("Media\soldier.bmp",72)
ObjectFloat ukko, 120 'Asetetaan pelaajalle energia

vihu = LoadObject("Media\soldier.BMP", 72) 

Global pati //Laitetaan panos näkymään kaikkialla.
pati=LoadObject("Media\bullet.bmp")

ShowObject pati,OFF
ShowObject vihu, OFF



//Luodaan viholliset, tehdään niitä 10
For i = 0 To 10
    pahis.Vihut = New(Vihut)
    pahis\obj = CloneObject(Vihu)
    SetupCollision pahis\obj, ukko, 2, 2, 2 //Viholliset törmäävät pelaajaan.
    PositionObject pahis\obj,Rand(-400, 400), Rand(-300, 300) //Sijoitetaan viholliset satunnaisiin kohtiin ruudulla.
    ObjectFloat pahis\obj, 100 'Asetetaan pahikselle energia
Next i
aloitsuaika = Timer()

//Viholliset törmäävät nyt toisiinsa.
For pahis.Vihut = Each Vihut
    For pahis2.Vihut = Each Vihut
        If pahis <> pahis2 Then SetupCollision pahis\obj, pahis2\obj, 2, 2,2
    Next pahis2
Next pahis

Repeat
    ClearText 
    currentTime = (Timer() - aloitsuaika)/1000 //Tehdään muuttuja, josta lasketaan 
                                               //aloitusaikamuuttujan ja nykyisen ajan välinen erotus.
    AddText "Aikaa mennyt: "+currentTime       //Kirjoitetaan ruutuun tarvittavat tekstit
    AddText "Nuolista ohjaa, CTRL=ampuu"

    //Ukon liikutus..
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,3.5
    If DownKey() Then MoveObject ukko,-2.45    
    //Painetaan oikeaa kontrollia, niin käytetään itse tekemää "komentoa" ts. funktiota nimeltään ObjAmmu
    If KeyDown(cbKeyRControl) And reload=0 Then    
        ObjAmmu(ukko)
        reload=5       
    EndIf
    
    If reload>0 Then reload=reload-1

    DrawGame

    //Kun käydään viholliset lävitse lasketaan samalla niiden määrä
    Vihollisia = 0 //Asetetaan vihollisten määrä aina aluksi nollaan
    //Vihollisten läpikäynti 
    For pahis.Vihut = Each Vihut
        //Piirretään pahikselle energia
        Vihollisia = Vihollisia + 1 //Nyt lisätään Vihollisia-muuttujaan niin montakertaa 1, kuin vihollisia on.
        DrawToWorld 0, 0, ON  
            CenterText ObjectX(pahis\obj), ObjectY(pahis\obj), ObjectFloat(pahis\obj), 2
        DrawToWorld 0, 0, OFF 
        
        //Käännetään vihollinen osoittamaan pelaajaa kohti.
        PointObject pahis\obj, ukko
        
        //Jos etäisyys vihollisen ja pelaajan välillä on liian suuri, liikutetaan vihollista pelaajaa kohti.
        If Distance2(pahis\obj, ukko) > 120 Then 
            MoveObject pahis\obj, 0.6
        Else
            //Muuten jos etäisyys pelaajan ja vihollisen välillä on tarpeeksi vähän niin vihollinen avaa tulen.
            If pahis\reload = 0 Then 
                ObjAmmu(pahis\obj)
                pahis\reload = 45
            EndIf 
            
            If pahis\reload > 0 Then pahis\reload = pahis\reload - 1
        EndIf 
        //Joe vihollisen energia-arvo on tasan tai meni alle nollan, niin tuhotaan vihollinen.
        If ObjectFloat(pahis\obj) =< 0 Then 
            DeleteObject pahis\obj
            Delete pahis
        EndIf
    Next Pahis
    

    ukonenergia = ObjectFloat(ukko)
    DrawImageBox imglife, 0, 540, 0, 0, Float(ImageWidth(imglife))/(120.0)*ukonenergia, 20
    
    If Vihollisia = 0 Then MakeError "Voitit! Tapoit kaikki viholliset! Aikaa meni: "+currentTime+"s"
    If ObjectFloat(ukko) =< 0 Then MakeError "Kuolit! Selvisit: "+currentTime+"s"

    //Hypätään aliohjelmaan, tässä aliohjelmassa kaikki panokset päivitää
    Gosub Sub_PäivitäPanokset

    DrawScreen
Until EscapeKey()

//Tässä Tehdään oma komento. Kaikki aloittelijat eivät vielä tunne tätä koodiosaa. 
//Tätä komentoa käytetään esim rivillä 64. :)
Function ObjAmmu(ampuja)
        luoti.AMMUS = New(AMMUS)
        luoti\obj=CloneObject(pati)
        CloneObjectPosition luoti\obj,ampuja                
        CloneObjectOrientation luoti\obj,ampuja  
        
        //Jos ampuja on eri objekti, kuin pelaaja laitetaan panos törmäämään pelaaja-objektiin.
        If ampuja <> ukko Then SetupCollision luoti\obj, ukko, 2, 2, 2 
      
        For pahis.Vihut = Each Vihut
           If pahis\obj <> ampuja Then SetupCollision luoti\obj, pahis\obj, 2, 2, 2
           //Jos yksi vihuista ampuu,
           //Ei anneta tälle viholliselle ja panokselle törmäystunnistusta
        Next pahis
EndFunction 

//Tässä määritellään aliohjelma.
Sub_PäivitäPanokset:
    //Panosten peruspäivitys
    For luoti.AMMUS = Each AMMUS
        MoveObject luoti\obj,6
        If CountCollisions(luoti\obj) Then 'Johonkin törmättiin, sen täytyi olla vihollinen, tai pelaaja.. 
            törmättyobjekti = GetCollision(luoti\obj, 1) 'Tämä komento ON todella kätevä, tällä saadaan
                                                         'objektin kahva (englanniksi handle), kahva on muuttujan nimi
                                                         'eli ukko(<- tämä) = LoadObject("ukko.png"). Kahva on oikeasti vain viittaus
                                                         'tietokoneen muistiosoitteeseen, jossa se data on. Eli "ukko" ei ole kuvatiedosto.
                                                         'Vaan se osoittaa sijainnin, missä kuvatiedoston data on.
            energia# = ObjectFloat(törmättyobjekti) 'Tutkitaan törmätyn objektin energia-arvo ja otetaan muuttuja (energia# <-) talteen.
            uusienergia# = energia# - 10 '"tehdään" uusi energia-arvo, eli energia muuttujasta vähennetään kymmenen.
            ObjectFloat törmättyobjekti, uusienergia 'Asetetaan törmätylle objektille uusi energia-arvo.
            DeleteObject luoti\obj
            Delete luoti
            //Jos ei törmätty mihinkään, ja luoti jatkoi ruudun ulkopuolelle niin... tuhotaan se.
        ElseIf ObjectX(luoti\obj)<-400 Or ObjectX(luoti\obj)>400 Or ObjectY(luoti\obj)<-300 Or ObjectY(luoti\obj)>300 Then     
            DeleteObject luoti\obj
            Delete luoti
        EndIf        
    Next luoti   
Return
Last edited by MaGetzUb on Thu Mar 10, 2011 8:03 pm, edited 3 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Yksinkertainen "sotapelin" alku aloittelijoille!

Post by Awaclus » Wed Mar 09, 2011 6:08 pm

Sotapeli tarkoittaa yleensä RTS:ää, paremmin kuvaava sana olisi räiskintäpeli.

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Yksinkertainen "sotapelin" alku aloittelijoille!

Post by MaGetzUb » Wed Mar 09, 2011 6:42 pm

Chaosworm wrote:Sotapeli tarkoittaa yleensä RTS:ää, paremmin kuvaava sana olisi räiskintäpeli.
Fix'd. Kelpaako nyt herralle?
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
TukeKoodi
Active Member
Posts: 142
Joined: Thu Feb 03, 2011 8:40 pm
Location: C:\Työpöytä

Re: Yksinkertainen räiskintäpelin alku aloittelijoille!

Post by TukeKoodi » Sun Mar 20, 2011 1:19 am

Code: Select all

//Vihut Tyyppikokoelma, sisältää objektimuuttujan ja latausaika-muuttujan. 
Type Vihut
    Field obj                'Itse objekti
    Field reload             'Vihollisen latausaika
End Type

Type ASE
    Field bulletsPerShot As Integer
    Field hajonta As Float
    Field latausaika As Integer
    Field nimi As String
    Field kaliiperi As String
    Field nopeus As Integer
    Field lähtönopeus As String
EndType


//Ammus tyyppikokoelma, sisältää lentävän luodin objektimuuttujan.
Type AMMUS
    Field obj                
End Type 


SCREEN 800, 600


imglife = LoadImage("Media\life.jpg") //Ladataan energiapalkki kuva, joka merkitsee pelaajan energiamäärää.
Global ukko //Tehdään allaolevasta ukosta "globaali" eli tämä sama muuttuja näkyy jokapuolella koodia, myös 
            //repeat-silmukan alapuolella.
ukko=LoadObject("Media\soldier.bmp",72)
ObjectFloat ukko, 120 'Asetetaan pelaajalle energia

vihu = LoadObject("Media\soldier.BMP", 72) 

Global pati //Laitetaan panos näkymään kaikkialla.
pati=LoadObject("Media\bullet.bmp")

ShowObject pati,OFF
ShowObject vihu, OFF


pistooli.ASE = New (ASE)
pistooli\bulletsPerShot = 1
pistooli\hajonta = Rnd (1,2)
pistooli\latausaika = 150
pistooli\nimi = "Glock 17"
pistooli\nopeus = 8
pistooli\kaliiperi = "9x19 mm Parabellum"
pistooli\lähtönopeus = "375 m/s"

haulikko.ASE = New (ASE)
haulikko\bulletsPerShot = 8
haulikko\hajonta = Rnd (4,16)
haulikko\latausaika = 500
haulikko\nimi = "Benelli M4 Super 90"
haulikko\nopeus = 7
haulikko\kaliiperi = "12/76"
haulikko\lähtönopeus = "400 m/s"

rynnäkkökivääri.ASE = New (ASE)
rynnäkkökivääri\bulletsPerShot = 1
rynnäkkökivääri\hajonta = Rnd (1,2)
rynnäkkökivääri\latausaika = 80
rynnäkkökivääri\nimi = "AK-47"
rynnäkkökivääri\nopeus = 8
rynnäkkökivääri\kaliiperi = "7.62 mm"
rynnäkkökivääri\lähtönopeus = "710 m/s"

kivääri.ASE = New (ASE)
kivääri\bulletsPerShot = 1
kivääri\hajonta = Rnd (1,3)
kivääri\latausaika = 500
kivääri\nimi = "Mauser Karabiner 98k"
kivääri\nopeus = 12
kivääri\kaliiperi = "7.92 x 57 mm"
kivääri\lähtönopeus = "760 m/s"

nykyinen.ASE = First (ASE)
LatausLaskuri = 0


//Luodaan viholliset, tehdään niitä 10
For i = 0 To 10
    pahis.Vihut = New(Vihut)
    pahis\obj = CloneObject(Vihu)
    SetupCollision pahis\obj, ukko, 2, 2, 2 //Viholliset törmäävät pelaajaan.
    PositionObject pahis\obj,Rand(-400, 400), Rand(-300, 300) //Sijoitetaan viholliset satunnaisiin kohtiin ruudulla.
    ObjectFloat pahis\obj, 100 'Asetetaan pahikselle energia
Next i
aloitsuaika = Timer()

//Viholliset törmäävät nyt toisiinsa.
For pahis.Vihut = Each Vihut
    For pahis2.Vihut = Each Vihut
        If pahis <> pahis2 Then SetupCollision pahis\obj, pahis2\obj, 2, 2,2
    Next pahis2
Next pahis

Repeat
    ClearText 
    currentTime = (Timer() - aloitsuaika)/1000 //Tehdään muuttuja, josta lasketaan 
                                               //aloitusaikamuuttujan ja nykyisen ajan välinen erotus.
    AddText "Aikaa mennyt: "+currentTime       //Kirjoitetaan ruutuun tarvittavat tekstit
    AddText "Nuolista ohjaa, CTRL=ampuu"
    
    
    Text 0,60, nykyinen\nimi
    
    If lisäinfo = True Then
        Text 0,60, "Ammuksia kerrallaan: "+nykyinen\bulletsPerShot+" kpl"
        Text 0,75, "Hajonta: "+nykyinen\hajonta+" cm"
        Text 0,90, "Latausaika: "+nykyinen\latausaika+" sek"
        Text 0,105, "Luodin lähtönopeus: "+nykyinen\lähtönopeus
        Text 0,120, "Kaliiperi: "+nykyinen\kaliiperi
    EndIf
    
    If KeyHit (cbKeyA) And lisäinfo = False Then
        lisäinfo = True 
    EndIf
    
    If lisäinfo = True And KeyHit (cbKeyZ) Then
        lisäinfo = False
    EndIf
    
    If KeyHit (cbKeySpace) Then
        If nykyinen <> Last (ASE) Then
            nykyinen.ASE = After (nykyinen)
        Else
            nykyinen.ASE = First (ASE)
        EndIf
    EndIf
    
    
        If KeyDown (cbKeyRControl) And Lataa = False Then
        For i = 1 To nykyinen\bulletsPerShot
            luoti.AMMUS = New (AMMUS)
            luoti\obj = CloneObject (pati)
            PositionObject luoti\obj, ObjectX(ukko), ObjectY(ukko)
            CloneObjectOrientation luoti\obj, ukko
            TurnObject luoti\obj, Rnd (-nykyinen\hajonta, nykyinen\hajonta)
                        For pahis.Vihut = Each Vihut
           If pahis\obj <> ampuja Then SetupCollision luoti\obj, pahis\obj, 2, 2, 2
           //Jos yksi vihuista ampuu,
           //Ei anneta tälle viholliselle ja panokselle törmäystunnistusta
        Next pahis
        Next i
        
        Lataa = True
        LatausLaskuri = Timer()
    EndIf
    
    If Lataa And Timer() > LatausLaskuri + nykyinen\latausaika Then Lataa = False
    
    For luoti.AMMUS = Each AMMUS
        MoveObject luoti\obj, nykyinen\nopeus
        If ObjectX (luoti\obj) < -ScreenWidth() / 2 Or ObjectX (luoti\obj) > ScreenWidth() / 2 Or ObjectY (luoti\obj) < -ScreenHeight() / 2 Or ObjectY (luoti\obj) > ScreenHeight() / 2 Then
            DeleteObject luoti\obj
            Delete luoti
        EndIf
    Next luoti
    
    
    
    
    

    //Ukon liikutus..
    If LeftKey() Then TurnObject ukko,5
    If RightKey() Then TurnObject ukko,-5
    If UpKey() Then MoveObject ukko,3.5
    If DownKey() Then MoveObject ukko,-2.45
    
    If reload>0 Then reload=reload-1

    DrawGame

    //Kun käydään viholliset lävitse lasketaan samalla niiden määrä
    Vihollisia = 0 //Asetetaan vihollisten määrä aina aluksi nollaan
    //Vihollisten läpikäynti 
    For pahis.Vihut = Each Vihut
        //Piirretään pahikselle energia
        Vihollisia = Vihollisia + 1 //Nyt lisätään Vihollisia-muuttujaan niin montakertaa 1, kuin vihollisia on.
        DrawToWorld 0, 0, ON  
            CenterText ObjectX(pahis\obj), ObjectY(pahis\obj), ObjectFloat(pahis\obj), 2
        DrawToWorld 0, 0, OFF 
        
        //Käännetään vihollinen osoittamaan pelaajaa kohti.
        PointObject pahis\obj, ukko
        
        //Jos etäisyys vihollisen ja pelaajan välillä on liian suuri, liikutetaan vihollista pelaajaa kohti.
        If Distance2(pahis\obj, ukko) > 120 Then 
            MoveObject pahis\obj, 0.6
        Else
            //Muuten jos etäisyys pelaajan ja vihollisen välillä on tarpeeksi vähän niin vihollinen avaa tulen.
            If pahis\reload = 0 Then 
                ObjAmmu(pahis\obj)
                pahis\reload = 45
            EndIf 
            
            If pahis\reload > 0 Then pahis\reload = pahis\reload - 1
        EndIf 
        //Joe vihollisen energia-arvo on tasan tai meni alle nollan, niin tuhotaan vihollinen.
        If ObjectFloat(pahis\obj) =< 0 Then 
            DeleteObject pahis\obj
            Delete pahis
        EndIf
    Next Pahis
    

    ukonenergia = ObjectFloat(ukko)
    DrawImageBox imglife, 0, 540, 0, 0, Float(ImageWidth(imglife))/(120.0)*ukonenergia, 20
    
    If Vihollisia = 0 Then MakeError "Voitit! Tapoit kaikki viholliset! Aikaa meni: "+currentTime+"s"
    If ObjectFloat(ukko) =< 0 Then MakeError "Kuolit! Selvisit: "+currentTime+"s"

    //Hypätään aliohjelmaan, tässä aliohjelmassa kaikki panokset päivitää
    Gosub Sub_PäivitäPanokset

    DrawScreen
Until EscapeKey()

//Tässä Tehdään oma komento. Kaikki aloittelijat eivät vielä tunne tätä koodiosaa. 
//Tätä komentoa käytetään esim rivillä 64. :)


//Tässä määritellään aliohjelma.
Sub_PäivitäPanokset:
    //Panosten peruspäivitys
    For luoti.AMMUS = Each AMMUS
        MoveObject luoti\obj, nykyinen\nopeus
        If CountCollisions(luoti\obj) Then 'Johonkin törmättiin, sen täytyi olla vihollinen, tai pelaaja.. 
            törmättyobjekti = GetCollision(luoti\obj, 1) 'Tämä komento ON todella kätevä, tällä saadaan
                                                         'objektin kahva (englanniksi handle), kahva on muuttujan nimi
                                                         'eli ukko(<- tämä) = LoadObject("ukko.png"). Kahva on oikeasti vain viittaus
                                                         'tietokoneen muistiosoitteeseen, jossa se data on. Eli "ukko" ei ole kuvatiedosto.
                                                         'Vaan se osoittaa sijainnin, missä kuvatiedoston data on.
            energia# = ObjectFloat(törmättyobjekti) 'Tutkitaan törmätyn objektin energia-arvo ja otetaan muuttuja (energia# <-) talteen.
            uusienergia# = energia# - 10 '"tehdään" uusi energia-arvo, eli energia muuttujasta vähennetään kymmenen.
            ObjectFloat törmättyobjekti, uusienergia 'Asetetaan törmätylle objektille uusi energia-arvo.
            DeleteObject luoti\obj
            Delete luoti
            //Jos ei törmätty mihinkään, ja luoti jatkoi ruudun ulkopuolelle niin... tuhotaan se.
        ElseIf ObjectX (luoti\obj) < -ScreenWidth() / 2 Or ObjectX (luoti\obj) > ScreenWidth() / 2 Or ObjectY (luoti\obj) < -ScreenHeight() / 2 Or ObjectY (luoti\obj) > ScreenHeight() / 2 Then
            DeleteObject luoti\obj
            Delete luoti
            EndIf
    Next luoti   
Return





Function ObjAmmu(ampuja)
        luoti.AMMUS = New(AMMUS)
        luoti\obj=CloneObject(pati)
        CloneObjectPosition luoti\obj,ampuja                
        CloneObjectOrientation luoti\obj,ampuja  
        
        //Jos ampuja on eri objekti, kuin pelaaja laitetaan panos törmäämään pelaaja-objektiin.
        If ampuja <> ukko Then SetupCollision luoti\obj, ukko, 2, 2, 2 
      
        For pahis.Vihut = Each Vihut
           If pahis\obj <> ampuja Then SetupCollision luoti\obj, pahis\obj, 2, 2, 2
           //Jos yksi vihuista ampuu,
           //Ei anneta tälle viholliselle ja panokselle törmäystunnistusta
        Next pahis
EndFunction 
Lisäsin aseita. Myös panoksen poistaminen on muokattu niin että oli ruutu määritelty minkä kokoiseksi tahansa, ammus poistuu reunalla.
Eli If ObjectX (luoti\obj) > -400 -> If ObjectX (luoti\obj) > -ScreenWidth / 2
Aloittelija, koodaaja, jotain...
CbFUN :D

Post Reply