JS: Problem ze zdobywaniem przedmiotów- błąd w poradniku.

0

Daję cały kod źródłowy (nie wiem co jest nie tak) jak dodaję funkcję zbierania przedmiotów to nawet postać nie chce się ruszać. Nie wiem co jest nie tak a muszę mieć to rozwiązane najpóźniej do jutra ://

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<script type="text/javascript" src="jquery.js"></script>
	
	<style>
		#gracz{
			position: absolute;
			left: 100px;
			top: 100px;
			}
		
		#ele{
			position: absolute;
			left: 300px;
			right: 300px;
			}
			
		</style>
	
	<script>
		var x=100,y=100,jump=0;
		var mX = new arrey();
		var mY = new arrey();
		var mI = 0;
	
		function start()
		{
			addBrick(100,100);
			gameloop();
		}
		
		function gameloop()
		{
			if (jump>0){
				jump-=1;
				y-=15;
			}else if (y<270)
			{
				y+=2
			}
			
			$("#gracz").css("top",y+"px");
			
			setTimeout("gameloop()",1);
		}
		
		function addBrick(ax,ay)
		{
			mX[mI] = ax;
			mY[mI] = ay;
			$("#brick").append("div style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px; background-color:blue;'></div>");
			mI+=1;
		}
		
$(document).keydown(function(e){
			
				if (e.keyCode==37)
				{
					x-=10;
		 		}else if (e.keyCode==39)
				{
					x+=10;
				}
				
				if (e.keyCode==38)
				{
					jump = 20;
				}
				
				$("#gracz").css("left",x+"px");
			}
		);
	</script>
	
	
	</head>
	<body onload="start()">
		<body onload="start()">
		<img id="gracz" src="post.jpg">
		<img id="ele" src="ele.jpg">
		<div id='brick' style='position: absolute; left: 0px; top: 0px;'></div>
		<div style='position: absolute; left: 8px; right: 8px; top: 300px; height: 100px; background-color: green;'></div>

		
	</body>

</html>

Muszę uprzedzić, że "ele.jpg" to jest małe logo u góry ekranu.
Money i Brick mogą występować zamiennie bo zmieniałem nazewnictwo i mogłem coś przeoczyć...

0

Przede wszystkim, wykonaj taką procedurę:
0) Odpalenie problematycznej strony w przeglądarce i otwarcie konsoli błędów (w Firefoxie: CTRL+SHIFT+J)

  1. Wyczyszczenie konsoli (przycisk Clear / Wyczyść)
  2. Odświeżenie przeglądarki
  3. Zerknięcie do konsoli
  4. Jeśli nie ma żadnego błędu JavaScript, KONIEC.
  5. Znalezienie PIERWSZEGO komunikatu o błędzie JavaScriptu
  6. Poprawienie kodu JS w oparciu o powyższy komunikat
  7. Skok do punktu 1)

W ten sposób poprawisz kilka oczywistych błędów. MUSISZ umieć sam poprawiać takie błędy. Jeśli nie będziesz tego umiał -- uciekaj od JavaScriptu i od programowania w ogóle. OK, spoko, początkujący tego nie potrafią, ale MUSZĄ się nauczyć, jeśli chcą programować.

W ten sposób wykryjesz w kodzie choćby proste literówki. I tak, masz napisane arrey zamiast Array (zła literka + wielkość liter ma znaczenie!).

Jak to poprawisz to zobaczysz, że jako tekst strony wstrzykiwany jest jakiś niedorobiony kod HTML. To dlatego, że przy $("#brick").append("div... brakuje otwarcia tagu, tj. znaku <.

0

Jest drugi problem.
W mojej grze postać ma zbierać cegiełki. Gdy w nie wejdzie one mają znikać.
Problem jest taki, że nie znikają :/

 
for(var i=0; i<mI; i+=1)
			{
			
				if (x >= mX[i] && x <= mX[i]+32);
				if (y >= mY[i] && y <= mY[i]+32);
					deleteBrick(i);
			}
			
			setTimeout("gameloop()",1);
		}
		
		function addBrick(ax,ay)
		{
			mX[mI] = ax;
			mY[mI] = ay;
			$("#brick").append("<div id='m-"+mI+"' style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px; background-color:blue;'></div>");
			mI+=1;
		}
		
		function deleteBrick(aid)
		{
			$("#brick"+aid).remove();
		}

To jest część kodu. Co jest nie tak (przeglądarka nie wykrywa żadnych błędów) ?

0

Co robią te średniki po if-ach? :)

0

Średniki po ifach to błąd. Wsparty złym formatowaniem kodu, które sugeruje, że niby wszystko jest w porządku. Nie jest.

Taki kod ze średnikami po ifach:

if (x >= mX[i] && x <= mX[i]+32);
if (y >= mY[i] && y <= mY[i]+32);
     deleteBrick(i);

to tak naprawdę odpowiednik tego:

if (x >= mX[i] && x <= mX[i]+32) {
   // nic nie rób
}
if (y >= mY[i] && y <= mY[i]+32) {
    // nic nie rób
}
deleteBrick(i);

Usuń średniki po ifach.

To nie jedyny błąd.

Właściwym problemem nie jest to, że "cegiełki nie znikają". To zbyt wysokopoziomowy problem jak na myślenie programistyczne. Taką nazwę może mieć bug zgłoszony przez użytkownika, ale z technicznego punktu widzenia, tak postawionego problemu nie da się naprawić.

Musisz zejść niżej. Zastosować dekompozycję tego dużego, ogólnego problemu na mniejsze, bliżej związane z kodem.

