2011-10-27 11 views
19

Sto usando la tela per visualizzare alcuni sprite, e ho bisogno di capovolgerne uno in orizzontale (quindi rivolto verso sinistra o destra). Non riesco a vedere alcun metodo per farlo con drawImage, tuttavia.Capovolgere uno sprite su tela

Ecco il mio codice rilevante:

this.idleSprite = new Image(); 
this.idleSprite.src = "/game/images/idleSprite.png"; 
this.idleSprite.frameWidth = 28; 
this.idleSprite.frameHeight = 40; 
this.idleSprite.frames = 12; 
this.idleSprite.frameCount = 0; 

this.draw = function() { 
     if(this.state == "idle") { 
      c.drawImage(this.idleSprite, this.idleSprite.frameWidth * this.idleSprite.frameCount, 0, this.idleSprite.frameWidth, this.idleSprite.frameHeight, this.xpos, this.ypos, this.idleSprite.frameWidth, this.idleSprite.frameHeight); 
      if(this.idleSprite.frameCount < this.idleSprite.frames - 1) { this.idleSprite.frameCount++; } else { this.idleSprite.frameCount = 0; } 
     } else if(this.state == "running") { 
      c.drawImage(this.runningSprite, this.runningSprite.frameWidth * this.runningSprite.frameCount, 0, this.runningSprite.frameWidth, this.runningSprite.frameHeight, this.xpos, this.ypos, this.runningSprite.frameWidth, this.runningSprite.frameHeight); 
      if(this.runningSprite.frameCount < this.runningSprite.frames - 1) { this.runningSprite.frameCount++; } else { this.runningSprite.frameCount = 0; } 
     } 
    } 

Come potete vedere, sto usando il metodo drawImage per disegnare i miei sprite alla tela. L'unico modo per capovolgere uno sprite che posso vedere è quello di capovolgere/ruotare l'intero canvas, che non è quello che voglio fare.

C'è un modo per farlo? O dovrò fare un nuovo sprite rivolto verso l'altro modo e usarlo?

risposta

10

È possibile trasformare il contesto del disegno su tela senza capovolgere l'intero quadro.

c.save(); 
c.scale(-1, 1); 

rispecchierà il contesto. Disegna la tua immagine, quindi

c.restore(); 

e puoi disegnare di nuovo normalmente. Per ulteriori informazioni, vedere https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Transformations

+2

Grazie! Ma grazie alla risposta di Simon, userò la sua tecnica. Contrassegnerò la tua come risposta accettata anche se risponde alla mia domanda :) –

33

Mentre Gaurav ha indicato la strada tecnica per capovolgere uno sprite in tela ...

non facciamo questo per il vostro gioco.

Invece fare una seconda immagine (o ingrandire l'immagine corrente) che è una versione capovolta del foglio di spite. La differenza di prestazioni tra "capovolgere il contesto e disegnare un'immagine" o "semplicemente disegnare un'immagine" può essere enorme. In Opera e Safari capovolgendo i risultati della tela nel disegno è dieci volte più lento e in Chrome è due volte più lento. Vedere this jsPerf per un esempio.

Pre-calcolo degli sprite capovolti sarà sempre più veloce, e nelle prestazioni della tela di gioco è davvero importante.

+0

Grazie. Quello che ho finito è stato aggiungere un altro sprite al mio esistente (sotto di esso) con il mio personaggio che girava dall'altra parte, e ho aggiunto del codice per usare quell'insieme di sprite a seconda della direzione. Ad esempio: http://i.imgur.com/uIPvF.png –

+1

Sembra buono! Anche se vorrei riorganizzare la nuova riga: allinea la versione capovolta di ciascuna verticalmente in modo che l'unica cosa che devi cambiare quando si gira è la coordinata y. –

+0

La risposta di Gaurav è in realtà solo una prestazione costosa a causa di ctx.save/restore. Infatti, se chiami semplicemente ctx.scale (...) ogni volta, la versione girata diventa esilarante più veloce: http://jsperf.com/ctx-flip-performance/3. (è ancora più veloce se chiami ctx.scale (-1) per il flipped e nulla per un caso non-flipped: http://jsperf.com/ctx-flip-performance/4). –

-3

Utilizzare questa opzione per capovolgere il vostro foglio sprite http://flipapicture.com/

+0

Purtroppo questo non supporta i PNG :( – Scott

Problemi correlati