Teeme ise RTSi 5.osa
Asi hakkab juba TÕSISELT ilmet võtma. Viienda osa GM6-failis joonistasin ka vähe muhedama muru. See eelmine oli
vast liiga erk ja rõõmus sellise tõsise mängu kohta, mis meil käsil on. Pimedad ajad ja muu taoline värk...

Kui sa neljanda osaga ühele poole said, ei jäänud sulle märkamata, et mõõgamehed tõmblevad kohapeal.

1. Kuna me ei tee mängu keskaja tantsustiilidest, tuleks see ära muuta.

Võta lahti palli (jah, objekt on ikka veel palli nimetusega :D) STEP event.

kood:

if ((liigub = 0)  && (v6itleb = 0))
image_single = 0;

See lõpetab tantsu.

Võitleb? Jaa. Me ei saa käskida meest mitte liigutada ainult sellepärast et ta ei kõnni... ta võib ju võidelda parajasti...

Võta lahti script "tee_yksus" ja lisa ka sinna see - ja veel üks uus muutuja. Mõõgamehe tegemise osasse.

v6itleb = 0;
anim = .3;

Anim on muutuja, mis hakkab näitama, kui kiiresti mehe animatsioon (kõndimine, võitlus, jms) mängib.
Sellise asja järele tekkis vajadus, kuna Game Maker käitub vahel suht lollisti: Kui me paneme seisva
mehe animeerima uuesti, "unustab" GM ära, kui kiire oli mehe animatsioon enne seismajätmist.
Selle pärast.

Nagu näed, läheb iga liigutusega asi aina keerulisemaks - iga asi mille me teeme, mõjutab teisi.

Nüüd  on mees vaikimisi liikumatu. Aga kõndimise ajaks peame ta tantsima panema.
Kui sa nüüd mäletad, siis liikuma sundisime teda GUI objekti STEP eventist, siit:


if (mouse_check_button_pressed(mb_right))
 {
  with (pall)
  {
   if (vali = 1)
   {
    minex = mouse_x;
    miney = mouse_y;
    liigub = 1;
   }
  }
 }

Jääb üle vaid sinna vahele sokutada käsk tantsimiseks...

if (mouse_check_button_pressed(mb_right))
 {
 with (pall)
 {
  if (vali = 1)
  {
  minex = mouse_x;
  miney = mouse_y;
  liigub = 1;
  image_single = -1; 
  image_speed = anim;
  }
 }
} 

Ja kõndimisega ongi asi ühel pool.
Nüüd, kus me saame mehi valida ja liigutada, ei pääse kuhugi - tuleb hakata ehitama süsteemi võitlemiseks.
Hinga sügavalt sisse...

valmis?

2. Võitlusse!!!

Kõigepealt on meil vaja ohvrit.
Aga kas meil pole kena kollast palli, keda klobida?

Tee uus objekt. Nimeks paneme "pm". Nagu "paha mõõgamees".
Lühikesed objektinimed muudavad elu väga mugavaks, tähtis on ainult mäletada, mis on mis.
Muidugi pane uuele objektile ka sprite ja selleks esialgu kollase palli oma.

Ja aseta ruumi üks kollane pall, soovitavalt mõõgameestest kaugemale kui 100 pikslit, et me saaks asju mugavamalt testida.
Lihtsuse mõttes võiksime pallile anda mõõgamehe muutujad.

Ava palli CREATE event, ja koodi sinna:



tee_yksus("mõõgamees");

Nüüd on kollasel pallil olemas samad muutujad mis mõõgamehelgi.

Nüüd aga tuleb jälle joonistada - mõõgamees peab ju kuidagi palli ründama.
Tähtis on, et mõõgaga löömise animatsioon ei oleks pikem kui kõndimise oma!!
Ja soovitavalt ka mitte lühem. Minu mõõgamees kõndis 6 kaadri abil, nii teen ka ründamise.



Selline tuli.  Täitsa usutav, kusjuures. Sprite nimeks sai s_m66k_r

r - nagu "ründama"

Nüüd on vaja see ka ära deklareerida, "tee_yksus" scriptis.
Sinna kus deklareeriseme tavalise sprite (tavaline)
Lisame järgmiseks reaks ka ründamise sprite. Ehk  kood:

rynnakl = s_m66k_r;

Ah et miks see "L" seal lõpus on? Selle pärast, et see on Lähedalt ründamise animatsioon.
Mul tuli mõte teha vibumehed, kes kaugelt ründavad nooltega, lähedalt aga noaga. See annaks mängule kõvasti
taktikalist väärtust. :)
Neil aga oleks kaks animatsiooni, lähedalt ja kaugelt ründamine.

Varsti oleme niikaugel, et tuleb objektidelt kokku korjata kogu kood ja scriptidesse koondada. Praegu aga veel mitte.

3. Läheb käest ära...

Et kedagi rünnata, on tarvis kõigepealt see keegi üles leida.
Siin tuleb mängu muutuja, mille panime mõõgamehele...
Selle muutuja nimi oli "valve". Ja väärtuseks 100.

Nüüd hakkab mõõgamees otsima vastast muutuja "valve" väärtuse jagu pikslite kauguselt...

Kõigepealt teeme uue scripti, nimega "otsi".

