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
Cześć. U mnie wyświetla się biała, pusta strona, po umieszczeniu kody w blokach html:
Pierwsza mapa w js
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; x0)
{
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);
}
}
};
Pomożecie?
Komentarz by Waqmaz — 21 września 2011, 13:34
@Wagmaz: porównaj sobie swój kod z tym co zamieściłem w działających przykładach http://srodek.info/examples/ lub podrzuć link do strony zamiast kodu JS
Komentarz by Michał Środek — 21 września 2011, 13:40
Ok, dzięki wielkie. Dzięki tej stronie na pewno wiele się nauczę.
Umiem dobrze css i php, ale jeśli chodzi o js, to jarzę tylko tyle, co na logikę.
Komentarz by Waqmaz — 21 września 2011, 13:52
Cholera… nadal nie ‚działczy’.
http://tinypic.pl/mvwvwd8lyppt
Mógłbyś obejrzeć, będę bardzo wdzięczny.
Komentarz by Waqmaz — 21 września 2011, 13:58
Przepraszam za SPAM, jeśli chcesz, możesz usunąć z bazy komenty, które pisałem. Zastanawiam się, czy to może efekt tego, że używam localhost?
Komentarz by Waqmaz — 21 września 2011, 14:05
Localhost, lub wiesz, zwykły plik zapisany jako .html. Jeszcze raz przepraszam za SPAM, wygląda to naprawdę nieestetycznie xd.
Komentarz by Waqmaz — 21 września 2011, 14:05