Adatokkal szeretnék kommunikálni egy másik programmal. Leteszem valahová a .js file-t, azt a fogadó program feldolgozza és visszaad egy másik .js file-t.
A file-ok nevei változnak. Hogyan lehet egy file-t használni npm install -- save parancs nélkül. Vagy beépíthetem ezt a parancsot a programba?
Ezzel kapcsolatos apróbb kérdéseim: mit jelent a @ a filenév elején? (Vagy bárhol.)
Koszi, hogy idot szakitottal arra, hogy megnezned a kerdesemet.
Ahogy irtam uj vagyok a javascritben igy persze, hogy nem tokeletes es a kerdesemet az utan tettem fel, hogy megprobaltam megoldani magamtol.
a 48. sort lattam, hogy hibat jelez. irtam is h elkezdtem irni, de nem tudtam, igy kerdeztem itt a segitseg topikban.
Amit viszont nem ertek, az az energia amit beletettel ebbe a negativabb hangvetelu kommentben szerintem rovidebb ido alatt ra tudtal volna vezetni a megoldasra.
Ne haragudj, de ez valami borzaszto spagetti kod. Ilyen formaban ebben semmi se mukodik. Ld. js konzolban,"SyntaxError: missing ( before condition", de meg a jsfiddle is jelzi, hogy a 48. sor hibas:
if wrong = document.getElementById('q1red1').checked; {
Ez mi akar lenni?
1. Az if utani kifejezes (feltetel) zarojelezendo.
2. kulonbseg van az = es az == operatorok kozott, nem mindegy, melyiket hasznalod.
3. a ; utan { is jellemzo hiba. Ha ez a kifejezes helyes is lenne, az if-nek nem lenne semmi ertelme, mivel ures utasitas fut le a feltetel teljesules eseten is. A {}-k kozott levo kod meg lefutna.
function myFunction() {
Fuggvenyben egy fuggveny? Miert? Meg sem hivodik.
Tovabbi jo tanacsok:
Ha egymas utani sorokban 10-szer (szinte) ugyanazt irod le, akkor valamit rosszul csinalsz. Ld. ciklusok.
A kod fele ki van kommentezve, atlathatatlan, ha segitseget kersz, ezeket vedd ki, mielott megosztod, csak a lenyeg maradjon bent, igy elegge tl;dr.
Lehet, hogy szamodra ez nem egy komplexebb feladat vagy csak nagyot akartal ugrani, de szvsz olvasgasd meg a js alapjait.
ha submit gombra ranyomok akkor a jo valasz zold lesz (ezt be tudtam allitani) viszont ha rosszat jelolok akkor nem tudom mas szinre "festeni" marad a jelolo szin. Persze ehhez az szukseges, hogy a radio button checked legyen. If else statementtel probalkozom.
Csak az elso kerdesre probaltam megirni eddig a scriptet ami a 48.sorban kezdodik
Úgy tapasztaltam, hogy nem fut le az addEventListener egerfelette függvénye sehogy sem...
Egyébként úgy van a program felépítve, hogy gombnyomásra jön létre néhány objektum (ikonok), és azokon hajtódna végre ez az ellenőrzés, hogy felette van-e az egérmutató. Erre a gombnyomásra lesz az aktívfelület 2-es értékű, és ekkor jönnek létre az ikonok is.
Vajon jól használom az addEventListener-t ezen logika alapján?
Igen, az alert-et kíváncsiságból raktam be, hogy egyáltalán lefut-e az az ág. De nem jelenik meg az üzenet, tehát nem. Hibaüzenetet nem tapasztaltam. Akkor megpróbálom még a tanácsod alapján azt az if-et vizsgálni.
Szvsz ideje lenne megismerkedned bizonyos (js) debuggolasi technikakkal, bar gondolom az alert() is ezt szolgalja. A kodod alapjan
- ha az alert(1) lefut, akkor ujra kellene rajzolnod a canvast vagy amire a tabortuzikon ki van rajzolva, mert gyanithatoan a tabortuzikon.kepe = tabortuz2kep; nem indukal ui frissitest
- ha az alert nem fut le, akkor passz. Van egy rakat valtozod az egerfelette fuggvenyben, vizsgald meg mindegyik tartalmat, hogy hol akad el/merre megy a vezerles (belemegy-e a fuggvenybe, a case 2-be, az ifbe stb)
Az utóbbi kérdést már sikerült megoldanom, ezzel viszont egyáltalán nem boldogulok: azt szeretném elérni, hogy ha az egérmutató egy bizonyos objektum felett van éppen, akkor történjen valami, most pl. változtassa meg a képét. Ez a (valamiért nem működő) kódom:
Valaki meg tudná nekem mondani (illetve leírni), hogy a vászonra kirajzolt képre hogyan lehet kiírni egy változó értékét? Van a képeknek is külön canvas-uk, vagy hogy lehet pontosan rájuk helyezni szöveget?
Igen, megnéztem a Google-nak a Vizsgálat lehetőségével (jobb kattintás), és ki is írt hibákat, hogy pl. "Irnyil.addEventListener is not a function" - tehát hogy ez nem egy függvény. Dehát akkor mi?
Ezt a pastebin.com-os lehetőséget még nem is ismertem, de megfogadom ezt a tanácsodat és ki fogom használni, mert tényleg olvashatatlan az így beillesztett kód.
Az Irnyil egy, a function kulcsszóval megadott konstruktor. Maguk az iránynyilak egy addEventListener-es gombnyomás után jönnek létre 4 példányban. Majd ezeket egy setInterval-os ciklusban rajzolom ki. És akárhonnan hívnám az egérkezelést, az nem működik.
De majd holnap bélelőtt beillesztek a formázott kódomból is.
0. javasolnam valamelyik codepaste szolgaltatast (pl. http://pastebin.com), mert igy a beillesztett kodreszleteid szinte kibogozhatatlanok. Oda feltoltod, ott van kodformazas, syntax highlighting, ide meg a kapott linket.
Olyat csinalhatsz pl, hogy feliratkozol a "click" eventre, azt feldolgozod valamilyen fuggvenyben, ahol ellenorzod, hogy a kattintas koordinatai benne vannak-e valamelyik nyil bounding boxaban (hittest: https://en.wikipedia.org/wiki/Hit-testing), bongeszod js konzoljaban le is tesztelheted (pl: window.addEventListener("click", function(e) { console.log(e); }, false); )
Azt el tudná valaki magyarázni nekem, hogy JavaScript-ben pontosan hová helyezhető el a
addEventListener("click", kattirnyilon, false);
utasítás?
Az a helyzet, hogy ezt rendelném hozzá 4 darab olyan objektumhoz, aminek van egy képe. Ezek a képek egy kiindulópontból mutatnak 4 irány felé, eképpen:
|
-o-
|
Tehát 4 darab nyílról van szó. Ezeknek van egy konstruktora, az IrNyil(). Van egy függvény, ami az objektumra kattintást kezeli, a kattirnyilon(). És már van egy addEventListener-em, ami a gombnyomást figyeli, és ha ez érzékeli a szóköz gomb lenyomását, akkor létrehozza a kiindulópontot, meg a 4 irányobjektumot köré:
window.addEventListener("keydown", gombnyomas, false); function gombnyomas (gomb) { switch ( gomb.keyCode ) { case 32: if (jatekallapot == 0) { jatekallapot = 1; a_bunker = new Bunker(); felnyil = new Irnyil(a_bunker.xhely+(bunkerkep.width/2)-(felnyilkep.width/2),a_bunker.yhely-felnyilkep.height,90); lenyil = new Irnyil(a_bunker.xhely+(bunkerkep.width/2)-(felnyilkep.width/2),a_bunker.yhely+bunkerkep.height,270); balnyil = new Irnyil(a_bunker.xhely-balranyilkep.width,a_bunker.yhely+(bunkerkep.height/2)-(balranyilkep.height/2),180); jobbnyil = new Irnyil(a_bunker.xhely+bunkerkep.width,a_bunker.yhely+(bunkerkep.height/2)-(jobbranyilkep.height/2),0); jatekoscsinalo(ennyijatekosdb); tereptargyak = []; jatekciklus(); }; break; case 27: if (jatekallapot != 0) { jatekallapot = 0; while ( jatekostomb.length > 1 ) { jatekostomb.pop(); }; delete a_bunker; jatekciklus(); }; break; }; };
Tehát a kérdésem a teljes idegösszeomlás előtt az, hogy hova lehet elhelyezni ezt az említett kattintásos addEventListener-t? Addig rendben, hogy miután létrejöttek a nyíl objektumok, de ha odateszem utánuk, hogy: IrNyil.addEventListener... vagy: felnyil.addEventListener..., akkor nem is indul el a program. Akkor mégis hol kell figyelni az egéreseményt a programon belül?
Működött; még egyszer köszönöm a segítséget! A setInterval()-ra viszont mindenképpen szükség volt, anélkül nem mutatott semmit a Chrome-ban a program.
De adódott még egy probléma: a játékban a képernyő tetején egymással szemben jönnének be az ellenséges objektumok sorban, majd ha középen találkoznak, megállnának, megfordulnának másik sprite-ot kapva, és úgy támadnának a játékosra.
Namost ez működött is, egészen addig, míg be nem illesztettem ütközésérzékelést nekik, ami a megállást vezérelné, mikor szembetalálkoznak egymással. Ugyanis ha nem kommentelem ki ezt az ütközésérzékelő függvényt, akkor nem is mutatja őket a böngésző, hanem a hibakeresőjében a következő hibaüzenet olvasható:
Uncaught TypeError: Cannot read property 'kepe' of undefined
Tehát a kirajzoló függvényben nem találja a kirajzolandó példányt - legalábbis én így gondolom.
A játék fő ciklusában van az ellenségeket kirajzoló függvény, és elmozduláskor az hívja ezt a bizonyos ütközésérzékelést. Az ellenségeket kirajzoló függvény egy for ciklussal végigmegy az összes ellenségen, elmozdítja őket egy sebességértékkel, majd jön az ütközésérzékelő függvényem, ami így néz ki:
Ha innen eltávolítom valahogy az összes ellenségen végigpörgő for ciklust, akkor jó lesz minden, jönnek az ellenségek, csak éppen nem állnak meg, mert ugyebár nincs ütközésvizsgálat.
Most akkor mi lehet a baj és mi a megoldás rá? Egy objektum példányait végigvizsgáló cikluson belül nem lehet még egy ugyanolyan, vagy mi van?
Köszönöm szépen; átírom a javaslatod mintájára; remélem, működni fog.
NevemTeve, sajnálom, hogy a behúzásokat kiszedte a fórum szövegszerkesztője; így valóban nehéz átlátni még a viszonylag rövid kódokat is. Ha legközelebb kódot kell beírnom, megpróbálom szóközökkel szebbé tenni.
Ez nem a js logikaja, hanem altalanos "algoritmus-logika" (tehat js fuggetlen), azaz:
- a setInterval() fuggveny teljesen felesleges
- ugyancsak felesleges mindahanyszor beregisztralni a keyeventekre, a window.addEventListener("keydown", gombnyomas, false);-t boven eleg 1x meghivni (igaz nem tortenik baj amugy)
- a lenyeg, hogy a kepfrissitest nem idoziteshez kell kotni, hanem allapotvaltozashoz
Tehat a kododnak valahogy igy kene kineznie (nem felkeszitve bizonyos hulyegyerekek kotozkodesere):
Ennél viszont tényleg megállt a tudományom: azt szeretném elérni, hogy kirajzolódjon egy háttérkép, aztán ha lenyomjuk a szóközt, akkor váltson állapotot a program és rajzoljon ki egy másik hátteret. Innen az Escape lenyomására lehessen visszatérni az eredeti képhez. De csak az első képet rajzolja ki, szóköz lenyomására semmit nem csinál. Mi lehet a baj a kódomban? Nem értem a JS logikáját netán?
<html> <head> <title>Hátteres</title> </head> <body> <canvas id="rajzvaszon" width="640" height="480"></canvas> <script> var vaszon = document.getElementById('rajzvaszon'); var rv = vaszon.getContext('2d'); if (vaszon.width < window.innerWidth) { vaszon.width = window.innerWidth; }; if (vaszon.height < window.innerHeight) { vaszon.height = window.innerHeight; }; var cimhatter = new Image(); cimhatter.src = 'kepek/cimkep.png'; var urhatter = new Image(); urhatter.src = 'kepek/urhatter.png'; var jatekallapot = 0; //címképernyő mutatása setInterval(frissites, 60); function frissites() { window.addEventListener("keydown", gombnyomas, false); rv.clearRect(0,0,vaszon.width,vaszon.height); switch ( jatekallapot ) { case 0: function gombnyomas (gomb) { if ( gomb.keyCode == 32 ) { jatekallapot = 1; }; }; rv.drawImage(cimhatter,0,0,vaszon.width,vaszon.height); break; case 1: function gombnyomas (gomb) { if ( gomb.keyCode == 27 ) { //Esc gomb jatekallapot = 0; }; }; rv.drawImage(urhatter,0,0,vaszon.width,vaszon.height); break; }; }; </script> </body> </html>
Most már jó lett! A kód legvégén levő képkirajzoló ciklust a képernyőtörléssel együtt beraktam egy setInterval() közé, és most már működik minden. Azt hittem, a gombnyomás lekérdezést is így le kell ellenőrizni ciklusosan, és előzőleg azt is belevontam, de az nem kellett.
Ezt most mégkevésbé értem: az előbb ott tartottunk, hogy hol az a programrész, ami kirajzolná a képet az új helyen, most pedig valahogy átváltottál erre a setInterval-ra.