Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] Zabawy z canvas
Forum PHP.pl > Forum > Po stronie przeglądarki
230005
Jak to napisać - lepiej niż jest teraz - żeby po obróceniu figury, w kolejnej ramce zostawała obrócona? Druga sprawa - metoda translate w metodzie rotate działa dobrze tylko dla kąta 90 stopni. Czy zna ktoś wzór uniwersalny - tak, że przed obrotem nie trzeba będzie sprawdzać kąta i dostosowywać go do niego?

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. function GenericFigure(context) {
  3. this.states = ["wait", "moving", "rotating", "stop"];
  4. this.state = this.states[0];
  5. this.ctx = context;
  6. this.sqrW = this.sqrH = 20;
  7. this.ctxW = 200;
  8. this.ctxH = 350;
  9.  
  10. this.colorsO = {
  11. red : "#ee1515",
  12. green : "#45d137",
  13. blue : "#17a3f3",
  14. orange : "#ff910f",
  15. purple : "#680077"
  16. };
  17.  
  18. this.colorsA = ["#ee1515", "#45d137", "#17a3f3", "#ff910f", "#680077"];
  19.  
  20. this.pickColor = function() {
  21. var num = Math.floor(Math.random() * 5);
  22. return this.colorsA[num];
  23. }
  24. }
  25.  
  26. function Rectangle(context) {
  27. this.inheritFrom = GenericFigure;
  28. this.inheritFrom(context);
  29. this.width = this.sqrW;
  30. this.height = this.sqrH * 3;
  31. this.x = this.ctxW / 2;
  32. this.y = 0;
  33. this.rotation = -1;
  34.  
  35. this.setRotation = function(angle) {
  36. this.rotation = angle;
  37. }
  38.  
  39. this.rotate = function() {
  40. this.ctx.clearRect(0, 0, this.ctxW, this.ctxH);
  41. this.ctx.translate(this.x + 2 * this.width, this.y - 2 * this.height + 20);
  42. this.ctx.rotate(this.rotation * Math.PI / 180);
  43. this.ctx.fillRect(this.ctxW / 2, 0, this.width, this.height);
  44. this.ctx.restore();
  45. }
  46.  
  47. this.moveDown = function() {
  48. this.y += 20;
  49. this.ctx.restore();
  50. this.ctx.clearRect(0, 0, this.ctxW, this.ctxH);
  51. this.ctx.fillRect(this.x, this.y, this.width, this.height);
  52. this.ctx.save();
  53.  
  54. if(this.rotation > -1) {
  55. this.rotate();
  56. }
  57. l("A");
  58. }
  59.  
  60. this.draw = function() {
  61. this.ctx.fillStyle = this.pickColor();
  62. this.ctx.save();
  63. this.ctx.fillRect(this.x, this.y, this.width, this.height);
  64. }
  65. }
  66.  
  67. //a tak można wywołać:
  68.  
  69. var ctx = document.getElementById("game").getContext("2d");
  70. var rect = new Rectangle(ctx);
  71. rect.draw();
  72.  
  73. var inte = setInterval(function(){if(rect.y >= rect.ctxH - rect.height){clearInterval(inte);return;}if(rect.y == 60) rect.setRotation(90);rect.moveDown();}, 500);
  74.  
[JAVASCRIPT] pobierz, plaintext


Edit:

Kolejna rzecz:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. this.ctx.translate(this.x, 0);
  3.  
[JAVASCRIPT] pobierz, plaintext


Wydawało mi się, że to powinno ustawić punkt obrotu na lewy górny róg figury (0, dlatego że na osi Y jest na samej górze, jak by ktoś nie wiedział winksmiley.jpg), a chyba nie ustawia, bo figura po obróceniu znajduje się dwie (swoje) wysokości niżej.
erix
Cytat
Czy zna ktoś wzór uniwersalny - tak, że przed obrotem nie trzeba będzie sprawdzać kąta i dostosowywać go do niego?

O ile pamiętam (a bawiłem się canvas już spory kawałek czasu temu), to trzeba podawać zawsze wartość kąta. Nie ma możliwości (+/-)N, ale trzeba podawać wartości absolutne.

Tak btw, czemu się nie zainteresujesz jakimś frameworkiem zaprojektowanego specjalnie dla canvas?
230005
Cytat
O ile pamiętam (a bawiłem się canvas już spory kawałek czasu temu), to trzeba podawać zawsze wartość kąta. Nie ma możliwości (+/-)N, ale trzeba podawać wartości absolutne.


No tak i ten wzór który tam jest, czyli this.rotation * Math.PI / 180 wydaje się dobry - znaczy zwraca dobre wartości, a mimo to figura ląduje w zupełnie niespodziewanym miejscu. Mi chodzi o metodę obiektu ctx o nazwie translate(), której działania nie ogarniam smile.gif. Uruchom ten kod, a sam zobaczysz o co mi chodzi.

Cytat
Tak btw, czemu się nie zainteresujesz jakimś frameworkiem zaprojektowanego specjalnie dla canvas?


Zainteresuję się, ale w takiej kolejności jak uczyłem się wszystkiego do tej pory, czyli najpierw surowa implementacja, a dopiero później jakieś frameworki. Nie chcę być jednym z tych, którzy wiedzą do czego służy $() w jQuery, a nie wiedzą do czego jest document.getElementById() w czystym js smile.gif.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.