Helppiä!

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Panzur
Newcomer
Posts: 32
Joined: Sat Jun 06, 2009 6:26 pm

Helppiä!

Post by Panzur »

Miten saan peliini Final Fantasy tyyliset vuoropohjaiset taistelut??
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Helppiä!

Post by Viltzu »

Ehkä sinun ei kannattaisi tehdä joka kysymyksellesi uutta topikkia.
Kysy vaikka Tyhmissä Kysymyksissä. Tai kysele edellisissä topikeissasi.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Helppiä!

Post by Jonez »

Itse toteuttaisin vuoropohjaisen taistelun suunnilleen näin:
1. Tyyppikokoelma taisteleville hahmoille
2. Käydään tyyppikokoelma läpi. Jos stamina (hyökkäysvalmius) < täydet, lisätään sitä.
3. Jos stamina >= täydet, hahmo joko hyökkää (jos tietokoneen ohjaama), tai peli antaa pelaajalle hallinnan ko. hahmoon.

Code: Select all

For iHahmo.hahmot = Each hahmot
        
    If iHahmo\stamina = TÄYDET Then
        If iHahmo\tyyppi = PELAAJA Then
            iHahmo\kontrolli = 1
        ElseIf iHahmo\tyyppi = CPU Then
            Hyökkää()
        EndIf
    EndIf
    
    If iHahmo\kontrolli = 1 Then
        PelaajaVoiHallita()
    EndIf
    
Next iHahmo
4. Kun hyökkäyskäsky on annettu, piirretään animaatio haluttuun tyyliin. Arvotaan osumat riippuen kyvyistä, aseista ja tuurista.
5. Stamina tiputetaan nollaan.

Tässä on taistelusysteemiesimerkki missä pelaaja ei voi itse vaikuttaa. Hahmot hyökkäävät välittömästi kun pystyvät. Kysy jos on jotain epäselvää koodista.

Code: Select all

Const STAM_MAX = 150        //hahmojen max-stamina ja health
Const HEALTH_MAX = 150

//Hahmot
Type tChars
    Field cChar As String       'kuva
    Field cTeam As Byte         'tiimi
    Field cX                    'koordinaatit
    Field cY
    
    Field cStamina As Float     'stamina
    Field cStaminaUp As Float   'staminan nousukerroin
    Field cHealth As Float      'elämä
   
    Field cHit                  'hit. Selitetään myöhemmin
    Field cTargetId             'Kohde. Säilöö toisen jäsenen muistiosoitteen.
EndType

//Luodaan neljä hahmoa, joista 2 on samassa tiimissä. Tiimejä siis on 3. 
NewChar( 1, "A", 200, 200 )
NewChar( 1, "A", 200, 100 )
NewChar( 2, "B", 100, 100 )
NewChar( 3, "F", 10, 100 )

//funktio hahmon luonnille
Function NewChar( _team, _char As String, _x, _y )
    nc.tChars = New( tChars )
    nc\cChar = _char
    nc\cTeam = _team
    nc\cX = _x
    nc\cY = _y
    
    nc\cHealth = HEALTH_MAX
    
    nc\cStamina = 0
    nc\cStaminaUp = Rnd( 0.5, 0.9 )
EndFunction

