Fixed up erase and added scratch draw highlighting
This commit is contained in:
parent
5c837d80bf
commit
1c538caade
|
@ -92,6 +92,11 @@ ascii.Cell.prototype.isSpecial = function() {
|
||||||
return this.getRawValue() == SPECIAL_VALUE;
|
return this.getRawValue() == SPECIAL_VALUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** @return {boolean} */
|
||||||
|
ascii.Cell.prototype.hasScratch = function() {
|
||||||
|
return this.scratchValue != null;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The context for a cell, i.e. the status of the cells around it.
|
* The context for a cell, i.e. the status of the cells around it.
|
||||||
*
|
*
|
||||||
|
|
|
@ -174,10 +174,10 @@ ascii.Controller.prototype.updateButtons = function(id) {
|
||||||
this.drawFunction = new ascii.DrawLine(this.state);
|
this.drawFunction = new ascii.DrawLine(this.state);
|
||||||
}
|
}
|
||||||
if (id == 'freeform-button') {
|
if (id == 'freeform-button') {
|
||||||
this.drawFunction = new ascii.DrawFreeform(this.state, '+');
|
this.drawFunction = new ascii.DrawFreeform(this.state, SPECIAL_VALUE);
|
||||||
}
|
}
|
||||||
if (id == 'erase-button') {
|
if (id == 'erase-button') {
|
||||||
this.drawFunction = new ascii.DrawFreeform(this.state, null);
|
this.drawFunction = new ascii.DrawErase(this.state);
|
||||||
}
|
}
|
||||||
if (id == 'move-button') {
|
if (id == 'move-button') {
|
||||||
this.drawFunction = new ascii.DrawMove(this.state);
|
this.drawFunction = new ascii.DrawMove(this.state);
|
||||||
|
|
|
@ -14,23 +14,23 @@
|
||||||
function drawLine(state, startPosition, endPosition, clockwise, opt_value) {
|
function drawLine(state, startPosition, endPosition, clockwise, opt_value) {
|
||||||
var value = opt_value || SPECIAL_VALUE;
|
var value = opt_value || SPECIAL_VALUE;
|
||||||
|
|
||||||
var hX1 = Math.min(startPosition.x, endPosition.x);
|
var startX = Math.min(startPosition.x, endPosition.x);
|
||||||
var vY1 = Math.min(startPosition.y, endPosition.y);
|
var startY = Math.min(startPosition.y, endPosition.y);
|
||||||
var hX2 = Math.max(startPosition.x, endPosition.x);
|
var endX = Math.max(startPosition.x, endPosition.x);
|
||||||
var vY2 = Math.max(startPosition.y, endPosition.y);
|
var endY = Math.max(startPosition.y, endPosition.y);
|
||||||
|
|
||||||
var hY = clockwise ? startPosition.y : endPosition.y;
|
var midX = clockwise ? endPosition.x : startPosition.x;
|
||||||
var vX = clockwise ? endPosition.x : startPosition.x;
|
var midY = clockwise ? startPosition.y : endPosition.y;
|
||||||
|
|
||||||
while (hX1++ < hX2) {
|
while (startX++ < endX) {
|
||||||
state.drawValue(new ascii.Vector(hX1, hY), value);
|
state.drawValue(new ascii.Vector(startX, midY), value);
|
||||||
}
|
}
|
||||||
while (vY1++ < vY2) {
|
while (startY++ < endY) {
|
||||||
state.drawValue(new ascii.Vector(vX, vY1), value);
|
state.drawValue(new ascii.Vector(midX, startY), value);
|
||||||
}
|
}
|
||||||
state.drawValue(startPosition, value);
|
state.drawValue(startPosition, value);
|
||||||
state.drawValue(endPosition, value);
|
state.drawValue(endPosition, value);
|
||||||
state.drawValue(new ascii.Vector(vX, hY), value);
|
state.drawValue(new ascii.Vector(midX, midY), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -120,17 +120,55 @@ ascii.DrawFreeform = function(state, value) {
|
||||||
};
|
};
|
||||||
|
|
||||||
ascii.DrawFreeform.prototype.start = function(position) {
|
ascii.DrawFreeform.prototype.start = function(position) {
|
||||||
this.state.setValue(position, this.value);
|
this.state.drawValue(position, this.value);
|
||||||
};
|
};
|
||||||
ascii.DrawFreeform.prototype.move = function(position) {
|
ascii.DrawFreeform.prototype.move = function(position) {
|
||||||
this.state.setValue(position, this.value);
|
this.state.drawValue(position, this.value);
|
||||||
};
|
};
|
||||||
ascii.DrawFreeform.prototype.end = function(position) {
|
ascii.DrawFreeform.prototype.end = function(position) {
|
||||||
|
this.state.commitDraw();
|
||||||
};
|
};
|
||||||
ascii.DrawFreeform.prototype.getCursor = function(position) {
|
ascii.DrawFreeform.prototype.getCursor = function(position) {
|
||||||
return 'crosshair';
|
return 'crosshair';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @implements {ascii.DrawFunction}
|
||||||
|
* @param {ascii.State} state
|
||||||
|
*/
|
||||||
|
ascii.DrawErase = function(state) {
|
||||||
|
this.state = state;
|
||||||
|
this.startPosition = null;
|
||||||
|
this.endPosition = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ascii.DrawErase.prototype.start = function(position) {
|
||||||
|
this.startPosition = position;
|
||||||
|
this.move(position);
|
||||||
|
};
|
||||||
|
ascii.DrawErase.prototype.move = function(position) {
|
||||||
|
this.state.clearDraw();
|
||||||
|
this.endPosition = position;
|
||||||
|
|
||||||
|
var startX = Math.min(this.startPosition.x, this.endPosition.x);
|
||||||
|
var startY = Math.min(this.startPosition.y, this.endPosition.y);
|
||||||
|
var endX = Math.max(this.startPosition.x, this.endPosition.x);
|
||||||
|
var endY = Math.max(this.startPosition.y, this.endPosition.y);
|
||||||
|
|
||||||
|
for (var i = startX; i < endX; i++) {
|
||||||
|
for (var j = startY; j < endY; j++) {
|
||||||
|
this.state.drawValue(new ascii.Vector(i, j), ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ascii.DrawErase.prototype.end = function(position) {
|
||||||
|
this.state.commitDraw();
|
||||||
|
};
|
||||||
|
ascii.DrawErase.prototype.getCursor = function(position) {
|
||||||
|
return 'crosshair';
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
* @implements {ascii.DrawFunction}
|
* @implements {ascii.DrawFunction}
|
||||||
|
|
|
@ -106,8 +106,13 @@ ascii.State.prototype.getContext = function(position) {
|
||||||
*/
|
*/
|
||||||
ascii.State.prototype.commitDraw = function() {
|
ascii.State.prototype.commitDraw = function() {
|
||||||
for (var i in this.scratchCells) {
|
for (var i in this.scratchCells) {
|
||||||
this.scratchCells[i].value = this.scratchCells[i].getRawValue();
|
var newValue = this.scratchCells[i].getRawValue();
|
||||||
|
// Cheeky little hack for making erase play nicely.
|
||||||
|
if (newValue == ' ') {
|
||||||
|
newValue = null;
|
||||||
|
}
|
||||||
this.scratchCells[i].scratchValue = null;
|
this.scratchCells[i].scratchValue = null;
|
||||||
|
this.scratchCells[i].value = newValue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -89,8 +89,9 @@ ascii.View.prototype.render = function() {
|
||||||
this.context.font = '15px Courier New';
|
this.context.font = '15px Courier New';
|
||||||
for (var i = startOffset.x; i < endOffset.x; i++) {
|
for (var i = startOffset.x; i < endOffset.x; i++) {
|
||||||
for (var j = startOffset.y; j < endOffset.y; j++) {
|
for (var j = startOffset.y; j < endOffset.y; j++) {
|
||||||
if (this.state.getCell(new ascii.Vector(i, j)).isSpecial()) {
|
var cell = this.state.getCell(new ascii.Vector(i, j));
|
||||||
this.context.fillStyle = '#F5F5F5';
|
if (cell.hasScratch() || cell.isSpecial()) {
|
||||||
|
this.context.fillStyle = cell.hasScratch() ? '#DEF' : '#F5F5F5';
|
||||||
context.fillRect(
|
context.fillRect(
|
||||||
i * CHARACTER_PIXELS - this.offset.x,
|
i * CHARACTER_PIXELS - this.offset.x,
|
||||||
(j - 1) * CHARACTER_PIXELS - this.offset.y,
|
(j - 1) * CHARACTER_PIXELS - this.offset.y,
|
||||||
|
|
Loading…
Reference in New Issue