2011-03-12 46 views
6

我正在HTML5畫布中製作幾何光學演示,鼠標指向光源,可以製作一些屏障,javascript執行計算工作並在這些屏障背後的線上顯示光影。基於setInterval的HTML5畫布中的所有可拖動鼠標對象都是?

那些帆布拖放教程我在網上找到,他們的所有使用setInterval()使鼠標交互發生,這意味着整個畫布進行更新與重新繪所有的時間。這讓我覺得整個畫布生意是一個醜陋的黑客。

我的問題是:是否有任何其他方式使canvas鼠標交互沒有setInterval()方式?我想繪製一次背景,並且只在鼠標實際移動時重繪移動部分,而onmousemove

任何想法是讚賞。謝謝:)

+0

也可以使用'的setInterval()'用鼠標交互畫布繪圖應用程序。有一個叫'requestAnimationFrame'的函數,但它基本上是'setInterval'的增強版本,所以可能不是你要找的。 – pimvdb 2011-03-12 12:20:45

+2

問題是,''真的像一個畫布 - 你不能「解開」它。 – Pointy 2011-03-12 12:20:59

+2

@Pointy:你可以使用兩個'',一個用於背景,每次清除另一個用於鼠標的東西。 – pimvdb 2011-03-12 12:22:02

回答

0

我必須完成這個問題,答案應該是​​從pimvdb

1

您可以重畫畫布而不是被拖動的元素,然後將元素繪製到基底頂部的新加納。然後你可以使用絕對定位來移動被拖動的那個而不需要任何重畫

1

畫布元素上有一個mousemove可用。我一直使用它,我相信它對你的情況非常有用。

你也可以用setInterva來做,但在這種情況下對我來說這聽起來有點骯髒。無論如何,你需要獲得鼠標X和Y,在鼠標移動事件中有什麼地方可以做到這一點!

1

看看這篇文章:http://www.splashnology.com/article/fifteen-puzzle-in-libcanvas/1632/

有一些方法來優化畫布繪製。首先 - 不重新繪製完整的畫布,只更改部分。只有改變了某些東西才能重繪。

在工作中我創建了基於LibCanvas的遊戲現在和背景我​​在另一層畫。類似的東西:

var libcanvas = new LibCanvas('canvas').start(); 
var background = libcanvas.createLayer('bg', 0); 
drawBackgroundAt (background); 
startApplicationAt(libcanvas); 
0

我想你遇到的是,你需要setInterval更新你做mouseinteraction畫布每次。這對你來說感覺有點難看,因爲你覺得這很像「黑客」。

你不必爲此感到難過,因爲對於任何應該動畫的東西你都需要這種機制。

但是,您可以在通過setInterval調用的方法中執行「裁剪」,您可以決定更新畫布的哪個部分並僅重繪該部分。

如果你不需要不斷更新你的內容,因爲它沒有動畫,我同意埃爾默。

但是,通過setInterval更新畫布既不醜陋也不骯髒;-)如果您想爲某些東西製作動畫,則這是您保持畫布更新的方式。

1

首先繪製背景,然後用canvas.save()保存畫布。

鼠標交互:canvas.restore()並繪製您的圖紙。