şimdi, bazı istediğim şeyleri gerçekleştireibldiğim için mutluyum.
ama bir şeyi başaramadım: çapraz gitme.
üst ve sağ tuşuna aynı anda basmayı nasıl tanımlattırabilirim bilmiyorum.
if(key == "39" && key == "40")
dedim, ama olmadı. sonradan düşününce ne kadar saçma bir düşünce olduğunu da anladım. yerine alternatif nasıl bir şey kullanırım diye düşündüm, bulamadım.
çapraz gitme olayını nasıl tanımlattırabilirim?
fazla tekniğe girmeen, fikir olması açısından:
javascript her koşulda iki tuşun da sırayla basıldığını düşünecek.
mesela basılı tutma durumunda (onkeydown) şöyle olabilir;
sağ ve üst olarak düşün. isRightPressed ve isUpPressed gibi iki değişken olsun.
sağ oka basınca isRightPressed'i true yap. üste basınca da isUpPressed'i true yap. ikisinin de true olduğu zaman çapraz gitsin.
/***/
if(isRightPressed && isUpPressed){
çapraz git
}
else if(isRightPressed){
sağa git;
}
else if(isUpPressed){
yukarı git.
}
/***/
gibi
ikisinin aynı anda basılması teknik olarak mümkün değil. eğer basılı tutarak değil kademe kademe ilerleme istiyosan (yani bas çek bas çek gibi), basılan zamanları unixtime/mikrosaniye cinsinden tutup, aradaki farka göre karar verebilirsin.
/***/
rightPressedAt = 1
upPressedAt = 2
if(upPressedAt - rightPressedAt <= 1){
çapraz git
}
else ...
/***/
gibi
peki ya, basılı tutmaya dair hangi fonksiyon işimi görür?
örnek: "x" tuşuna bastım, fonksiyon devreye girdi. parmağı çektim, fonksiyon iptal.
genelde, tuş basar basmaz işleyen (ve çekip çekmememle ilgilenmeyen) veya basılı tuttuğumda ve sadece parmağı çektiğimde tetiklenen fonksiyonlar var.
ama basmaya başlamamla birlikte başlayıp parmağı çekmemle kesilen bir şey yok?
keydown eventinde hangi yon tuslarina basildigini true, keyup eventinde de kullanicinin hangi yon tuslarini kullanmayi biraktigini false seklinde global degiskenlere ata. sonra keydown eventinde eger basilan tus yukari ise, sag veya sol tusun true olup olmadigini, sag veya sol tus ise de yukari veya asagi tusun true olup olmadigini kontrol et. bu sekilde ikisine birden basilip basilmadigini anlayabilirsin. yani;
var up, down, right, left = false, false, false, false;
window.onkeydown(function(event){
if(event.keycode == "39"){ // sag tusu temsil eden keycode. deger gercek olmayabilir, temsili olarak yazdim.
right = true;
if(up == true){
direction = 1; // sag ustu temsil eden bir deger;
}
else if(down == true){
direction = 2; // sag alti temsil eden bir deger.
}
else{
direction = 3; // sagi temsil eden bir deger.
}
}
});
window.onkeyup(function(event){
if(event.keycode == 39){
right = false;
}
});
keyup ve keydown eventlerinde diger yon tuslari icin de ayni if checkleri yapman lazim.
son bir sey daha var: iki tusa ayni anda bassan bile isletim sistemi bu eventleri sirayla isleme koyar. dolayisiyla sag uste gitmek istediginde once sag sonra yukari veya once yukari sonra sag tus icin keydown eventi tetiklenecektir. bu yuzden capraz gitmeden once cok kisa bir sureligine hareket eden oyun nesnesinin once saga veya yukari(hangisinin eventi once tetiklendiyse) gitmesi soz konusu olabilir. ama bu oyunun fps degerine de baglidir. yani sen her 10 ms' de bir hangi tuslara basildigini kontrol ediyorsan ve yukari tus ile sag tus arasinda 3 ms' lik bir fark var ise, o zaman biraz once dedigim sorunla karsilasmazsin. ama tam tersi olursa, yani 3 ms' de bir hangi tuslara basildigini kontrol ediyorsan ve yukari tus ile sag tus arasinda 10 ms' lik bir fark varsa, kontrol edilen oyun nesnesi bir sureligine saga veya yukari gidecektir.
not: kodda kullanilan bazi ozelliklerin veya fonksiyonlarin isimleri degisik olabilir. mesela keycode yerine sadece key kullanilabilir. bunu pseudocode olarak dusun.
şurda problemle ilgili güzel bir yapı oluşturulmuş aslında, onu da kullanabilirsin.
basılan tuşları bir object'te saklıyor, bırakıldığında da siliyor.
yani keys dizisinde o anda basılı tuşlar oluyor her zaman.
senin yapman gereken oyun akışı içinde keys içindeki değerleri kontrol etmek.