2016-11-22 7 views
1

Das Folgende ist ein Beispiel Code, den ich gerade geschrieben zeigen, dass ich bestimmte Dinge an meinem Spiel Griff:HTML5 Canvas Spiel Optimierung

https://jsfiddle.net/qk7ayx7n/25/

<canvas id = "canvas"></canvas> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 

JS:

var canvas = document.getElementById("canvas"); 
var ctx=canvas.getContext("2d"); 
canvas.width = 750; //keeping ratio 
canvas.height = 587; //keeping ratio 

$('#canvas').css("height", window.innerHeight); 
$('#canvas').css("width", window.innerHeight * 1.277); //keeping the ratio 
//and also resizing according to the window(not to overflow) 

var board = new Image(); 
board.src = "https://s21.postimg.org/ko999yaaf/circ.png"; 
var circle = new Image(); 
circle.src = "https://s21.postimg.org/4zigxdh7r/circ.png"; 
ctx.drawImage(board, 0, 0); 

var x = 10, y = 10; 
ctx.drawImage(circle, x, y); 
startMoving(); 

function startMoving(){ 
     if(y > 310) return; 
    y+=3; 
    ctx.clearRect(0,0,750,587); 
    ctx.drawImage(board, 0, 0); 
     ctx.drawImage(circle, x, y); 
    setTimeout(function(){startMoving()}, 30); 
} 

Eine kleine Erklärung : Dies ist ein einfaches Brettspiel. Zuerst wird die Leinwand auf die Brettmaße selbst gesetzt, um die Koordinaten XY richtig zu bekommen (das ist hier nicht sinnvoll, aber in meinem eigentlichen Spiel ja).

dann wird es nach dem Fenster des Spielers der Größe verändert, in Bezug auf das tatsächliche Verhältnis des ursprünglichen Plattenbildes. Das Verhältnis zu halten ist wichtig für die Qualität des Bildes. Nun erfolgt die Bewegung mit einem einfachen Timer in einer Funktion, sobald es zu einem bestimmten X und Y kommt wird die Bewegung gestoppt.

ich Schwierigkeiten haben, die Bewegung des Kreises immer ohne Pausen zu bewegen/Verzögerungen bei einigen Browsern und Geräten (wie auf einer cordova app), obwohl es in der Regel gut funktioniert. Ich weiß, dass die Verzögerungen durch die Art und Weise verursacht werden, wie ich mit den Dingen umgehe, aber warum? auch, ich habe Probleme, die Geschwindigkeit der Bewegung konstant zu halten - +3 scheint nicht in jedem Browser gleich zu bewegen.

+1

aussieht Vielleicht in request(), INSEAD SetTimeout der Verwendung von() –

+0

Geist zeigt, wie kann ich es mit meinem Beispiel zu integrieren? – user1938653

+0

Schauen Sie hier für wie man Drosselung (60 Frames pro Sekunde ist ein gutes Ziel): http://StackOverflow.com/Questions/19764018/Controlling-FPS-with-RequestAnimationFrame und hier ist eine zufällige nicht-gedrosselte jsFiddle Ich fand, dass Canvas verwendet, aber benutze deinen Code natürlich: https://jsfiddle.net/0q4yLyma/ –

Antwort

1

In den meisten Fällen sollten Sie requestAnimationFrame für JavaScript-basierte Animationen verwenden choppiness zu vermeiden. Bei dieser Technik ist die Position eine Funktion von Zeit nicht wie viele Ausführungsrahmen stattfinden. Auf diese Weise haben schnelle Computer mehr Animationsframes als langsame Computer, aber Sie werden immer noch die gleiche Animationsgeschwindigkeit wahrnehmen. Zum Beispiel:

var x = 10, y = 10; 

var startPos = 10; 
var destPos = 310; 
var startTime = Date.now(); 
var velocity = 0.1; // pixels per millisecond 
var distance = destPos - startPos; 
var duration = Math.abs(distance)/velocity; 

requestAnimationFrame(startMoving); 

function startMoving(now) { 
    var elapsedTime = Math.min(now - startTime, duration); 
    y = startPos + (elapsedTime * velocity); 
    ctx.clearRect(0,0,750,587); 
    ctx.drawImage(board, 0, 0); 
    ctx.drawImage(circle, x, y); 

    if (elapsedTime < duration) 
    requestAnimationFrame(startMoving); 
} 
+0

Vielleicht irre ich mich, aber wenn ich brauche, dass das Bild eine bestimmte Strecke zurücklegt und die Dauer vorbei ist, wegen des langsamen Browsers, würde das Bild einfach dorthin teleportieren, anstatt es zu beenden, nein? – user1938653

+0

Ja, das stimmt. Mit anderen Worten, Sie legen fest, wie lange oder wie schnell die Animation sein soll. Wenn der Computer nur schnell genug ist, um einen Animationsrahmen zu erstellen, werden Sie nichts mehr sehen. Ziemlich unwahrscheinlich. – Jacob

+0

Nun, das könnte ein Problem sein, da ich den Spieler brauche, um seine Bewegung an den neuen Ort zu sehen. Es macht mir nichts aus, wenn er größere Sprünge hat, jeder Sprung ist ein x Pixel verschoben und langsamer Browser wird weniger Sprünge haben. ist es möglich? – user1938653