import 'dart:html'; import 'dart:math'; typedef void gridIterator(int x, int y); class Game { List> grid; CanvasElement canvas; Random rng = new Random(); double _oscill = 0.1; bool _oscillDir = true; // oscillate upwards (true) or downwards (false) double _OSCILLSPEED = 1.0; bool _fwd = true; Point _curPos = Point(-1, 0); bool isRandom = false; Game(CanvasElement this.canvas) { grid = _buildGrid(5, new Color(255, 255, 255)); } // In-World Logic Updates void update([num dt]) { Point next = isRandom ? nextPosRandom() : nextPosOrdered(_curPos); grid[next.y][next.x] = new Color(rng.nextInt(255), rng.nextInt(255), rng.nextInt(255)); _curPos = next; } Point nextPosOrdered(Point curPos) { Point pos = Point(curPos.x, curPos.y); if (pos.x >= grid[pos.y].length - 1) pos = Point(-1, pos.y + 1); if (pos.y >= grid.length) pos = Point(-1, 0); pos = Point(pos.x + 1, pos.y); return pos; } Point nextPosRandom() { int ry = rng.nextInt(grid.length); return Point(rng.nextInt(grid[ry].length), ry); } // Render Pipeline void draw([num interp]) { CanvasRenderingContext2D ctx = this.canvas.context2D; int brickW = (canvas.width ~/ grid[0].length); int brickH = (canvas.height ~/ grid.length); ctx.clearRect(0, 0, canvas.width, canvas.height); _grid_foreach((x, y) { Color col = _getOscillatedCol(grid[y][x]); ctx.setFillColorRgb(col.r, col.g, col.b); ctx.fillRect(x * brickW, y * brickH, brickW, brickH); }); // This should usually be place in update() // Placed here to highlight render speed changes for some examples // See variable timestep & dirty flag Loops for details _oscillate(); } // Slightly oscillating colors to highlight rendering updates void _oscillate() { if (_oscill >= 50.0 || _oscill <= -50.0) { _oscillDir = !_oscillDir; _oscill = max(min(_oscill, 49.0), -49.0); } else _oscillDir == true ? _oscill += _OSCILLSPEED : _oscill -= _OSCILLSPEED; } Color _getOscillatedCol(Color col) { int o = _oscill.toInt(); return new Color(col.r + o, col.g + o, col.b + o); } void _grid_foreach(gridIterator fun) { for (int y = 0; y < grid.length; y++) { for (int x = 0; x < grid[y].length; x++) { fun(x, y); } } } List> _buildGrid(int size, Color col) { List> grid = new List(size); for (int y = 0; y < size; y++) { grid[y] = new List(size); for (int x = 0; x < size; x++) { grid[y][x] = col; } } return grid; } // Grid Size Button Implementation // true makes squares larger // false makes squares smaller void changeGridSize(bool larger) { if (larger) { if (grid.length <= 5) return; this.grid = _buildGrid(grid.length - 5, Color(255, 255, 255)); } else { if (grid.length >= 60) return; this.grid = _buildGrid(grid.length + 5, Color(255, 255, 255)); } } void toggleRandomOrder() { isRandom = !isRandom; } } class Color { final int r; final int g; final int b; const Color(this.r, this.g, this.b); }