Files
kiss-vscode/projects/flixel-desktop-habit-puzzle-game/JigsawX/divtastic/utils/LiteLetters.hx
2022-06-26 19:53:26 +00:00

695 lines
30 KiB
Haxe

package utils;
import Main;
import js.html.CanvasRenderingContext2D;
enum DrawingCommand
{
MOVE;
LINE;
ARC;
}
typedef DrawInstruction =
{
var instruction: DrawingCommand;
var param: Array<Dynamic>;
}
class LiteLetters
{
var surface: CanvasRenderingContext2D;
public var scale: Float;
public var dx: Int;
public var dy: Int;
var dia: Int;
var piSmall: Float;
var pi: Float;
var gap: Int;
var radius: Int;
var twoDia: Int;
var three4Dia: Int;
var oneHalfDia: Int;
var north: Float;
var south: Float;
var east: Float;
var west: Float;
var clock: Bool;
var dPix: Int;
var dPiy: Int;
public function new( surface_: CanvasRenderingContext2D )
{
surface = surface_;
dia = 8;
radius = Std.int( dia/2 );
dx = 100;
dy = 100;
twoDia = dia*2;
clock = false;
dPix = 3;
dPiy = 2;
oneHalfDia = Std.int(1.5*dia);
three4Dia = Std.int( dia*(3/4) );
gap = Std.int( dia/2.5);
piSmall = Math.PI/4;
pi = Math.PI;
north = -pi/2;
south = pi/2;
west = pi;
east = 0;
setColorStroke( '#ff0000', 1.5 );
}
public function setColorStroke( col: String, stroke: Float )
{
surface.strokeStyle = col;
surface.lineWidth = stroke;
}
public function letterChoose( letter: String ): Array<DrawInstruction>
{
return switch( letter )
{
case 'a': [ { instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north + piSmall, south - piSmall, true ]
},
{ instruction: MOVE
, param: [ dx + radius + dPix + 2, dy + dia ]
},
{ instruction: LINE
, param: [ dx + radius + dPix, dy + dia - 1 ]
},
{ instruction: LINE
, param: [ dx + radius + dPix, dy - 1 ]
}
];
case 'b': [ { instruction: MOVE
, param: [ dx + radius - dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north - piSmall, south + piSmall, false ]
},
{ instruction: MOVE
, param: [ dx + radius - dPix - 1, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx + radius - dPix - 1, dy + dia ]
}
];
case 'c': [ { instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north + piSmall, south - piSmall, true ]
}
];
case 'd': [ { instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north + piSmall, south - piSmall, true ]
},
{ instruction: MOVE
, param: [ dx + radius + dPix, dy + dia ]
},
{ instruction: LINE
, param: [ dx + radius + dPix, dy - dia + 1 ]
}
];
case 'e': [ { instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north + 1.5*piSmall, south - piSmall, true ]
},
{ instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: LINE
, param: [ dx + dia, dy + radius ]
}
];
case 'f': [ { instruction: MOVE
, param: [ dx + dia, dy - radius + 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius - dia + 1, radius - 1, east - piSmall, west , true ]
},
{ instruction: MOVE
, param: [ dx + 1, dy - radius + 1 ]
},
{ instruction: LINE
, param: [ dx + 1, dy + dia ]
},
{ instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + radius + 1, dy ]
}
];
case 'g': [ { instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north + piSmall, south - piSmall, true ]
},
{ instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: LINE
, param: [ dx + radius + dPix, dy + dia + radius - 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy + dia + radius - 1, radius - 1, east, west, false ]
}
];
case 'h': [ { instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, west, east, false ]
},
{ instruction: MOVE
, param: [ dx, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
},
{ instruction: MOVE
, param: [ dx + dia, dy + radius ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
}
];
case 'i': [ { instruction: MOVE
, param: [ dx + radius, dy ]
},
{ instruction: LINE
, param: [ dx + radius, dy + dia ]
},
{ instruction: MOVE
, param: [ dx + radius, dy - radius ]
},
{ instruction: LINE
, param: [ dx + radius, dy - radius + 2 ]
}
];
case 'j': [ { instruction: MOVE
, param: [ dx + radius, dy - radius ]
},
{ instruction: LINE
, param: [ dx + radius, dy - radius + 2 ]
},
{ instruction: MOVE
, param: [ dx + radius, dy ]
},
{ instruction: ARC
, param: [ dx + Std.int(radius/2), dy + dia + radius - 1
, Std.int(radius/2), east - Math.PI/8, west
, false ]
}
];
case 'k': [ { instruction: MOVE
, param: [ dx, dy + dia ]
},
{ instruction: LINE
, param: [ dx, dy - dia + 1 ]
},
{ instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: LINE
, param: [ dx + dia - 1, dy ]
},
{ instruction: MOVE
, param: [ dx + 2, dy + radius - 2 ]
},
{ instruction: LINE
, param: [ dx + dia - 1, dy + dia ]
},
];
case 'l': [ { instruction: MOVE
, param: [ dx + radius, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx + radius, dy + dia - 1 ]
},
{ instruction: LINE
, param: [ dx + radius + 2, dy + dia ]
}
];
//re-think this letter?
case 'm': [ { instruction: MOVE
, param: [ dx, dy + 3 ]
},
{ instruction: LINE
, param: [ dx + 2, dy ]
},
{ instruction: LINE
, param: [ dx + radius, dy + 4 ]
},
{ instruction: LINE
, param: [ dx + radius, dy + dia - 2 ]
},
{ instruction: LINE
, param: [ dx + radius, dy + 4 ]
},
{ instruction: LINE
, param: [ dx + dia - 2, dy ]
},
{ instruction: LINE
, param: [ dx + dia, dy + 3 ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
},
{ instruction: MOVE
, param: [ dx - 1, dy ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
}
];
case 'n': [ { instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, west, east, false ]
},
{ instruction: MOVE
, param: [ dx, dy - 1 ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
},
{ instruction: MOVE
, param: [ dx + dia, dy + radius ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
},
];
case 'o': [ { instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, west + pi*2, west, true ]
}
];
case 'p': [ { instruction: MOVE
, param: [ dx + radius - dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north - piSmall, south + piSmall, false ]
},
{ instruction: MOVE
, param: [ dx + radius - dPix - 1, dy ]
},
{ instruction: LINE
, param: [ dx + radius - dPix - 1, dy + 2*dia - 1 ]
},
];
case 'q': [ { instruction: MOVE
, param: [ dx + radius + dPix, dy + dPiy ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north + piSmall, south - piSmall, true ]
},
{ instruction: MOVE
, param: [ dx + radius + dPix, dy ]
},
{ instruction: LINE
, param: [ dx + radius + dPix, dy + 2*dia - 1 ]
}
];
case 'r': [ { instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, west, north + piSmall, false ]
},
{ instruction: MOVE
, param: [ dx, dy - 1 ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
}
];
case 's': [ { instruction: MOVE
, param: [ dx + dia - 1, dy + 2 ]
},
{ instruction: LINE
, param: [ dx + radius, dy ]
},
{ instruction: LINE
, param: [ dx + 2, dy + 2 ]
},
{ instruction: LINE
, param: [ dx + radius, dy + radius ]
},
{ instruction: LINE
, param: [ dx + dia - 2, dy + 6 ]
},
{ instruction: LINE
, param: [ dx + radius, dy + dia ]
},
{ instruction: LINE
, param: [ dx + 1, dy + dia -1 ]
}
];
case 't': [ { instruction: MOVE
, param: [ dx + radius - 1, dy - radius ]
},
{ instruction: LINE
, param: [ dx + radius - 1, dy + dia - 1 ]
},
{ instruction: LINE
, param: [ dx + radius + 1, dy + dia ]
},
{ instruction: LINE
, param: [ dx + radius + 3, dy + dia - 1 ]
},
{ instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + dia - dPix, dy ]
}
];
case 'u': [ { instruction: MOVE
, param: [ dx, dy - 1 ]
},
{ instruction: LINE
, param: [ dx, dy + radius - 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius - 1, radius, west, east, true ]
},
{ instruction: LINE
, param: [ dx + dia, dy - 1 ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
}
];
case 'v': [ { instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + radius, dy + dia ]
},
{ instruction: LINE
, param: [ dx + dia, dy ]
}
];
case 'w': [ { instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + 1, dy + dia ]
},
{ instruction: LINE
, param: [ dx + radius, dy + radius - 1 ]
},
{ instruction: LINE
, param: [ dx + dia - 1, dy + dia ]
},
{ instruction: LINE
, param: [ dx + dia, dy ]
}
];
case 'x': [ { instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
},
{ instruction: MOVE
, param: [ dx + dia, dy ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
}
];
case 'y': [ { instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx, dy + radius ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, west, east, true ]
},
{ instruction: LINE
, param: [ dx + dia, dy ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia + radius - 1 ]
},
{ instruction: ARC
, param: [ dx + radius + 1, dy + dia + radius, radius - 1, east, west, false ]
}
];
case 'z': [ { instruction: MOVE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + dia -1, dy ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
}
];
case '0': [ { instruction: MOVE
, param: [ dx + 1, dy - radius + 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy - radius + 1, radius-0.7, west, east, false ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, east , west, false ]
},
{ instruction: LINE
, param: [ dx + 1, dy - radius + 1 ]
},
{ instruction: MOVE
, param: [ dx + 1, dy + radius + 4 ]
},
{ instruction: LINE
, param: [ dx + dia - 1, dy - radius - 1 ]
}
];
case '1': [ { instruction: MOVE
, param: [ dx + radius - dPix, dy - dia + dPiy + 1 ]
},
{ instruction: LINE
, param: [ dx + radius, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx + radius, dy + dia ]
},
{ instruction: LINE
, param: [ dx + radius - dPix, dy + dia ]
},
{ instruction: LINE
, param: [ dx + radius + dPix, dy + dia ]
}
];
case '2': [ { instruction: MOVE
, param: [ dx, dy - radius - 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy - radius + 1, radius, west, east + piSmall, false ]
},
{ instruction: LINE
, param: [ dx + 2, dy + dia - 4 ]
},
{ instruction: LINE
, param: [ dx, dy + dia ]
},
{ instruction: LINE
, param: [ dx + dia, dy + dia ]
}
];
case '3': [ { instruction: MOVE
, param: [ dx, dy - radius - 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy - radius + 1, radius, west, east + piSmall, false ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, east - piSmall, west, false ]
},
{ instruction: MOVE
, param: [ dx + radius-1, dy ]
},
{ instruction: LINE
, param: [ dx + radius + 3, dy ]
}
];
case '4': [ { instruction: MOVE
, param: [ dx + dia + 1, dy + 1 ]
},
{ instruction: LINE
, param: [ dx, dy + 1 ]
},
{ instruction: LINE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + radius + 2, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx + radius + 2, dy + dia ]
}
];
case '5': [ { instruction: MOVE
, param: [ dx + dia, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx, dy ]
},
{ instruction: LINE
, param: [ dx + radius - 2, dy - 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius - 1, radius, north, east, false ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, east, west, false ]
}
];
case '6': [ { instruction: MOVE
, param: [ dx, dy + radius ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, west + 2*pi, west, true ]
},
{ instruction: ARC
, param: [ dx + radius, dy - radius + 1, radius, west, east - piSmall, false ]
}
];
case '7': [ { instruction: MOVE
, param: [ dx, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx + dia, dy - dia + 1 ]
},
{ instruction: LINE
, param: [ dx + dia, dy - dia + 3 ]
},
{ instruction: LINE
, param: [ dx + 2 + 1, dy + radius -1 ]
},
{ instruction: LINE
, param: [ dx + 2, dy + dia ]
}
];
case '8': [ { instruction: MOVE
, param: [ dx + radius, dy ]
},
{ instruction: ARC
, param: [ dx + radius, dy - radius, radius - 1, south, south + pi*2, false ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, north, north + pi*2, true ]
}
];
case '9': [ { instruction: MOVE
, param: [ dx + dia, dy - radius + 1 ]
},
{ instruction: ARC
, param: [ dx + radius, dy - radius + 1, radius-0.5, east, east + pi*2, true ]
},
{ instruction: ARC
, param: [ dx + radius, dy + radius, radius, east , west- 1.4*piSmall, false ]
}
];
default: null;
}
}
public function write( str: String )
{
surface.beginPath();
for( ii in 0...str.length)
{
var letter = str.charAt( ii );
if( letter == " " )
{
nextLetter();
continue;
}
letter = letter.toLowerCase();
var letterCommands = letterChoose( letter );
if( letterCommands == null )
{
nextLetter();
continue;
}
for( jj in 0...letterCommands.length )
{
var drawCommand = letterCommands[ jj ];
var instruction = switch( drawCommand.instruction )
{
case MOVE: 'moveTo';
case LINE: 'lineTo';
case ARC: 'arc' ;
};
var param = drawCommandScale( drawCommand );
Reflect.callMethod ( surface
, Reflect.field( surface, instruction )
, param
);
}
nextLetter();
}
end();
}
public function drawCommandScale( command: DrawInstruction ): Array<Dynamic>
{
var param = command.param;
var dy_ = dy;
var dx_ = dx;
return switch( command.instruction )
{
case MOVE, LINE:
[ scale*( param[ 0 ] - dx ) + dx_
, scale*( param[ 1 ] - dy ) + dy_
];
case ARC:
[ scale*( param[ 0 ] - dx ) + dx_
, scale*( param[ 1 ] - dy ) + dy_
, scale*param[ 2 ]
, param[ 3 ]
, param[ 4 ]
, param[ 5 ]
];
}
}
public function nextLetter()
{
dx += gap + Math.ceil( dia*scale );
}
public function end()
{
surface.stroke();
}
}