Programazioa-3

Gaur, aurreko ariketako Baloia mugiaraziko dugu teklatuarekin.
Horretarako F3_TeklatuBidezMugitu ZilchScript berria egingo dugu eta noski, Baloia-ri esleituko diogu osagai gisa.

Initialize funtzioaren barruan, ondoko komandoa exekutatu behar da, script honetan definituko dugun OnLogicUpdate funtzioa exekuta dadin(segunduko 60 aldiz!).  Komentatuta egongo da, beraz, deskomentatzea baino ez duzue egin beharko. Ez balitz horrela, kopiatu beheko lerroa:

 Zero.Connect(this.Space, Events.LogicUpdate, this.OnLogicUpdate);

Honek egiten duena ondokoa da: Space objetuak segunduko 60 aldiz bidaltzen duen "LogicUpdate" gertakizunaren (eventoaren) mezua jaso nahi duela esaten du, eta jasotzerakoan, klase honetako (hau da, fitxategi honetako) OnLogicUpdate izeneko funtzioa exekutatu behar dela esan.

Ondoren, ondoko kodea ea daukazun ikusi (PRINTZIPIOZ, BUKAERAN IZANGO DUZU) eta SOILIK EZ BADUZU, kopiatu eta itsatsi klasearen barruan (azken "}" baino lehen) baina Initialize funtziotik kanpo(bere azken ˝}"-ren ondoren):
function OnLogicUpdate(event : UpdateEvent){}

1-Sakatutako teklen arabera mezua erakutsi...

 
OnLogicUpdate funtzio honen barruan, hau da, bere giltzen artean, idatziko dugu kodea oraingoan. 

Kopiatu ondoko kodea OnLogicUpdate funtzioaren barruan:

       // Sakatuta baldin badago goranzko geziko tekla,
       if (Zero.Keyboard.KeyIsDown(Keys.Up)) 
       {
           // Mezu bat erakutsi oraingoz.
           Console.WriteLine("Gora");
       }
     // Sakatuta baldin badago beherzanzko geziko tekla,
     if (Zero.Keyboard.KeyIsDown(Keys.Down)) 
     {
           // Mezu bat erakutsi oraingoz.
           ...
     }     ...

Zeuk egizu!
Beheranzko tekla (Keys.Down) sakatuta mantenduz gero, erakutsi "Behera".
Ezkerreranzko tekla (Keys.Left) sakatuta mantenduz gero, erakutsi "Ezkerrera".
Eskuineranzko tekla (Keys.Right) sakatuta mantenduz gero, erakutsi "Eskuinera".

Ez dugu if - else if egitura erabili bi tekla aldiberean sakatzeko aukera emateko!

Zenbat aldiz idazten du mezua? Askotan?...Segunduko 60 aldiz gutxigorabehera...

Oraindik ez dugu sprita mugitu, baina froga dezakezu ea jasotzen duzun dagokion mezua teklak sakatzerakoan.

2-Sprite-a mugiarazten

Gure "Baloia" sprite-a mugitzeko (this.Owner), bere Transform osagaiko Translation ezaugarria aldatu beharko genuke, ez? (Horren bidez aldatzen da sprite baten kokapena!)