//pääsilmukka
Repeat
    
    //käydään kaikki hahmot läpi ...
    For ic.tChars = Each tChars
        bDeleteChar = False
        
        //Jos stamina ei ole täysissä, lisätään sitä.
        If ic\cStamina < STAM_MAX Then
            ic\cStamina = ic\cStamina + ic\cStaminaUp
            If ic\cStamina > STAM_MAX Then ic\cStamina = STAM_MAX
        Else
        
        //jos stamina ON täysissä, hyökätään ensimmäisen vastustajan kimppuun.
            ic\cStamina = 0
            ic\cHit = 180 'hit saa arvoksi 180, koska hyökkäyksen animaatiossä käytetään siniä,
                          'jolle voi syöttää arvon 0-360. 180 on puolet tästä. Syy käyttöön selvinnee myöhemmin.
            
            //On saatu käsky hyökätä (ic\cStamina = STAM_MAX), joten etsitään ensimmäinen vihollinen.
            For ac.tChars = Each tChars
                If ac\cTeam <> ic\cTeam Then
                    ic\cTargetId = ConvertToInteger( ac ) 'otetaan vihun muistiosoite ylös. 
                    Exit 'poistutaan silmukasta. Targetti löytyi.
                EndIf
            Next ac
            
            //jos vihua ei löydy, sehän tarkoittaa että matsi on voitetty.
            If ic\cTargetId = 0 Then
                MakeError "Team " + ic\cTeam + " voitti!" 'hieno lopetusilmoitus asiasta.
            EndIf
        EndIf

        //jos health = 0, kävi köpelösti. Annetaan käsky tuhota jäsen. HUOM: tässä ei vielä tuhota!
        //Syy: alapuolella vielä käsitellään jäsentä. Jos tuhoaisimme sen nyt, tulisi MAV, koska
        //jäsentä ei ole enää olemassa.
        
        //huomaa että tämä muuttuja palautetaan falseksi silmukan alussa.
        If ic\cHealth <= 0 Then
            bDeleteChar = True
        EndIf

        //tämä kertoo piirrettävien palkkien pituuden.
        palkki_pituus = 15
        
        //stamina-palkki. Kyseessä on prosenttilasku, jossa piirretään palkin kokonaispituudesta
        //(= palkki_pituus) vain osa, sen mukaan kuinka paljon staminaa on.
        Color cbGreen
        Box ic\cX, ic\cY + 15, ic\cStamina / STAM_MAX * palkki_pituus, 2
        
        //Sama kuin stamina-palkki, mutta healthille
        Color cbRed        
        Box ic\cX, ic\cY - 5, ic\cHealth / HEALTH_MAX * palkki_pituus, 2
        
        //team 1:n väri on valkoinen. Kaikkien muiden tiimien väri vihreä.
        If ic\cTeam = 1 Then
            Color cbWhite
        Else
            Color 0, 255, 0
        EndIf

        //piirretään hahmo oletuksena sen oletussijaintiin.
        _dX = ic\cX
        _dY = ic\cY
        
        //Jos hahmo on saanut käskyn hyökätä. Se etenee ...
        If ic\cHit Then
            //tämä kertoo hyökkäys-animaation nopeuden. Suurempi nopeampi. Tämä muuttuja on se, joka
            //periaatteessa liikuttaa hahmoa.
            ic\cHit - 5 
            
            //Otetaan selville hyökkäävän hahmon kohde
            tc.tChar = ConvertToType( ic\cTargetId )
            
            //lasketaan pituus ja kulma kohteeseen.
            _dist = Distance( ic\cX, ic\cY, tc\cX, tc\cY )
            _angle# = GetAngle( ic\cX, ic\cY, tc\cX, tc\cY )
            
            //lasketaan liikkuneen hahmon sijainti kohteeseen...
            _tempDist = Sin( ( ic\cHit ) ) *  _dist
            
            //lasketaan koordinaatit kohteeseen
            _dX = ic\cX + Cos( _angle ) * _tempDist
            _dY = ic\cY - Sin( _angle ) * _tempDist

            //Jos hahmo on päättänyt hyökkäyksensä (on alkuperäisessä sijainnissaan...)
            If ic\cHit <= 0 Then
                //Vastustaja menettää healthia 10 - 20. Tässä ei ole huteja tai kritikaleja koodattu.
                tc\cHealth = tc\cHealth - Rand( 10, 20 )             
                ic\cHit = 0
                ic\cTargetId = 0
            EndIf
        EndIf
                
        //piirretään hahmo koordinaatteihinsa, oli se sitten alkuperäinen sijainti tai hyökkäysanimaation
        //tietty kohta ...
        Text _dX, _dY, ic\cChar        
        
        //Vasta nyt tarkastetaan kuuluuko hahmon kuolla. Jos kuuluu, poistetaan se.
        If bDeleteChar Then
            Delete ic
        EndIf
    Next ic

    DrawScreen
Forever
Chaosworm wrote: ... niin apu löytyisi ehkä helpommin, mutta sitä ei kyllä löydy, jos pyytää toisia koodaamaan puolestaan.
Valitettavasti näköjään löytyy. Mutta en tiennyt miten tämän selittää paremmin kuin koodiesimerkillä. Ehkä huono tapa. Onneksi koodi ei ole kaikin osin kovin aloittelijaystävällistä ;).
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Post Reply