Michał Środek

Po prostu devBlog

Witaj na srodek.info

Jest to blog poświęcony nowoczelnym technologiom ułatwiającym tworzenie aplikacji internetowych. Znajdziesz tutaj porady na temat CSS3, JavaScript, designu, web-usability, standardów W3C.

Cześć! Nazywam się Michał Środek. Z zawodu programista php, z zamiłowania gitarzysta oraz fanatyk GNU/Linuksa(openSUSE® w laptopie). W branży aplikacji internetowych od 9 lat. Prywatnie bez dzieci i kota.

Pracuję wciąż nad własnym elastycznym i wydajnym frameworkiem MVC, kilkoma portalami internetowymi oraz mniejszymi bibliotekami php. Czekam na wasze opinie, zgłoszenia błędów oraz pomysły na dalszy rozwój.

Ta część strony jest w trakcie budowy a moje prace tymczasowo niedostępne.

W przypadku pytań, ofert pracy oraz ciekawych pomysłów proszę się ze mną kontaktować. Możesz mnie znaleźć i wysłać PW na php.pl(SHiP), jamendo.com(michalsrodek), goldenLine.pl, facebook.com lub nk.pl

10 Lipiec 2010

Poruszanie się po mapie

Filed under: Gry,JavaScript,Moje projekty — Michał Środek @ 0:17

Mimo, że czołg w mojej grze jeź­dzi, poru­sza się przez ściany. Dzi­siaj zwal­czę ten pro­blem doda­jąc kilka lini­jek kodu odpo­wie­dzial­nych za wykry­wa­nie koli­zji obiek­tów, tak aby czołg nie mógł znaj­do­wać się w tej samej pozy­cji co mur lub woda.

Przede wszyst­kim prze­bu­dujmy kilka lini­jek odpo­wie­dzial­nych za wykry­wa­nie zda­rzeń kla­wia­tury. O ile kod ten wciąż nie jest dosko­nały i wymaga dal­szego doszli­fo­wa­nia, o tyle aktu­al­nie musi nam wystarczać.

if(keyHandler.isHolded(37)) // LEFT
{
	GameTank.changeDirection(0);
	if(GameTank.x>0)
		GameTank.changePosition(-1,0);
}
else if(keyHandler.isHolded(38)) // UP
{
	GameTank.changeDirection(1);
	if(GameTank.y>1)
		GameTank.changePosition(0,-1);
}
else if(keyHandler.isHolded(39)) // RIGHT
{
	GameTank.changeDirection(2);
	if(GameTank.x<480)
		GameTank.changePosition(1,0);
}
else if(keyHandler.isHolded(40)) // DOWN
{
	GameTank.changeDirection(3);
	if(GameTank.y<480)
		GameTank.changePosition(0,1);
}

Co się zmie­niło? Wszel­kie pole­ce­nia zmiany poło­że­nia czołgu są teraz prze­ka­zy­wane do metody GameTank.changePosition(). To ona zabez­pie­cza grę przed prze­ci­na­niem się obiektów.

changePosition: function(x,y)
{
	var newPosition = [this.x+x, this.y+y];
	var newField = [Math.ceil((newPosition[0])/32)-1, Math.ceil((newPosition[1]/32))-1];
 
	if(x)
	{
		var offset = newPosition[1]%32;
		if(x>0)
			var fields = [[1,0],[1,1]];
		else
			var fields = [[0,0],[0,1]];
	}
	else
	{
		var offset = newPosition[0]%32;
		if(y>0)
			var fields = [[0,1],[1,1]];
		else
			var fields = [[0,0],[1,0]];
	}
 
	var checkField = GameBoard.board[newField[1]+fields[0][1]][newField[0]+fields[0][0]];
	if(checkField==0 || checkField==1 || offset==0 || offset>29)
	{
		if(offset>0 && offset<6)
		{
			this.x+=x;
			this.y+=y;
		}
		else
		{
			var checkField = GameBoard.board[newField[1]+fields[1][1]][newField[0]+fields[1][0]];
			if(checkField==0 || checkField==1)
			{
				this.x+=x;
				this.y+=y;
			}
		}
	}
},