Np. pytanie brzmi: czy funkcja deleteBrick() w ogóle jest wywoływana (bo może wyrażenie warunkowe jest niepoprawne)? Sprawdźmy, choćby umieszczając w niej console.log("jestem w deleteBrick()") i zerkając po raz kolejny do konsoli (lepszy byłby tu debugger, a nie console.log, ale nie mam czasu żeby to teraz tłumaczyć). Okazuje się, że w konsoli pojawiają się nasze komunikaty, że jesteśmy w deleteBrick()!

Więc warunek przynajmniej czasami przechodzi, natomiast funkcja niczego nie usuwa.

Zobaczmy: co w próbujemy usunąć?

$("#brick"+aid).remove();

Element o ID sklejonym z ciągu brick oraz wartości zmiennej aid. Wartość tę nasza funkcja otrzymuje poprzez parametr. Jest to liczba całkowita. Próbujemy więc usunąć elementy o ID równym brick0, brick1 i tak dalej.

Czy mamy w ogóle takie elementy na planszy? Czy gdzieś je tworzymy?

Zajrzyjmy do miejsca tworzenia cegiełek, bo chodzi nam przecież o cegiełki.

                function addBrick(ax,ay)
                {
                        mX[mI] = ax;
                        mY[mI] = ay;
                        $("#brick").append("<div id='m-"+mI+"' style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px; background-color:blue;'></div>");
                        mI+=1;
                }

Interesuje nas samo tworzenie elementu cegiełki, co odbywa się w tej linii:

$("#brick").append("<div id='m-"+mI+"' style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px; background-color:blue;'></div>");

Jakie ID ma nasz div z cegiełką? To ten fragment kodu:

(...)append("<div id='m-"+mI+"'(...)

Ooo... Tworzymy cegiełki, nadając im ID sklejone z ciągu m- oraz wartości zmiennej mI, która to zmienna przechowuje kolejne liczby całkowite. Czyli tworzymy cegiełki o ID m-0, m-1 i tak dalej. Mamy przedrostek m-, a próbujemy potem usunąć elementy z ID o przedrostku brick!

I to jest właściwym błędem. Zmień kod tak, żeby id cegiełek dodawanych odpowiadały dokładnie ID-kom cegiełek, które próbujemy usunąć.

PS. Od razu dodam, że jak to poprawisz, do problem będzie rozwiązany, ale uważaj, bo teraz cegiełka w ogóle zniknie na samym początku gry. To dlatego, że gracz na początku spada znad cegiełki. Zanim spadnie na ziemię, to ją zdąży zjeść. Gracz powinien więc startować albo z poziomu gruntu, albo przesunięty w lewo lub w prawo.

PS2. Staram się naświetlić Ci tu przykładowy proces debugowania takich rzeczy. Najważniejsze, żebyś się sam tego nauczył, bo uderzanie na forum z każdym problemem jest niewygodne i... nieefektywne.

0

Mam jeszcze (chyba już ostatnie) pytanie jak zamiast kwadracika podstawić własne obrazek ?
Próbowałem oczywiście import obrazka o id= brick i różnymi innymi metodami- niestety bez skutku :/

0

Zauważ, że każda cegiełka ma inne ID. I dobrze -- bo ID ma jednoznacznie ("unikalnie") identyfikować cegiełkę!

Prawdopodobnie będziesz chciał, żeby każda cegiełka wyglądała tak samo, tj. miała ten sam obrazek. Albo przynajmniej żeby grupy cegiełek były takie same.

Dodaj cegiełkom klasę. Na początku niech będzie to po prostu brick. Czyli do ich HTML-a dodaj atrybut class="brick". Następnie, w stylach CSS napisz:

.brick {
  background: url("sciezka/do/obrazka.png") no-repeat left top;
}

I tyle.

0

Ale czekaj, mam class-ę dodać do:

 
function addBrick(ax,ay)
		{
			mX[mI] = ax;
			mY[mI] = ay;
			$("#brick").append("<div id='brick"+mI+"' style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px; background-color: red;';'></div>");
			mI+=1;

Oraz usunąć background color ?

A:

 
.brick {
  background: url("sciezka/do/obrazka.png") no-repeat left top;
}

Mam dodać do Style CSS ?
Tylko ja nie mam niestety tego typu wiersza.

0

tak, wywal background-color z atrybutu "style", i dodaj klasę "brick".

nie masz w ogóle styli css? czy jak?
plik css załączasz do dokumentu wstawiając w sekcję <head> takie coś:
<link rel="stylesheet" type="text/css" href="sciezka/do/pliku.css" />

0

Czyli wygląda to tak:

 
function addBrick(ax,ay)
		{
			mX[mI] = ax;
			mY[mI] = ay;
			$("#brick").append("<div id='brick"+mI+"' style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px;'></div>");
			mI+=1;
			class="brick"
		}

Ale co z tym CSS-em ?

 
<head>
		<script type="text/javascript" src="jquery.js"></script>
		<link rel="stylesheet" type="text/css" .brick {background: url("obrazek.jpg") no-repeat left top;} />

To chyba nie ma tak wyglądać ? :/

0

ty stworzyłeś choć linijkę kodu? czy po prostu się upiłeś teraz i odbijasz wiedzę? :P

$("#brick").append("<div class='brick' id='brick"+mI+"' style='position: absolute; left: "+ax+"px; top: "+ay+"px; width: 32px; height: 32px;'></div>");

napisałem jak dołączać PLIKI css:
<link rel="stylesheet" type="text/css" href="sciezka/do/pliku.css" />

tworzysz sobie plik z rozszerzeniem css (w miejscu, zdefiniowanym w href=) i wpisujesz w nim:

.brick {
  background: url("sciezka/do/obrazka.png") no-repeat left top;
}

a ten kod javascript to gdzie wstawiasz? tez bezposrednio w dokumencie, a nie dołączasz jak jQuery?!

1 użytkowników online, w tym zalogowanych: 0, gości: 1