Mezuaren ordez, ondoko kodea idatz ezazu gora mugi dadin:(eta antzekoa beste teklen kasuan, noski)
      // Sakatuta baldin badago goranzko geziko tekla,      if (Zero.Keyboard.KeyIsDown(Keys.Up)) 
      {
           // Mezu bat erakutsi oraingoz.
           Console.WriteLine("Gora");
// Gora mugitu pausu bat (y ardatzean +1) this.Owner.Transform.Translation += local Real3(0.0, 1.0, 0.0); }
local Real3(a,b,c) idazten dugunean, hiru osagai horiek (a,b eta c) dituen bektore baten balioa adierazten ari gara. 
this.Owner.Transform.Translation bektore bat da, spritearen posizioa ematen diguna eta beraz, bektore horri, bektore bat gehitu behar diogu, ezin zaio zenbaki bat gehitu.
Noski, ezkerretara mugitzeko, x ardatzean balio negatiboa gehitu, eskuinera mugitzeko x ardatzean balio positiboa gehitu eta behera joan dadin y ardatzean balio negatiboa gehituko genioke, ez?

Zeuk egizu!
  • Ezkerreranzko tekla sakatuta mantenduz gero, mugitu sprite-a (this.Owner) ezkerretara.
  • Goranzko tekla sakatuta mantenduz gero, mugitu sprite-a (this.Owner) gora. 
  • Beheranzko tekla sakatuta mantenduz gero, mugitu sprite-a (this.Owner) behera.
Baina egia esan, horrela eginda, nahiko mugimendu artifiziala lortu dugu. Gora eta eskuinerako teklak sakatuz gero, lehendabizi gora mugituko da eta ondoren eskuinera. Beharbada, modurik egokiena hau ekiditzeko, aldagai baten laguntzaz egitea izango zen.

3-Konponbidea (mugimendu errealagoa aldagai bat erabiliz):


Deklaratuko dugu mugimendua izeneko aldagai bat OnLogicUpdate funtzioaren hasieran, honela:
var mugimendua : Real3 =local Real3(0.0,0.0,0.0);

Ondoren, tekla bat sakatuz gero exekutatuko den kode zatian, dagokion norabidean mugimendua aldagaiaren balioa aldatuko dugu:
Aurretik zegoen komandoa komentatu (// aurretik) edo ezabatu!
// Gora mugitu(y ardatzean) 
// this.Owner.Transform.Translation += local Real3(0.0, 1.0, 0.0);// Aldagaiaren y ardatzean 1 gehitu (gora)           mugimendua.Y += 1.0;
Baldintza guztietan aldaketa hau modu egokian egin dugunean, kasu bakoitzean ardatz egokian (X edo Y) bat GEHITUZ EDO KENDUZ,noranzkoaren arabera, mugimendua aldagaiak, noranzko guztietan egin behar den mugimendu aldaketa izango du, eta beraz, orain exekutatuko genuke benetan sprite-a mugitzeko kodea:

Ondoko komandoa, noski, baldintza guztien ondoren, idatzi:

 //Mugitu!          this.Owner.Transform.Translation += mugimendua;

Frogatzen baduzue, konturatuko zarete azkarregi mugituko dela!

Noski, OnLogicUpdate funtzioa segunduko hirurogei aldiz exekutatzen bada, guk klik bat egiten dugun bitartean, kode hau askotan exekutatuko da eta beraz, pausu edo frame bat mugitu beharrean pausu asko emango ditu!
Gainera tekla bat baino gehiago sakatuta badaude(adibidez gora eta eskuinera) egingo duen desplazamendua eta soilik bat badago sakatuta, egingo duen desplazamendua desberdina izango da...

4-Konponbidea (astiroago joan dadin):

Hori konpontzeko, hauxe egin dezakegu:
Goiko bi lerroen ordez, ondoko kodea idatziko ditugu.

  //mugimendua bektorea, noranzko bereko baina modulua bat duen bektorea bihurtu.  mugimendua = Math.Normalize (mugimendua);
 //Mugitu!          this.Owner.Transform.Translation += mugimendua * event.Dt;//event.Dt'ren balioarekin biderkatuz (1/60), segunduko frame bat mugitzea lortuko dugu.
Orain, beharbada astiroegi????

Hau erraz konponduko duzue "Abiadura" izeneko Property-a definituz

Definitu Property modura aldagai berri bat abiaduraren balioa kanpotik konfiguratu ahal izateko. (Abiadura izena egokia izan daiteke!)
(Hori gogoratu Initialize funtzioa baino lehen egin behar duzuela!)
Orain, mugitzeko komandoan aldaketa txiki bat egizue abiaduraren balioaren arabera arinago edo astiroago mugi dadin.

Gogoratu property-ak klase aldagaiak izan behar direla (Maiuskulaz hasitako izena izan behar dute beraz) eta beraiei erreferentzia egiteko "this." aurretik ipini behar dela.

(Mugitzeko komandoan, this.Abiadura -rekin biderkatu!)
Ikus dezagun emaitza! (Erakutsi niri bukatutakoan!!!)

ARIKETA PROPOSAMENA: P3_HegazkinKontrolatzailea



iruzkinik ez:

Argitaratu iruzkina

Idatzi zure komentarioa. Laster argitaratuko dut. Mila esker!