Projekt z Technologii Internetowych
Transkrypt
Projekt z Technologii Internetowych
POLITECHNIKA ŚLĄSKA WYDZIAŁ AUTOMATYKI, ELEKTRONIKI I INFORMATYKI Projekt z Technologii Internetowych Gra przeglądarkowa – The Game Dawid Bąk, Marcin Zembski Semestr V gr. 4 Gliwice, styczeń 2012 2 Gra przeglądarkowa – The Game Spis treści 1. Wstęp ......................................................................................................................................... 3 2. Harmonogram............................................................................................................................. 3 3. 2.1. Harmonogram zatwierdzony ............................................................................................ 3 2.2. Harmonogram wykonany................................................................................................. 4 Aplikacja programowa i/lub sprzętowa........................................................................................ 4 3.1. Określenie problemu ....................................................................................................... 4 3.2. Analiza rozwiązao ............................................................................................................ 5 3.3. Zaproponowane rozwiązanie ........................................................................................... 5 3.4. Wykonanie .................................................................................................................... 10 3.5 Zaistniałe problemy………………………………………………………………………………………………………10 4. Podsumowanie ......................................................................................................................... 10 5. Literatura .................................................................................................................................. 11 3 Gra przeglądarkowa – The Game 1. Wstęp Niektórzy z naszych kolegów długo zastanawiali się co mogą zrobid na projekt z Technologii Internetowych, brali pod uwagę swoje zainteresowania, niektórzy mieli ciekawe pomysły, ale w koocu w większości wypadków i tak duże ambicje szybko malały i skupiali się na stworzeniu czegoś prostego. My od początku wiedzieliśmy co chcemy zrobid. Mimo, że nie do kooca wiedzieliśmy jak to zrobid… A szczerze, nie mieliśmy zielonego pojęcia. Postanowiliśmy wykonad grę przeglądarkową o charakterze RPG. Celem, który postawiliśmy sobie w ramach naszego projektu było przede wszystkim poznanie technik związanych z dynamicznym (bez odświeżania strony i wielkiego obciążenia serwera) komunikowaniem się różnych użytkowników, wykorzystywanym np. podczas walki w czasie rzeczywistym między dwoma graczami oraz przy chcacie. Oprócz tego poznanie technik bez, których nowoczesna strona internetowa się nie obejdzie takich jak: php, CSS czy w koocu Java Script. Sama gra miała umożliwiad oczywiście takie podstawowe opcję jak stworzenie nowego konta, logowanie, a oprócz tego utworzenie nowego bohatera ( wybranie klasy umiejętności, które będą miały wpływ na rozgrywkę, nadanie mu imienia itd.), podróżowanie po wirtualnym świecie, toczenie walki z serwerem oraz toczenie walki z innym bohaterem, możliwośd awansowania na następny level postaci i upgrade’owanie jego umiejętności, kupowanie i korzystanie z przedmiotów i w koocu rozmowa z innymi graczami na chacie. Przed rozpoczęciem planowania przeglądaliśmy dużo podobnych gier i zastanawialiśmy się czego im brakuje. To tutaj zrodził się pomysł podróży po wirtualnym świecie. Inne gry ograniczały się raczej do tego, że użytkownik był w mieście i gdy chciał walczyd wchodził w odpowiednią stronę i wybierał sobie jednego spośród tysiąca dostępnych użytkowników. Wpadliśmy na pomysł by rozwiązad to inaczej. Chcieliśmy stworzyd kilka lokacji (w projekcie ograniczyliśmy do 4 ze względu na czas) między, którymi gracze mogę podróżowad. 2. Harmonogram 2.1.Harmonogram zatwierdzony 1. Prace wstępne, poznawanie technologii, projekt bazy danych 2. System rejestracji/logowania 4 Gra przeglądarkowa – The Game 3. Tworzenie postaci 4. Tworzenie „miasta”, oprogramowanie postaci niezależnych 5. System przeliczania akcji 6. Tworzenie mechaniki rozgrywki 7. System komunikacji między graczami 2.2.Harmonogram wykonany 1. Prace wstępne, poznawanie technologii, projekt bazy danych 2. System rejestracji/logowania 3. Tworzenie postaci 4. Utworzenie lokacji las. Stworzenie części mechaniki gry (sprawdzanie czy nasz bohater został zaatakowany przez innego gracza lub przez bota). 5. Walka z botem (serwerem). 6. Walka z innymi graczami 7. System komunikacji między graczami. 8. Mini sklep oraz rozwój postaci. Jak widad harmonogram zatwierdzony różni się dośd znacznie od harmonogramu wykonanego. Jest to spowodowane tym, że obraz gry w naszej głowie ciągle ewoluował podczas pisania kodu. Zrezygnowaliśmy z systemu przeliczania akcji i zastąpiliśmy go walką oraz podróżami w czasie rzeczywistym. Gracz nie musi czekad 3 godzin, aż coś się wydarzy, tylko każdy zmiana jest w pewien sposób od niego zależna i wykonuje się w czasie rzeczywistym. Dodatkowo stworzyliśmy miejsca między, którymi się podróżuje, oraz lokacje przejściowe, do których wprowadziliśmy innowacyjny system zdarzeo. Niestety z braku czasu nie mogliśmy „wybudowad” całego miasta (chodziło o sklepy czy warsztaty, jak kuźnia, płatnerz itd.), ale udostępniliśmy mini sklepik w każdej lokacji, w której można zakupid eliksiry życia. Nie mamy także postaci niezależnych co wynika oprócz ze wspomnianego braku czasu także z tego, że nie chcieliśmy tworzyd czegoś czego do kooca nie będziemy wykorzystywad. A nie bylibyśmy w stanie zaprogramowad postaci niezależnych w tak krótkim czasie do tego stopnia by były naprawdę znaczące i użyteczne. 3. Aplikacja programowa i/lub sprzętowa 3.1. Określenie problemu Naszym głównym celem było zapewnienie dynamicznej oraz przejżystej rozgrywki między graczami w czasie rzeczywistym. 5 Gra przeglądarkowa – The Game 3.2. Analiza rozwiązań Rozgrywkę w czasie rzeczywistym można było osiągnąd na wiele sposobów, ale niestety te prostsze są bardzo mało efektywne i bardzo obciążają serwer. Rozwiązaniem, które braliśmy pod uwagę na początku, było proste odświeżanie strony. W celu zapewnienia stałej kontroli zmian można było napisad kod, który zmusza klienta do ponownego wczytywania strony np. co sekundę. Dzięki temu moglibyśmy obserwowad czy coś się zmieniło w konkretnej bazie danych. Jednakże jak łatwo się domyślid rozwiązanie to się kompletnie nie sprawdza przy prawdziwej rozgrywce gdzie jest więcej graczy, jako, że przy każdym odświeżeniu serwer musi osobie wysład wszystkie dane od nowa. Przy większej liczbie osób obciążałoby to bardzo serwer. Szukaliśmy dalej. 3.3. Zaproponowane rozwiązanie W koocu wybraliśmy najlepszą opcję. Long Polling. Jest to połączenie trzech różnych technologii, PHP, Java Scriptu, a dokładnie jQuery oraz AJAXa. Działa on w sposób następujący: W Java Scripcie tworzymy funkcję, która zawiera fragment AJAX’a odpowiedzialny za połączenie JS z częścią PHP. AJAX postuje wybrane przez nas zmienne do części PHP i czeka na odpowiedź, która zostanie wykonana albo po upływie czasu, na który ustawiliśmy pętlę albo gdy pojawi się odpowiedź na serwerze. AJAX ma wspólną zmienną globalną z PHP, która nazywa się Json. Więd PHP zwraca wszystkie zmienne jako Json, odbiera je AJAX i jesteśmy w stanie dzięki temu odczytad w Java Scripcie. Tu decydujemy czy chcemy jeszcze raz uruchomid funkcję czy zadany wynik nas zadowala. Pętla Long Pollingu odpowiadająca za podróżowania i sprawdzanie czy zostaliśmy zaatakowani wygląda tak: Częśd Java Script/AJAX: function getMSG(){ var obr = document.getElementById('obr'); var akapit = document.getElementById('nic'); var miej2 = document.getElementById('opa'); var miej11=miej2.innerHTML; if(rodzajj==3){ exit(); } $.ajax({ type: "GET", url: "pool1.php?timestamp=" + timestamp, 6 Gra przeglądarkowa – The Game async: true, cache: false, success: function(data){ var json=eval('(' + data + ')'); if(json['msg']!=""){ if(rodzajj==3){ exit(); } if(json['rodzaj']==0){ alert("zostałeś zaatakowany przez " + json*'msg'++"a"); akapit.innerHTML="Toczysz walkę z "+ json*'msg'++"em."; $("#tab2").toggle("slow"); $("#ruch").toggle("slow"); //$("#akcja").toggle("slow"); //$("#disp").toggle("slow"); $("#obbr1").hide("slow"); bot(); exit(); } else{ if(json['rodzaj']==1){ enemy=json['msg']; var przeciw1 = document.getElementById('bottek'); przeciw1.innerHTML=enemy; alert("zostałeś zaatakowany przez gracza: " + json*'msg'+); $("#tab2").toggle("slow"); akapit.innerHTML="Toczysz walkę z graczem: "+ json*'msg'++"!"; } $("#tab3").toggle("slow"); $("#disp").toggle("slow"); $("#ruch").toggle("slow"); $("#akcja").toggle("slow"); $("#obbr1").hide("slow"); var op=0; $("#chat").toggle("slow"); 7 Gra przeglądarkowa – The Game pvp(); exit(); } } obr.src=miej11+tablica[x]; x++; if(x==24){ koniec(); exit(); } timestamp=json['timestamp']; setTimeout('getMSG()',1000); }, error: function(XMLHttpRequest, textStatus, errorThrown){ //alert("error: " + textStatus + "(" + errorThrown + ")"); setTimeout('getMSG()',15000); } }); } Częśd PHP: <?php session_start(); include "logconn.inc.php"; $aut=$_SESSION['player_logged']; $czas=isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; if($_GET['timestamp']==0){ $czas=time(); } 8 Gra przeglądarkowa – The Game $czas1=time(); $spr=0; $query = "SELECT tresc, autor, data, id " . "FROM wiadomosci " . "WHERE autor != '$aut' AND tresc = '$aut' " . "ORDER BY data DESC LIMIT 0,1 "; $results= mysql_query($query) or die(mysql_error()); $row=mysql_fetch_array($results); $row['data']=strtotime($row['data']); while($czas>=$row['data']){ usleep(10000); clearstatcache(); $query = "SELECT tresc, autor, data, id " . "FROM wiadomosci " . "WHERE autor != '$aut' AND tresc = '$aut' " . "ORDER BY data DESC LIMIT 0,1 "; $results= mysql_query($query) or die(mysql_error()); $row=mysql_fetch_array($results); $row['data']=strtotime($row['data']); if((time()-$czas1)>0){ $spr=1; break; } } 9 Gra przeglądarkowa – The Game $man=($row['data']); srand((double) microtime() * 1000000); $bocik=rand(0,99); if($bocik<=3 && $spr==1){ $spr=1; }else{ if($spr==1){ $spr=2; }} if($spr==0){ $response = array(); $response['rodzaj']=1; $response['timestamp']=$man; $response['msg']=$row['autor']; $response['timerr']=$row['id']; $query = "INSERT INTO wiadomosci (tresc, autor) VALUES ('" . $row['id'] . "' , '" . $row['id'] . "');"; $result = mysql_query($query) or die(mysql_error()); echo json_encode($response); }else{ if($spr==1){ $response = array(); $response['rodzaj']=0; $response['timestamp']=$man; $response['msg']="Bot"; echo json_encode($response); } else{ $response = array(); $response['rodzaj']=2; $response['timestamp']=$czas; $response['msg']=""; echo json_encode($response); } 10 Gra przeglądarkowa – The Game } ?> 3.4. Wykonanie Oprócz Long Pollingu wykorzystaliśmy też inne elementy różnych technologi. Tutaj w kolejności powstania: - Logowanie ( PHP, HTML ) - Rejestracja ( PHP, HTML ) - Grafika strony ( Grafika powstała głównie przy pomocy Google i Photoshopa ) - Podróżowanie między lokacjami ( Long Polling ) - Walka z Botem ( Long Polling ) - Elementy ruchome strony (HTML, CSS i Java Script ) - Walka z graczem ( Long Polling ) - Chat ( CSS i Long Polling ) - Sklep ( Java Script ) Cała strona została zbudowana przy użyciu technologii CSS. 3.5. Zaistniałe Problemy Jednym z największych problemów było, to że nikt nie chciał trzymad naszej gry na serwerze. Niestety w parę godziny po wgraniu na jakiś darmowy serwer strona zazwyczaj zostawała usunięta. Przypuszczamy, że ma na to wpływ charakter strony. Administratorzy boją się umieszczad gry na serwerach gdyż grozi to dużymi obciążeniami. Niestety przez to, że musieliśmy pracowad tylko i wyłącznie na jednym komputerze pojawiło się wiele problemów. Jako przykład mogę tu postawid Long Polling. Gdy dwóch graczy wchodziło do tej samej funkcji następował wyścig co często skutkowało złym przypisaniem zmiennych. Rozwiązaliśmy ten problem przez podzielenie funkcji na 2 części. W taki sposób 2 graczy walczących ze sobą nigdy nie jest w jeden funkcji. Inne problemy jakie napotkaliśmy były zazwyczaj spowodowane naszym brakiem wiedzy. Jako, że wszystkiego uczyliśmy się od zera i nie były to jedyne nasze zajęcia, niektórych rzeczy musieliśmy się uczyd przez wielokrotne próby. To powoduje, że nasz kod nie jest optymalny i jest dośd chaotyczny. Często jakaś rzecz nie działała i musieliśmy dodad jakaś dodatkową zmienną. Gdybyśmy lepiej znali technologie to niemośd, że moglibyśmy całą grę napisad w krótszym czasie, to jeszcze całośd by był bardziej przejrzysta. 4. Podsumowanie Udało nam się wykonad dużą częśd tego co zaplanowaliśmy na początku. Co więcej projekt ewoluował w trakcie i pojawiło się wiele ciekawych rozwiązao. W przyszłości chcielibyśmy się skupid na naprawieniu rzeczy, które nie działają tak jak powinny czego 11 Gra przeglądarkowa – The Game przykładem jest sklepik, a raczej spożywanie zakupionych eliksirów. Leczy nas tylko mały eliksir. Jest to spowodowane najprawdopodobniej tylko drobnym błędem w kodzie. Dalej chcielibyśmy się skupid na udoskonaleniu napisanego kodu oraz na poprawieniu jego przejrzystości. Chcielibyśmy dodad kolejną pętle Long Pollingu, która by aktualnie sprawdzała kto jest w danej lokacji. Oprócz tego chcielibyśmy poszerzyd teren gry, rozbudowad lokacje, tworząc zróżnicowane sklepy. Każda lokacja powinna byd inna. Dodamy również więcej lokacji przejściowych i zróżnicujemy przeciwników serwerowych ( aktualnie mamy dostępną tylko walkę z jednym „botem” ). Do rozwoju postaci chcielibyśmy dodad wreszcie jakieś konkretne czary oraz rozwój posługiwania się konkretnymi broniami, rozwój umiejętności specjalnych itd. W części kodowej walki gdy powstanie sklep z bronią, czy jakieś czary będziemy musieli dodad tylko pętle ściągającą z serwera co dany gracz ma do dyspozycji ponieważ reszta kodu jest już dostosowana tak by można było tego używad ( podczas ataku możemy wybrad czy chcemy atakowad bronią, czy magią czy może rozbroid przeciwnika, a potem potem pojawia się pusta ramka do wybrania jaką bronią czy czarem chcemy atakowad ). Chcielibyśmy tez wprowadzid w koocu misję i postacie niezależne. Można by powiedzied, że żeby gra była w 100% skooczona to jeszcze dużo przed nami… Ale wystarczy spojrzed ile już wykonaliśmy. Mamy wszystkie podstawowe aspekty wymagane by gra została nazwana grą RPG. Mamy też dynamiczną interakcję z innymi graczami więc wszystkie podstawowe i te najważniejsze założenia mamy już spełnione. Pozostaje teraz tylko skupid się na dopracowaniu szczegółów oraz na dalszym nieprzerwanym rozwijaniu gry. 5. Literatura 1. Michael Glass, Jeremy Stolz, Yann Le Scouarnec, Jason Gerner, Elizabeth Naramore “Beginning PHP5, Apache, MySql Web Development”.