javascript - 在无限地图上绘制精灵的算法
问题描述
我正在 HTML5 画布上制作游戏(它是无限的),我想在我的游戏中随机地从 Perlin 噪音中制作灌木丛。我希望块是 16 x 16 的瓦片网格,每个瓦片彼此相距 85 像素。我只是用这个简单的代码绘制网格:
ctx.lineWidth=4,ctx.strokeStyle="#000",ctx.globalAlpha=.06,ctx.beginPath();
for(var p=-5;p<canvas.width;p+=85){ctx.moveTo(p + (offset[0] % 85),0),ctx.lineTo(p + (offset[0] % 85),canvas.height)};
for(var m=-5;m<canvas.height;m+=85){ctx.moveTo(0,m + (offset[1] % 85)),ctx.lineTo(canvas.width,m + (offset[1] % 85))};
ctx.stroke();
ctx.globalAlpha=1;
这是我为灌木提供的当前代码,但我不知道如何使它真正起作用:
for(x=offset[0];x<offset[0]+16;x++) {
for(y=offset[1];y<offset[1]+16;y++) {
if (noise.perlin2(x / 10, y/10) < -0.6) {
ctx.drawImage(treeimage, x, y)
}
}
}
我可以访问播放器的当前块,以及基于播放器当前位置的对象偏移量(只需在玩家按下箭头键时添加和减去它)。
编辑:对不起,我没有正确解释这一点。图像显示,当玩家四处移动时,我无法弄清楚如何使灌木丛在屏幕上具有正确的位置,和/或使玩家周围的 8 个块也加载,但仅在屏幕上有东西时显示.
只是一个例子:
解决方案
在你打电话之前
ctx.drawImage(treeimage, x, y)
您必须确保从服务器检索图像。
一种方法是在页面上插入一个小 IMG 标签,然后从中检索图像
<img id="treeimage" src="images/mapobjects/tree2.png" style="display:none;">
window.onload = function() { //use onload if you create drawing at page load
var treeimage = document.getElementById("treeimage");
ctx.drawImage(treeimage, x, y);
}
另一种方法是通过代码创建IMG标签,从不显示,但确保它具有onload功能。从现在起调用后,您可以随时使用您的图像。
window.treeimage = document.createElement('img'); //make it global or take care about scope
treeimage.src = "images/mapobjects/tree2.png";
treeimage.onload = function(){
//only from now you can use that image
ctx.drawImage(treeimage, x, y);
};
推荐阅读
- android - 在 Gitlab CI 上运行 Android 模拟器
- javascript - 使用带有 Web Speech API 的语法来造句(正确的方法)
- ios - 表格视图单元格中的 ImageView 没有从前导获取整个宽度
- php - 反序列化购物车数据 - Laravel
- java - 为什么数据库在加载后立即为空
- r - 在R中的highchats中显示y轴上的所有组
- dolphindb - 在dolphindb中,我在启动脚本(startup.dos)中调用了view函数,没有生效,为什么?
- graph - Pytorch 中 Dataloader 的图形输入(networkx)
- node.js - 发送流作为 axios 请求的响应
- c# - C# Linq 表达式无法翻译