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
Dzisiaj stworzę pierwszą wersję planszy do mojej gry. Spróbujmy wykreować obszar 16x16, generowany na podstawie tablicy z informacjami o poszczególnych polach. Po wygenerowaniu mapy pozostanie ona całkowicie statyczna więc liczenie fps pozostawię do kolejnego artykułu. Dzisiaj zajmijmy się stworzeniem głównej klasy oraz kilku metod inicjalizujących naszą planszę.
Przede wszystkim potrzebujemy obiektu canvas o rozmiarach 512x512px(16x16 pól o rozmiarach 32x32px).
<canvas id="gameBoard" width="512" height="512"></canvas>
Do wygenerowania mapy potrzebujemy również kilku tekstur. Tymczasowo posiadam jedynie trawę, wodę, cegłę oraz lód.
Trawę ustawiłem jako tło elementu canvas bezpośrednio w pliku CSS. Spróbujmy stworzyć główną klasę o nazwie GameBoard.
var GameBoard = { ctx: null, TEXTURE_ID: {ICE: 1, BRICK: 2, WATER: 3}, textures: [null, 'images/ice.png', 'images/brick.png', 'images/water.png'], board:[ [1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1], [1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1], [1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1], [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1], [1,2,2,1,1,2,2,2,2,2,2,1,1,2,2,1], [2,2,2,1,3,2,2,2,2,2,2,1,3,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2], [0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0], [0,2,2,2,1,2,2,2,2,2,2,1,2,2,2,0], [0,2,2,2,2,1,1,1,1,1,1,2,2,2,2,0], [0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,0], [0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0], [0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]], drawBoard: function() { for(var y=0; y<16; y++) { for(var x=0; x<16; x++) { if(this.board[y][x]>0) { this.ctx.save(); this.ctx.fillStyle = this.textures[this.board[y][x]]; this.ctx.fillRect(x*32,y*32,32,32); this.ctx.restore(); } } } }, preloadTextures: function(i){ var img = new Image(); img.src = this.textures[i]; img.onload = function() { GameBoard.textures[i] = GameBoard.ctx.createPattern(img, 'repeat'); if(GameBoard.textures[i+1]) GameBoard.preloadTextures(i+1); else GameBoard.drawBoard(); } }, init: function (){ this.canvas = document.getElementById('gameBoard'); if (this.canvas.getContext) { this.ctx = this.canvas.getContext("2d"); this.preloadTextures(1); } } };
Pierwsze pole naszego obiektu — ctx(context) to kontekst obiektu canvas. Po przez niego odwołujemy do wszystkich metod rysujących. Następny obiekt — TEXTURE_ID — jest niczym innym jak zbiorem stałych(troszkę to przypomina enum znane z c++). W tym przykładzie nie jest on w ogóle używany jednak w przyszłości wygodniejsze będzie odwoływanie się za pomocą nazw. Kolejne pole — textures — to tablica adresów do naszych tekstur. Zauważ, że indeksy w tej tablicy odpowiadają wartościom stałych w TEXTURE_ID( TEXTURE_ID.ICE = 1 oraz textures[1] = ‚images/ice.png’). Przyjąłem, że tekstura zerowa to po prostu tekstura pusta(pełna przezroczystość). Na końcu widnieje tablica board zawierająca informacje o każdym polu. Liczba od 0 do 3 określa rodzaj tekstury.
Metoda ta wyłapuje kontekst naszego pola canvas zapisuje go do pola ctx oraz wywołuje metodę preloadTextures(1). Rozpoczniemy ładowanie tekstur rozpoczynając od tej o identyfikatorze jedynki(zero jest zarezerwowane dla tekstury pustej).
Jako parametr metoda ta przyjmuje identyfikator tekstury(jej indeks w tablicy textures). Najpierw tworzymy pusty obraz, a następnie ustalamy jego adres. Po załadowaniu pliku z grafiką generujemy nowy wzór za pomocą ctx.createPattern() oraz nadpisujemy nim adres przechowywany w tablicy textures. Następnie sprawdzamy czy tekstura o identyfikatorze o jeden większym istnieje. Jeśli tak ładujemy ją. Jeśli nie wyświetlamy mapę
Ta metoda rysuje pole po polu przechodząc przez wszystkie elementy z tablicy board. Sądzę, że kod jest oczywisty.
Efekt działania skryptu:
Umieścimy na planszy naszą postać oraz zaprogramujemy metody odpowiedzialne za wyłapywanie zdarzeń klawiatury. Możliwe stanie się płynne poruszanie po mapie.
Super sprawa ! szkoda tylko że nie wszystkie przeglądarki obsługują canvas…
Komentarz by maxx — 16 maja 2010, 1:44
Nie wszystkie = IE ;]
Na tej stronie jest sporo ciekawych zestawień co które przeglądarki obsługują. Niestety jest to lekko nieaktualne(dane ze stycznia 2009) lecz już wtedy wszystkie „normalne“ przeglądarki canvas obsługiwały. Teraz jest już troszkę lepiej ponieważ powoli pojawia się wsparcie dla 3d.
Komentarz by Michał Środek — 16 maja 2010, 12:28
Co prawda to prawda
ale boje się trochę wsparcia dla 3D rozumiem ze dla konsumentów będzie dobrze ale żeby stworzyć gierkę 3D będzie potrzebny sztab ludzi nie będzie tej zabawy ze można coś stworzyć samemu.
Komentarz by maxx — 17 maja 2010, 21:55