Merge JigsawX

This commit is contained in:
2022-06-26 19:53:26 +00:00
parent d739f2a6cf
commit 41af3009bb
48 changed files with 8654 additions and 0 deletions

View File

@@ -0,0 +1,383 @@
/*
* Copyright (c) 2012, Justinfront Ltd
* author: Justin L Mills
* email: JLM at Justinfront dot net
* created: 17 June 2012
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the Justinfront Ltd nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Justinfront Ltd ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL Justinfront Ltd BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jigsawxtargets.hxjs;
import js.Browser;
import core.DisplayDiv;
import js.html.Event;
import js.html.MouseEvent;
import haxe.Timer;
import js.html.CanvasRenderingContext2D;
import jigsawx.JigsawPiece;
import jigsawx.Jigsawx;
import jigsawx.math.Vec2;
import js.html.ImageElement;
import core.ImageLoader;
import haxe.ds.StringMap;
import core.SetupCanvas;
//https://developer.mozilla.org/En/Manipulating_video_using_canvas
using core.GlobalDiv;
class JigsawDivtastic
{
var holder: DisplayDiv;
var hit: DisplayDiv;
var jigsawx: Jigsawx;
var visualSource: DisplayDiv;
var wid: Float;
var hi: Float;
var rows: Int;
var cols: Int;
var count: Int;
var atimer: Timer;
var depth: Int;
var tiles: Array<DisplayDiv>;
var surfaces: Array<CanvasRenderingContext2D>;
var loader: ImageLoader;
inline static var videoSrc: String = 'big_buck_bunny.webm';
inline static var imageSrc: String = "tablecloth.jpg";
static function main(){ new JigsawDivtastic(); }
public function new()
{
holder = new DisplayDiv() ;
holder.x = 0 ;
holder.y = 0 ;
holder.width = 520 ;
holder.height = 260 ;
count = 0;
addChild( holder ) ;
createVisuals();
createHit();
#if !noVideo
visualDisplay();
#else
loader = new ImageLoader( [ imageSrc ], onLoaded );
#end
}
public function onLoaded()
{
var count = 0;
var images: StringMap<ImageElement> = loader.images;
var tablecloth = images.get('tablecloth.jpg');
var xy = new Vec2( 20, 20 );
for( row in 0...rows )
{
for( col in 0...cols )
{
surfaces[ count ].drawImage( tablecloth, 32 - xy.x, 42 - xy.y, tablecloth.width*0.81, tablecloth.height*0.81 );
xy.x += wid;
count++;
}
xy.x = 20;
xy.y += hi;
}
}
public function createHit()
{
hit = new DisplayDiv() ;
hit.x = 0 ;
hit.y = 0 ;
hit.width = 1000 ;
hit.height = 1000 ;
hit.getStyle().cursor = 'pointer';
hit.getStyle().zIndex = Std.string( 1000000000 );
addChild( hit ) ;
hit.press.add( checkForDrag );
}
public function checkForDrag()
{
ROOT().onmousemove = null;
var pos = hit.getGlobalMouseXY();
var px = pos.first();
var py = pos.last();
var distance = 1000000000.;
// set a default value
var closest = tiles[ 0 ];
var jig = jigsawx.jigs[ 0 ];
var surface = surfaces[ 0 ];
var currI = 0;
var dx: Float;
var dy: Float;
var dr2: Float;
var vXY: DisplayDiv;
for( i in 0...tiles.length )
{
if( jigsawx.jigs[ i ].enabled )
{
dx = tiles[ i ].x - px;
dy = tiles[ i ].y - py;
dr2 = dx * dx + dy * dy;
if( dr2 < distance )
{
closest = tiles[ i ];
jig = jigsawx.jigs[ i ];
surface = surfaces[ i ];
distance = dr2;
currI = i;
}
}
}
var wid_ = wid/2;
var hi_ = hi/2;
if( distance < wid * hi )
{
closest.getStyle().zIndex = Std.string( depth++ );
ROOT().onmouseup = function( e: Event )
{
var em: MouseEvent = cast e;
if( closest.alpha != 1 )
{
closest.x = em.clientX - wid_/2;
closest.y = em.clientY - hi_/2;
closest.alpha = 0.74;
}
if( Math.abs( jig.xy.x - closest.x ) < ( wid_ + hi_ )/6 && Math.abs( jig.xy.y - closest.y ) < ( wid_ + hi_ )/6 )
{
closest.x = jig.xy.x;
closest.y = jig.xy.y;
//drawEdge( surface, jigsawx.jigs[ currI ], 'white' );
closest.alpha = 1;
jig.enabled = false;
}
ROOT().onmousemove = null;
}
ROOT().onmousemove = function( e: Event )
{
var em: MouseEvent = cast e;
if( closest.alpha != 1 )
{
closest.x = em.clientX - wid_/2;
closest.y = em.clientY - hi_/2;
closest.alpha = 0.87;
}
}
}
}
public function drawEdge( surface: CanvasRenderingContext2D
, jig: JigsawPiece
, c: String
)
{
surface.strokeStyle = c;
surface.lineWidth = 2;
surface.beginPath();
var first = jig.getFirst();
surface.moveTo( first.x + 3, first.y + 3 );
for( v in jig.getPoints() ) surface.lineTo( v.x + 3, v.y + 3 );
surface.stroke();
surface.closePath();
// make it a mask
surface.clip();
}
public function visualDisplay()
{
//371x262
visualSource = new DisplayDiv( videoSrc );
visualSource.x = 0;
visualSource.y = 0;
visualSource.width = 10;
visualSource.height = 10;
// if you want to show the source video ( or image) uncomment this line:
holder.addChild( visualSource ) ;
visualSource.play();
visualSource.getStyle().position = 'absolute';
atimer = new Timer( 40 );
atimer.run = copyAcross;
}
public function createVisuals()
{
var sp: DisplayDiv;
// holder for canvs
var canvasSp: DisplayDiv;
var surface: CanvasRenderingContext2D;
var first: Vec2;
surfaces = [];
tiles = [];
rows = 3;//6;
#if !noVideo
cols = 5;//10;
#else
cols = 4;
#end
wid = 70;//100//50;
hi = 70;//100//50;
jigsawx = new Jigsawx( wid, hi, rows, cols );
depth = 0;
for( jig in jigsawx.jigs )
{
// create sprite and surface
sp = new DisplayDiv();
holder.addChild( sp );
tiles.push( sp );
// if you want to check position
//sp.fill = '#ffffff';
sp.x = jig.xy.x;
sp.y = jig.xy.y;
sp.width = 0;
sp.height = 0;
canvasSp = new DisplayDiv( 'canvas' );
canvasSp.x = -wid/2 + -5;
canvasSp.y = -hi/2 + -5;
surface = canvasSp.twoD;
sp.getStyle().zIndex = Std.string( depth++ );
sp.addChild( canvasSp );
// select a random number to be out of place ( 2/5 th's )
if( Math.random()*5 > 2 )
{
sp.x = 215+520/2 - Math.random()*(520-350);
sp.y = 260/2 - Math.random()*255/2 + 15;
sp.alpha = 0.74;
drawEdge( surface, jig, 'white' );
}
else
{
// Disable movement of correctly placed jigsaw pieces
jig.enabled = false;
drawEdge( surface, jig, 'white' );
}
surfaces.push( surface );
}
}
private function copyAcross()
{
count++;
// if you want to stop video early
//if( count > 1000 ) atimer.stop();
var xy = new Vec2( 20, 20 );
trace( visualSource.getInstance() );
var image: ImageElement = cast visualSource.getInstance();
var count = 0;
for( row in 0...rows )
{
for( col in 0...cols )
{
surfaces[ count ].drawImage( image, -xy.x, -xy.y );
xy.x += wid;
count++;
}
xy.x = 20;
xy.y += hi;
}
}
}