ピクセル単位の地形であるマップがあります。これらのピクセルを個別に描画すると、レンダリングに多くの時間がかかります。
したがって、私の考えは、ピクセルが変更されたときに 100x100 の画像のブロックでそれらを描画し、それらの画像をレンダリングすることです。
「チャンク」のピクセルは、インデックス = x+y*幅の形式で 1D 配列に格納されます。
var img = game.c.createImageData(CHUNK_SIZE,CHUNK_SIZE);
for (var i=0;i<chunk.map.length;i++){
var p = chunk.map[i];
if (p){
img.data[i*4] = 255;
img.data[i*4+1] = 0;
img.data[i*4+2] = 0;
img.data[i*4+3] = 255;
}else{
img.data[i*4] = 0;
img.data[i*4+1] = 0;
img.data[i*4+2] = 0;
img.data[i*4+3] = 0;
}
}
this.render.push({x:chunk.x,y:chunk.y,img:img});
描く:
for (var i=0;i<this.map.render.length;i++){
var img = this.map.render[i];
if (img.x*CHUNK_SIZE > this.player.x - (this.ce.width/2)){
if (img.y*CHUNK_SIZE > this.player.y -(this.ce.height/2)){
if ((img.x*CHUNK_SIZE)+CHUNK_SIZE < this.player.x + (this.ce.width/2)){
if ((img.y*CHUNK_SIZE)+CHUNK_SIZE < this.player.y + (this.ce.height/2)){
console.log("Rendering chunk...");
this.c.putImageData(img.img,(img.x*CHUNK_SIZE)-this.player.x,(img.y*CHUNK_SIZE)-this.player.y);
}
}
}
}
}
ただし、正しくレンダリングされません。ボックスには透明なピクセルがいくつか含まれているため、空のグラデーションが必要な場合にキャンバスが透明になります。
キャンバスに穴を開けずに、そこにあったもの(空のグラデーション)が透明になるように画像を書きたい