Helppiä!
Re: Helppiä!
Ehkä sinun ei kannattaisi tehdä joka kysymyksellesi uutta topikkia.
Kysy vaikka Tyhmissä Kysymyksissä. Tai kysele edellisissä topikeissasi.
Kysy vaikka Tyhmissä Kysymyksissä. Tai kysele edellisissä topikeissasi.
Re: Helppiä!
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.
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.
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
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
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ä .Chaosworm wrote: ... niin apu löytyisi ehkä helpommin, mutta sitä ei kyllä löydy, jos pyytää toisia koodaamaan puolestaan.