2012-02-19 76 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,与东方和西方相同。由于您只绘制可见的图块,因此不会有太大的性能损失。

渲染器查看摄像头以找出需要绘制的内容,并且可以将摄像头对象暴露给外部来操纵它。这样你只需要改变相机的位置就可以改变屏幕上显示的内容。

我在一年前的概念验证平铺引擎中做了这个,并且我能够平滑地滚动和缩放巨大的地块图。

如果您开始更改阵列本身,您的性能将受到影响,并且您将无法顺利滚动,因为您只能逐步移动一个贴片而不是一个像素。