Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Animacja - Js
sonquer
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.08.2012

Ostrzeżenie: (0%)
-----


Witam, ostatnimi czasy zająłem się programowaniem gry w js/php/ajax.

A co do probelmu jak zaanimować taki obrazek :
http://pix.art.pl/files/artworks/Persiakout5.gif
do ruchu w prawo, lewo, górę, dół.. wiem że ma się to dziać w pętli.

Pokaże wam kawałek skryptu na ruch:


$(document).keydown(function (event) {
var code = (event.keyCode ? event.keyCode : event.which);
if(code == UP){
event.preventDefault();
y-=ile;
$("#"+nick+"").css("top", y+ "px");
}
......... i tak dalej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. Obiekt Event z jQuery sam zajmuje się niekompatybilnościami przeglądarek (IE), więc nie musisz się już tym zajmować (patrz: var code = ...).
2. Wykonywanie logiki gry wewnątrz kodu odpowiedzialnego za przechwytywanie zdarzeń od użytkownika oraz brak odseparowania samej gry od jej prezentacji (DOM/CSS) to fatalny pomysł, który na dłuższą metę przyniesie Ci całą masę problemów. Zauważ, że już teraz prędkość poruszania się Twojej postaci jest uzależniona od... ustawień systemu operacyjnego, w którym możesz zmienić częstotliwość "wciskania" klawisza. Powinieneś: a) przy wciśnięciu klawisza jedynie ustawić sobie jakąś wewnętrzną flagę informującą o jego wciśnięciu cool.gif cały ruch, zdarzenia (ogólnie fizykę gry) oprzeć o czas, nie zdarzenia (patrz punkt 3.).
3. Raczej powinieneś posiadać tzw. main-loop, czyli pętlę, która będzie wykonywać się bez końca, przy każdym swoim przejściu będzie liczyła z maksymalną dokładnością (milisekundy wystarczą) czas wykonywania się (FPS-y). JS jest językiem bez obsługi wielowątkowości (chyba, że skorzystasz z WebWorkers), ale przy pomocy setTimeout i odrobiny arytmetyki będziesz mógł bez problemu stworzyć taką pętlę o z góry określonej maksymalnej szybkości wykonywania się (60 FPS w pełni wystarczy).

Co do samej animacji, sprawa jest dosyć prosta.
1. Każda klatka powinna mieć możliwość bycia wyświetlaną przez inny okres czasu (np. klatka #1 przez 20 ms, klatka #2 przez 30 ms, klatka #3 przez 25 ms).
2. Jak rozumiem, każdy wiersz w tym obrazku to osobna animacja, natomiast kolumny w wierszu to poszczególne klatki.
3. Obrazki możesz wyświetlać jako tło elementu o rozmiarach pojedynczej klatki. Zmiana klatki będzie polegać wyłącznie na zmianie pozycji tła (CSS: background-position). Innymi słowy technika dokładnie ta sama co w przypadku CSS Sprites.
4. Dla każdej animacji tworzysz sobie osobny obiekt - powinien on otrzymać wymiary klatki, obrazek z animacją oraz czas wyświetlania poszczególnej klatki. Przy każdym przejściu pętli będziesz wykonywać metodę update(elapsedTime) na tym obiekcie. Argument tej metody to czas jaki upłynął od jej ostatniego wywołania (patrz punkt 3. z pierwszej listy). Metoda ta: a) doda wartość z argumentu do swojego wewętrzego licznika, cool.gif sprawdzi czy czas zapisany w liczniku jest większy bądź równy czasowi wyświetlania aktualnej klatki; jeżeli nie zwróci niezmienione koordynaty dla animacji (dla właściwości background-position); jeżeli tak zwróci nowe koordynaty, a od licznika odejmie czas wyświetlania właśnie zmienionej klatki. Oczywiście przy dojściu do ostatniej klatki, trzeba będzie zacząć cały proces od nowa.

W przypadku gdybyś jednak zdecydował się na to by całą fizykę gry oprzeć o zdarzenia (zły pomysł) wystarczy, że dla każdej animacji utworzysz przy pomocy setInterval/setTimeout funkcję zwracającą pozycję następnej klatki.
Go to the top of the page
+Quote Post
sonquer
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.08.2012

Ostrzeżenie: (0%)
-----


Dzięki za taką bombę info, ale ja nawet nie wiem jak zrobić tą pętle, mógł byś mi podać jakiś przykład ? Kawałek kodu ?
Byłbym bardzo wdzięczny.
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


[JAVASCRIPT] pobierz, plaintext
  1. function Game() {
  2. this.isRunning;
  3. this.loopTime = new Date().getTime();
  4. }
  5.  
  6. Game.prototype.start = function() {
  7. this.isRunning = true;
  8. this.gameLoop();
  9. };
  10.  
  11. Game.prototype.stop = function() {
  12. this.isRunning = false;
  13. };
  14.  
  15. Game.prototype.gameLoop = function() {
  16. if (!this.isRunning) {
  17. console.log("stop!");
  18. return;
  19. }
  20.  
  21. var elapsedTime = (new Date().getTime() - this.loopTime) / 1000.0;
  22.  
  23. console.log("game loop: " + elapsedTime);
  24.  
  25. this.loopTime = new Date().getTime();
  26. window.setTimeout(this.gameLoop.bind(this), 1000 / 60);
  27. };
  28.  
  29.  
  30.  
  31. var game = new Game();
  32. game.start();
  33.  
  34. setTimeout(game.stop.bind(game), 3000);
[JAVASCRIPT] pobierz, plaintext
Tutaj trzeba od razu poprawić jedną rzecz. W chwili obecnej po wykonaniu się pętli następuje przerwa 1/60 sekundy, a powinna być 1/60 - czasGenerowaniaKlatki sekundy - ale to już kwestia prostej matematyki. Wtedy też uzyskasz stałą liczbę klatek na sekundę (FPS = 60) co nieco ułatwi tworzenie gry.

PS. Nie powiedziałbym by JS był najlepszym wyborem na początek przygody z grami.
Go to the top of the page
+Quote Post
sonquer
post
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.08.2012

Ostrzeżenie: (0%)
-----


więc w jakim języku zacząć ?

A przy okazji widzę że jesteś zorientowany w temacie Js i ogólnie porgramowania.
Jest możliwość stworzenia gry przeglądarkowej w C/C++? Jeżeli tak to jakie biblioteki wykorzystać ?

Ten post edytował sonquer 21.08.2012, 15:14:39
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


IMHO na start bardzo dobrym wyborem będzie Java/C#. Szczególnie ciekawie wygląda sprawa z frameworkiem PlayN, który pozwala raz napisany kod w Javie wykorzystać w Javie, Androidzie (w sumie też Java), Flashu i JavaScripcie.
C/C++? Oczywiście że nadają się, ale mają sporo wad w porównaniu do platform działających w oparciu o maszynę wirtualną.

EDIT: C/C++ w przeglądarce? Nie ma takiej możliwości. Aplety Javy będą tutaj najbliższym odpowiednikiem.

Ten post edytował Crozin 21.08.2012, 15:39:16
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


co do częstotliwości fps wystarczy dla płynności 25fps, czyli co 40ms (chyba, że klatki z sobą totalnie nie są powiązane), ale po co walić od razu na górną granicę rozróżnialnych przez człowieka klatek??
do poczytania:
Szybkość klatek
Klatki na sekundę


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@zegarek84: 25 FPS to w większości przypadków zdecydowanie za mało. W filmach wystarczy, ponieważ poruszające się obiekty są rozmazane. W grze, każda klatka wyświetla idealnie ostry obraz, stąd liczba klatek musi być na poziomie minimum 30-40 FPS by uzyskać dobrą płynność ruchu.

EDIT: http://boallen.com/fps-compare.html - jestem pewien, że zauważysz różnicę pomiędzy 30, a 60 FPS-ami.

Ten post edytował Crozin 21.08.2012, 23:15:35
Go to the top of the page
+Quote Post
zielu001
post
Post #9





Grupa: Zarejestrowani
Postów: 87
Pomógł: 3
Dołączył: 15.08.2009

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 21.08.2012, 16:38:01 ) *
EDIT: C/C++ w przeglądarce? Nie ma takiej możliwości. Aplety Javy będą tutaj najbliższym odpowiednikiem.


