Wenn das Auto an derselben Position bleiben soll (relativ zur Position des Canvas), dann sollten Sie das Auto nicht bewegen. Verschieben Sie stattdessen das Hintergrundbild/die Strecke/die Karte auf die andere Seite.
Den Eindruck erwecken, dass das Auto nach rechts fährt, kann entweder durch das Bewegen des Autos nach rechts oder durch das Bewegen der Karte nach links erreicht werden. Die zweite Option scheint das zu sein, was Sie wollen, da sich das Auto nicht bewegen wird, während der sichtbare Bereich (d.h. die Karte) sich ändern wird.
Dies ist eine schnelle Demo von Grund auf: http://jsfiddle.net/vXsqM/.
Es kommt darauf an, die Position der Karte umzukehren:
$("body").on("keydown", function(e) {
if(e.which === 37) pos.x += speed; // linke Pfeiltaste, also Karte nach rechts bewegen
if(e.which === 38) pos.y += speed;
if(e.which === 39) pos.x -= speed;
if(e.which === 40) pos.y -= speed;
// Stellen Sie sicher, dass Sie die Karte nicht zu weit bewegen können.
// Die Klammerfunktion macht folgendes: wenn x < -250, dann return -250
// wenn x > 0, dann return 0
// andernfalls ist es erlaubt, also einfach x zurückgeben
pos.x = clamp(pos.x, -250, 0);
pos.y = clamp(pos.y, -250, 0);
draw();
});
Dann können Sie die Karte mit der gespeicherten Position zeichnen:
ctx.drawImage(img, pos.x, pos.y);
Wenn Sie nach einer Möglichkeit suchen, das Auto tatsächlich zu bewegen, wenn die Karte nicht weiter bewegt werden kann (weil Sie das Auto nahe an einer Seite der Karte fahren), dann müssen Sie die Klammerfunktion erweitern und auch verfolgen, wann das Auto bewegt werden sollte und wie weit: http://jsfiddle.net/vXsqM/1/.
// für die x-Koordinate:
function clamp2(x, y, a, b) { // x = Auto x, y = Karte x, a = min Karten x, b = max Karten x
return y > b ? -y : y < a ? a - y : x;
}
Die Positionsbeschränkung wird dann etwas komplexer:
// Berechnen, wie weit das Auto bewegt werden sollte
posCar.x = clamp2(posCar.x, posMap.x, -250, 0);
posCar.y = clamp2(posCar.y, posMap.y, -250, 0);
// Erlauben Sie auch nicht, dass das Auto von der Karte weg bewegt wird
posCar.x = clamp(posCar.x, -100, 100);
posCar.y = clamp(posCar.y, -100, 100);
// Berechnen, wo die Karte gezeichnet werden soll
posMapReal.x = clamp(posMap.x, -250, 0);
posMapReal.y = clamp(posMap.y, -250, 0);
// Verfolgen, wo sich die Karte virtuell befindet, um die Position des Autos zu berechnen
posMap.x = clamp(posMap.x, -250 - 100, 0 + 100);
posMap.y = clamp(posMap.y, -250 - 100, 0 + 100);
// die 100 steht dafür, dass das Auto (Kreis in der Demo) einen Radius von 25 hat und maximal 100 Pixel nach links und rechts bewegt werden kann (dann stößt es an die Seite)