forked from 50m30n3/Neurobots
-
Notifications
You must be signed in to change notification settings - Fork 0
/
floor.js
98 lines (82 loc) · 2.7 KB
/
floor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
function Floor(size,canvas) {
this.size = size;
this.canvas = canvas;
this.ctx = canvas.getContext("2d");
this.tick = 0;
this.map = new Array(this.size*this.size);
this.init = function() {
this.resetImage();
this.resetMap();
this.modified();
}
this.reset = function() {
this.resetMap();
this.resetImage();
this.modified();
this.tick = 0;
}
this.resetImage = function() {
this.image = this.ctx.getImageData(0,0,this.size,this.size);
}
this.resetMap = function() {
for( var x = 0; x<this.size; x++)
for( var y = 0; y<this.size; y++)
this.set(x,y,0,0,true);
}
this.modified = function() {
this.ctx.putImageData(this.image,0,0);
}
this.get = function(x,y) {
if(x<0) while(x<0) { x+=this.size; }
if(y<0) while(y<0) { y+=this.size; }
if(x>=this.size) x = x % this.size;
if(y>=this.size) y = y % this.size;
return this.map[x*this.size+y];
}
this.set = function(x,y,value,area,dontblit) {
if(x<0) while(x<0) { x+=this.size; }
if(y<0) while(y<0) { y+=this.size; }
if(x>=this.size) x = x % this.size;
if(y>=this.size) y = y % this.size;
this.map[x*this.size+y] = value;
var c = Math.floor((1-value*0.6)*127);
this.setPixel(x,y,c,c,0,0xff);
if(area > 0) {
var mdist = Math.sqrt(Math.pow(area,2)+Math.pow(area,2))
for( var nx = x - area; nx < x+area; nx++ )
for( var ny = y - area; ny < y+area; ny++ ) {
d = Math.sqrt(Math.pow(nx-x,2)+Math.pow(ny-y,2));
this.set(nx,ny,this.get(nx,ny) + value*(mdist-d)/mdist/4,0,true);
}
}
if(dontblit)
return;
this.modified();
}
this.imageUpdate = function() {
for( var x = 0; x<this.size; x++)
for( var y = 0; y<this.size; y++)
this.set(x,y,this.get(x,y),0,true);
this.modified();
}
this.setPixel = function setPixel(x, y, r, g, b, a) {
index = (x + y * this.image.width) * 4;
this.image.data[index+0] = r;
this.image.data[index+1] = g;
this.image.data[index+2] = b;
this.image.data[index+3] = a;
}
this.step = function() {
this.tick++;
if (this.tick >= 500) {
this.smoothMap();
this.tick = 0;
}
}
this.smoothMap = function() {
for( var x = 0; x<this.size; x++)
for( var y = 0; y<this.size; y++)
this.map[x*this.size+y] = this.get(x,y) * 0.95;
this.imageUpdate();
}
}