Przepraszam że się wtrące biggrin.gif
Ale jest możliwość. Wystarczy napisać dodatkową wtyczkę do przeglądarki lub kożystać z gotowych rozwiązań, jest wiele frameworków np. Unity, Unreal

Wcześniej napisałeś
"C/C++? Oczywiście że nadają się, ale mają sporo wad w porównaniu do platform działających w oparciu o maszynę wirtualną."

Skąd masz takie informacje? Wady? Może podasz kilka, dużo lat w Cpp siedzę i nie spotkałem się z żadnymi takimi wadami oraz nikt też nie wspominał.


Przepraszam że poprawiam, ale nie cierpię jak ktoś kogoś wprowadza w błąd. A co do FPS nie będę się rozpisywał bo to już jest śmieszne biggrin.gif Tak samo jak mówą że fps 60+ nic nie daje sciana.gif


--------------------
"Zło do triumfu potrzebuje tylko tego, aby dobrzy ludzie nic nie robili"
Go to the top of the page
+Quote Post
Crozin
post
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Przepraszam że się wtrące
Ale jest możliwość. Wystarczy napisać dodatkową wtyczkę do przeglądarki lub kożystać z gotowych rozwiązań, jest wiele frameworków np. Unity, Unreal
Powiedzmy, że w C++ da się zrobić wszystko, ale nie "normalną/typową" dla stron WWW drogą.
Cytat
Skąd masz takie informacje? Wady? Może podasz kilka, dużo lat w Cpp siedzę i nie spotkałem się z żadnymi takimi wadami oraz nikt też nie wspominał.
Ot, pierwsze z brzegu: konieczność ręcznego zajmowania się pamięcią czy bardzo słaba przenośność pomiędzy platformami. Nie uniemożliwia to utworzenia oprogramowania ale potrafi naprzykrzać się.
Go to the top of the page
+Quote Post
sonquer
post
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.08.2012

