Level3 izeneko level berrian egingo dituzue ondoko ariketak.
Baloia izeneko Sprite bat sortu. Baloi hau teklatuarekin mugiaraziko dugu!
Horretarako TeklatuBidezMugitu ZilchScript berria egingo dugu eta noski, Baloia-ri esleituko diogu osagai gisa.
Oraingoan, mugitzeko kodea OnLogicUpdate funtzioaren barruan idatziko dugu, denbora guztian exekutatzen egon dadin.
Initialize funtzioan, ondoko komandoa komentatuta dago. Deskomentatu beharko duzue OnLogicUpate exekuta dadin, hau da, aurreko bi lerrotxoak kendu!
//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.
Hemendik aurrera, OnLogicUpdate funtzioaren barruan (bere giltzen artean) idatziko dugu proposatutako kodea.
Pixkanaka joango gara...
Zero.Keyboard objektua teklatua da eta KeyIsDown komandoarekin egiaztatu ahal dugu ea tekla bat sakatuta ote dagoen.
Keys.Up goranzko geziari dagokio. ("Keys." sakatuz, tekla guztien zerrenda agertuko da eta aukeratu ahal izango duzu nahi duzun tekla)
// Sakatuta baldin badago goranzko geziko tekla,
if (Zero.Keyboard.KeyIsDown(Keys.Up))
{
Console.WriteLine("Gora");
}
// Sakatuta baldin badago beheranzko geziko tekla,
if (Zero.Keyboard.KeyIsDown(Keys.Down))
{
//Zure kodea hemen
}
Jarraitu zure kabuz kode egokia idazten Right (Keys.Right) eta Left (Keys.Left) teklak sakatuz gero, Consoletik dagokion mezua ager dadin.
Oraingoan ez dugu if ...else if ....else if egitura erabiltzen, aukera egon dadin aldiberean bi tekla sakatuta egon daitezen. Egizu froga ea bi tekla aldiberean sakatuz (Gora eta eskuinera adibidez) zer gertatzen den.
Ezabatu tekla bakoitzaren kasuan idatzitako Console.WriteLine komandoa eta bere ordez idatz ezazu gorriz adierazitako kodea.
// 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 += Real3(0.0, 1.0, 0.0);
}
Kontutan izan Transform osagaiaren Translation ezaugarria dela objektu baten posizioa definitzen duena. Beraz, kasu honetan, kodearen bidez, y ardatzeko balioari gehitzen diogu bat. ( Real3(0,1,0) bektoreak zeroak ditu x eta z ardatzeko balioetan eta bat balioa y ardatzean )
Egizu zure kabuz gauza bera Down, Left eta Right teklak sakatuz gero, noranzko egokian pauso bat mugi dadin.
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 da.
Deklaratuko dugu mugimendua izeneko aldagai bat OnLogicUpdate funtzioaren hasieran, honela:
var mugimendua : Real3 =local Real3(0.0,0.0,0.0);
Ondoren, goranzko tekla sakatuz gero exekutatuko den kode zatian, aurretik zegoen kodea ezabatu eta bere ordez, gorriz adierazitako kodea idatzi:
// Gora mugitu(y ardatzean)
this.Owner.Transform.Translation += local Real3(0.0, 1.0, 0.0);
// Aldagaiaren y ardatzeko osagaian 1 gehitu (gora!)
mugimendua.Y += 1.0;
TEKLA GUZTIEN KASUAN 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 idatzi, baldintza guztien ondoren:
//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...
Jarri ditugun azken 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, astiroegi doa!
Hori berehala konponduko duzu!
Definitu property berri bat Abiadura izenekoa Real3 motakoa: ( Non? Property guztiak bezala, class ..."{" zabaldu eta jarraian, Initialize funtzioaren aurretik )
[Property]
var Abiadura:Real3=Real3(10.0,10.0,0.0);
Mugitzeko komandoan mugimendua aldagaia event.Dt-rekin biderkatu ostean abiadurarekin biderkatu baita (Gogoratu: this.Abiadura).
Egizu froga abiadura balio desberdinekin eta niri erakutsi prest daukazunean!