2011-10-27 54 views
19

Tôi đang sử dụng canvas để hiển thị một số họa tiết và tôi cần lật ngang một ảnh theo chiều ngang (do đó, nó quay sang trái hoặc sang phải). Tuy nhiên, tôi không thể thấy bất kỳ phương pháp nào để thực hiện điều đó với drawImage.Lật một ảnh trong vải

Đây là mã có liên quan của tôi:

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; } 
     } 
    } 

Như bạn thấy, tôi đang sử dụng phương pháp drawImage để vẽ sprite của tôi để canvas. Cách duy nhất để lật một sprite mà tôi có thể thấy là lật/xoay toàn bộ khung hình, đó không phải là thứ tôi muốn làm.

Có cách nào để làm điều đó không? Hoặc tôi sẽ cần phải tạo một sprite mới phải đối mặt với cách khác và sử dụng nó?

Trả lời

10

Bạn có thể chuyển đổi ngữ cảnh vẽ canvas mà không cần lật toàn bộ canvas.

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

sẽ phản ánh ngữ cảnh. Vẽ hình ảnh của bạn, sau đó

c.restore(); 

và bạn có thể vẽ lại bình thường. Để biết thêm thông tin, xem https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Transformations

+2

Cảm ơn bạn! Nhưng do câu trả lời của Simon, tôi sẽ sử dụng kỹ thuật của anh ấy. Tôi sẽ đánh dấu bạn là câu trả lời được chấp nhận mặc dù nó trả lời câu hỏi của tôi :) –

33

Trong khi Gaurav đã cho thấy cách kỹ thuật để lật một sprite in canvas ...

Đừng làm điều này cho trò chơi của bạn.

Thay vào đó, hãy tạo một hình ảnh thứ hai (hoặc làm cho hình ảnh hiện tại của bạn lớn hơn) là phiên bản lộn xộn của trang tính lớn. Sự khác biệt hiệu suất giữa "lật ngữ cảnh và vẽ hình ảnh" so với "chỉ vẽ một hình ảnh" có thể lớn. Trong Opera và Safari lật các kết quả canvas trong bản vẽ chậm hơn mười lần và trong Chrome, tốc độ này chậm gấp hai lần. Xem this jsPerf để biết ví dụ.

Tính toán trước các sprites được lật của bạn sẽ luôn nhanh hơn, và trong trò chơi hiệu suất canvas thực sự quan trọng.

+0

Cảm ơn. Những gì tôi đã kết thúc làm là thêm một sprite vào một cái hiện tại của tôi (bên dưới nó) với nhân vật của tôi chạy theo cách khác, và thêm một số mã để sử dụng tập hợp các sprites đó tùy thuộc vào hướng. Như thế này: http://i.imgur.com/uIPvF.png –

+1

Có vẻ tốt! Mặc dù tôi sẽ sắp xếp lại hàng mới: xếp hàng phiên bản lật của mỗi chiều dọc để điều duy nhất bạn phải thay đổi khi lật là toạ độ y. –

+0

Câu trả lời của Gaurav thực sự chỉ có hiệu suất tốn kém do ctx.save/restore. Trong thực tế, nếu bạn chỉ cần gọi ctx.scale (...) mỗi lần, vui nhộn phiên bản lộn rút nhanh hơn: http://jsperf.com/ctx-flip-performance/3. (nó thậm chí còn nhanh hơn nếu bạn gọi ctx.scale (-1) cho lộn và không có gì cho một trường hợp không lật: http://jsperf.com/ctx-flip-performance/4). –

-3

Sử dụng tính năng này để lật trang tính của bạn http://flipapicture.com/

+0

Thật không may điều này không hỗ trợ PNGs :( – Scott

Các vấn đề liên quan