Ja sinna kood:

var f;
if (argument0 = 1) 
{
  if (instance_exists(pm))
   {
    f = (instance_nearest(x,y,pm)); 
   if (distance_to_object((f)) < self.valve)
    {
    vaenlane = (instance_nearest(x,y,pm)).id; 
   } 
   else
   vaenlane = 0; 
  } 
}

Kõigepealt teen kiire muutuja F. Seda sellepärast, et Game Maker on kohati haruldaselt loll ja ei suuda funktsiooni
funktsioonis täita..

Nii. Edasi:

---kui scripti "otsi", "kutsuti" argumendiga 1
--Kui ruumis on olemas vähemalt 1 objekt nimega pm
--- muutuja f väärtus on (mõõgamehele) lähim objekt nimega pm
-----nüüd, kui see objekt (f) on mehele lähemal kui 100 pikslit ("valveala")
-------mehe muutuja "vaenlane" saab väärtuseks selle lähima objekti "pm" id-numbri
------vastasel juhul on mehe muutuja "vaenlane" väärtus 0

Ehk siis... oeh...

Me vaatame, kas vaenlase objekte üldse on OLEMAS.
Siis, teeme muutuja F, kuhu paneme lähima vaenlase objekti nimetuse (id)
Vaatame, kas see lähim vaenlane on küllalt lähedal et teda sihtmärgiks märkida
Kui jah, saab pall või õigemini mõõgamees -- teda, et tema sihtmärk on see lähim vastase objekt.

Ehk siis (täiesti põhiline seletus)
-Leiame lähima tõpra
-Kui ta on liiga lähedal
-seame ta oma sihtmärgiks

-----------------------------
See on täitsa tore kood, nüüd teame täpselt mida edasi teha, kui ründamiseks läheb.
Et kelle poole liikuda ja millal lahmida.

Scripti "otsi" kutsusin argumendiga selle jaoks, et panna pärast "vaenlased" samamoodi "häid" mehi otsima.
Siis pole vaja vaenlastele eraldi scripti teha.
Lihtsalt vahetame argumendi väärtuse ja objekti nime, keda oma valve-piirkonnast otsida tuleb.

Kui sa olid tähelepanelik, siis märkasid kahtlasevõitu muutujat nimega "ID". Ja kui veel tublim, uurisid ise
manualist järgi, mis loom see id on. Aga kui ei tea, seletan:
Ütleme, et meil on 3 mõõgameest. Kõik on sama objekt. Kõigil samad muutujad. ON võimalik teha ka nii,
et neil on täpselt sama x ja y, animatsioon, jne jne.
Kuidas neil vahet teha siis, et kes on kes?
Selline võimalus on Game Makeris õnneks olemas. Iga objekt mis tekib, saab kohe muutuja "id" ja mingi väärtuse.
Tavaliselt järjekorranumbri alates 10000-st. Kõik võib objektidel sama olla, kuid ID ei kordu mitte kunagi. Nagu DNA.

Nii saamegi mõõgamehel lasta vaenlasekarja seast välja valida ühe kindla vaenlase, keda ta ründama hakkab.
Selleks ongi meil muutuja "vaenlane". Kohe, kui sihtmärk valitud, saab mõõgamehe muutuja "vaenlane" oma väärtuseks 
vaenlase objekti ID numbri. Ja selle järgi teab ta alati, kuhupoole astuda või mõõgaga lahmida.
Umbes nagu et linnas elab miljon inimest ja vangi tuleb panna kindla isikukoodiga tüüp. Võimatu eksida ju?

See vaenlase otsimise kood  on veel väga poolik, sest otsime vastast ainult ühe nimega objektide seast. 
Ehk siis samade objektide seast.

Julmalt raskemaks läheb siis, kui vaenlasi on mitu (mitu ERI objekti) ja tuleb valida, keda rünnata.
Ei ole ju loogiline, kui mõõgamees läheb killima teist mõõgameest 100 piksli kaugusel, kui 10 piksli 
kaugusel seisab nõrguke vibumees... ja nii edasi. Ka siin kulub objektide id muutujasse sisestamine
marjaks ära. Aga sellest hiljem.

Esialgu on meil olemas kood vastase leidmiseks ja määramiseks. Proovime nüüd seda kasutada ja vaatame mis saab.

Et seda testida, võtame ette objekti "pall" DRAW eventi.
Sinna, ENNE spritede joonistamise ridu paar sellist rida:



if (vaenlane != 0)
draw_line(x,y,((vaenlane)).x,((vaenlane)).y);

Et kui meil on juhtumisi sihtmärk välja valitud, joonistame temani joone. See on ainult testimise otstarbel, pärast kustutame need
read ära.

Ja nüüd sunnime palli (mõõgamehe) otsima vaenlast.

STEP event:



otsi(1);

Ja nii lihtne ta ongi.
Paneme mängu käima ja...

Kõnnime pallile 100 piksli kaugusele vähemalt -- joon sihib oranzi palli.
Lähme eemale -- mõõgamees ei näe oma "valvealas" vaenlast ja joon (nagu ka sihtmärk) kaob.

On ikka tore küll.



Selle osa GM6 (game maker 6.1 regatud)