2012-02-19 26 views
1

的代碼的基礎是由約翰·E. Graham的博客http://johnegraham2.com/blog/2010/09/25/project-javascript-2d-tile-engine-with-html5-canvas-part-4-using-zones-for-further-optimization/製作的Javascript TileEngine滾動的帆布

它完美地繪製磚的屏幕的價值,但我不能爲我的生活弄清楚如何調整它是按上,下,左或右鍵一次一行/一列。

下面是一個透明度的例子,用於幫助顯示區域http://simplehotkey.com/Javascript/canvas.html(加載位置爲1,188個瓷磚,但僅畫幾百個填充屏幕)我使用它加載了一個包含70,000個條目的數組,它仍然很快,因爲它只繪製什麼在屏幕上,但無法弄清楚如何滑動一切基於輸入...

我想出了一對夫婦的想法,我不知道什麼是最好的方式。瓦片

相當於一個畫面如下所示:

tilesArray = [ 
       0,0,0,0,0,0,0,1,2,9,6,0,0,7,0,0,1,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,0, 
       0,9,9,9,9,9,9,0,7,2,0,0,0,0,0,1,2,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0, 
       0,9,0,7,2,9,9,9,9,9,9,9,9,9,9,9,9,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0, 
       0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0, 
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
       ]; 

其中0是一個壁磚(約周長),9一地板磚,7的門和幾個其他的隨機瓷磚。

這正是加載到屏幕上的內容,但我無法弄清楚如何根據輸入向上,向下,向左,向右移動任何方向上的所有內容。

我傾向於現在的一個想法,就是使用上面的數組作爲渲染的基礎,並以某種方式基於鍵盤輸入從另一個數組中提取新值。也許從另一個更大的數組切片(保存整個關卡的所有切片)並使用該切片填充實際呈現的數組?

這是每幀雖然更換每瓦...

用於獲取玩家輸入我用的是:

//Key listener 
document.onkeydown = function(e){ 
e = e?e:window.event; 
console.log(e.keyCode + "Down"); 
switch (e.keyCode){ 
    case 38: 
    //UP KEY 
    Game.inputReaction('up'); 
    //Game.moveDir('up'); 
    break; 
    case 40: 
    //DOWN KEY 
    //Game.inputReaction(40); 
    //Game.moveDir('down'); 
    break; 
    case 37: 
    //Left Key 
    //Game.inputReaction(37); 
    break; 
    } 
} 

另一種方法是嘗試已經調整屏幕上的瓦片,並添加新瓷磚,但這個引擎不使用全局變量,所以我不知道如何基於輸入以編程方式影響瓷磚引擎....就像我可以添加另一種方法(inputReaction(num)),並從我的鍵盤輸入中觸發一些操作(console.log()),但我無法訪問實際繪製切片的其他方法。或者,也許我必須製作該對象的副本,更改並返回它?但它非常複雜。

我認爲可能更容易調整被引入「引擎」(上面的數組)的數組值,而不是改變引擎如何計算正在繪製的內容。你能證實這一點嗎?

回答

0

添加一個可以在地圖上移動的相機抽象,然後根據相機位置移動繪圖位置。當相機向南移動10px時,所有瓷磚向北移動10px,與東方和西方相同。由於您只繪製可見的圖塊,因此不會有太大的性能損失。

渲染器查看攝像頭以找出需要繪製的內容,並且可以將攝像頭對象暴露給外部來操縱它。這樣你只需要改變相機的位置就可以改變屏幕上顯示的內容。

我在一年前的概念驗證平鋪引擎中做了這個,並且我能夠平滑地滾動和縮放巨大的地塊圖。

如果您開始更改陣列本身,您的性能將受到影響,並且您將無法順利滾動,因爲您只能逐步移動一個貼片而不是一個像素。