Naj­pierw okre­ślam współ­rzędne nowego poło­że­nia czołgu(jego gór­nego lewego naroż­nika) oraz współ­rzędne pola na kró­rym się znaj­duje. Następ­nie wyzna­czam odstęp(offset) jaki dzieli czołg od kra­wę­dzi kratki(Pamiętajmy, że czołg nie jest sze­roki na 32px tak jak pole na mapie). Dzięki okre­śle­niu pew­nej gra­nicy błędu nie będziemy musieli usta­wiać się ide­al­nie aby prze­je­chać mię­dzy dwoma obsza­rami blo­ku­ją­cymi. Znacz­nie uła­twi to sterowanie.

Kolej­nym kro­kiem jest okre­śle­nie 2 pól(fields), na pod­sta­wie któ­rych badane będą koli­zje. To jakie pola wybie­rze skrypt zależy od kie­runku w jakim się poru­szamy. A są to:

Następ­nie jest spraw­dzany rodzaj tych pól oraz odle­głość czołgu o nich. Jeżeli wszystko się zga­dza, pozy­cja czołgu zostaje zmieniona.

Całość działa cał­kiem spraw­nie. Efekt koń­cowy możesz zoba­czyć tutaj

Dodaj arty­kuł do:

  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Gwar
  • Reddit
  • Technorati
  • Twitter
  • Wykop

Komentarzy: 6 »

  1. Super,super,super :) cze­kam tylko na prze­wi­ja­nie mapy i bedzie genialnie !

    Pozdra­wiam

    Komentarz by maxx — 10 lipca 2010, 12:32

  2. Co do prze­szkód, to moim zda­niem lepiej by było jakby czołg prze­su­wał się o jedną kratkę za jed­nym naci­śnię­ciem, ew. można też zmniej­szyć kratki. Trudno „dobrze wejść w zakręt“ :D

    Komentarz by Oskar Wójcicki — 10 lipca 2010, 13:08

  3. Może spró­bo­wał­byś zaokrą­glić te ruchy? Tzn. uła­twić wcho­dze­nie w zakręty?

    Komentarz by cypherq — 10 lipca 2010, 15:38

  4. Na prawdę aż tak ciężko się skręca? Ja chyba za dużo w to „gram“ pod­czas pisa­nia i dosze­dłem do wprawy. W jaki spo­sób sobie wyobra­ża­cie uła­twia­nie wcho­dze­nia w zakręty?

    Następny arty­kuł będzie praw­do­po­dob­nie o auto­ma­tycz­nym poru­sza­niu się czołgu tak aby przy­go­to­wać się do ste­ro­wa­nia myszką oraz obsługi AI więc myślę, że pro­blem zosta­nie w pewien spo­sób rozwiązany

    @maxx: nie­ba­wem będzie rów­nież i prze­wi­ja­nie mapy ;) .
    @Oskar Wój­cicki: ste­ro­wa­nie co jedno pole to dobry pomysł w przy­padku gier typu Poke­mon Gold. Tym­cza­sowo jed­nak zaj­muję się czoł­gami. Póź­niej zoba­czę co będę miał ochotę popi­sać ;) .

    Komentarz by Michał Środek — 10 lipca 2010, 16:02

  5. to cho­ciaż co pół ;p albo zmniejsz „kratki“ … Wtedy powinno być okej… A tak z cie­ka­wo­ści — gry­wasz w gry typu Poke­mon Gold :D ?

    Komentarz by Oskar Wójcicki — 10 lipca 2010, 16:27

  6. Zoba­czę, co będzie się dało z tym zro­bić :) .

    Gry­wa­łem :) Teraz czasu nie mam.

    Komentarz by Michał Środek — 10 lipca 2010, 16:29

Kanał RSS z komentarzami do tego wpisu. TrackBack URL

Dodaj komentarz