Ostrzeżenie: (0%)
-----


Będę bardzo wdzięczy jak ktoś zrobi mi z tego obrazka Animację.
Nawet częściową (ruch w górę albo w bok). Z tego obrazka co podałem w pierwszym poście.
Go to the top of the page
+Quote Post
Crozin
post
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dostałeś już wystarczająco dużo informacji - możesz przynajmniej spróbować sam. Zresztą nikt dokładnie nie wie, jak wygląda reszta Twojego kodu, więc jak niby miałby napisać to poprawnie.
Go to the top of the page
+Quote Post
sonquer
post
Post #13





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.08.2012

Ostrzeżenie: (0%)
-----


Pętla która wykonuje ruch w prawo...
Go to the top of the page
+Quote Post
Crozin
post
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Pokaż co masz do tej pory... najlepiej na żywo, np. przy pomocy http://jsfiddle.net/

Ten post edytował Crozin 22.08.2012, 14:01:25
Go to the top of the page
+Quote Post
sonquer
post
Post #15





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.08.2012

Ostrzeżenie: (0%)
-----


x i y pobieranie jest z bazy danych.

to odpowiada za skręt postaci w danym kierunku :

setTimeout('$("div#"+nick+"").css({backgroundPosition : "0px 47px"})',10);
_______________________


var ile = 32;

var UP = 38;
var DOWN = 40;
var RIGHT = 37;
var LEFT = 39;

var ESC = 27;

$(document).keydown(function (event) {
var code = (event.keyCode ? event.keyCode : event.which);
if(code == UP){
event.preventDefault();
y-=ile;
setTimeout('$("div#"+nick+"").css({backgroundPosition : "0px 47px"})',10);
$("#"+nick+"").css("top", y+ "px");
}

if(code == DOWN){
event.preventDefault();
y+=ile;
setTimeout('$("div#"+nick+"").css({backgroundPosition : "0px 0px"})',10);
$("#"+nick+"").css("top", y+ "px");
}

if(code == RIGHT){
event.preventDefault();
x-=ile;
setTimeout('$("div#"+nick+"").css({backgroundPosition : "0px 141px"})',10);
$("#"+nick+"").css("left", x + "px");
}

if(code == LEFT){
event.preventDefault();
x+=ile;
setTimeout('$("div#"+nick+"").css({backgroundPosition : "0px 94px"})',10);
$("#"+nick+"").css("left", x + "px");
}

if(code == ESC){

alert("Kordy : x = " + x + ", y = " + y);

}
});
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 05:09