128 lines
5.3 KiB
HTML
128 lines
5.3 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<title>PIXI Coordinates Doctest</title>
|
|
<link rel="stylesheet" href=".././3rdparty/highlight/styles/default.css">
|
|
<link rel="stylesheet" href="../../css/doctest.css">
|
|
<script src=".././3rdparty/highlight/highlight.pack.js"></script>
|
|
<script src="../../dist/iwmlib.3rdparty.js"></script>
|
|
|
|
<script src="../../dist/iwmlib.js"></script>
|
|
<script src="../../dist/iwmlib.pixi.js"></script>
|
|
</head>
|
|
|
|
<body onload="Doctest.run()">
|
|
<h1>
|
|
Coordinates
|
|
</h1>
|
|
<p>
|
|
To position objects in defined spatial relationships presupposes a clear understanding of the involved coordinate systems.
|
|
For DOM related coordinate systems see the
|
|
<a href="../lib/coordinates.html">Doctest in lib/coordinates.html</a>.
|
|
</p>
|
|
<p>
|
|
Here we adress the relationship between the PIXI view hierarchy and the DOM hierarchy. As noted in the above mentioned Doctest
|
|
we choose the page, i.e. the uttermost context, as the common global reference system. To support this we use two
|
|
PIXIApp methods, since the PIXIApp connects the DOM canvas and the PIXI stage. The methods follow the same signature
|
|
as the corresponding window methods but use PIXI DisplayObjects as nodes instead of DOM elements:
|
|
<ul>
|
|
<li>
|
|
<pre>app.convertPointFromPageToNode(displayObject, x, y)</pre>
|
|
</li>
|
|
<li>
|
|
<pre>app.convertPointFromNodeToPage(displayObject, x, y)</pre>
|
|
</li>
|
|
</ul>
|
|
</p>
|
|
<p>The following example shows the relationship between a PIXI object in a scatter application and two DOM elements, a DIV
|
|
and a CANVAS on top of the PIXI canvas.
|
|
</p>
|
|
<p>
|
|
Note that the red square is a PIXI graphics object that follows the local point in the women's image in the app.stage. The
|
|
blue square is a DOM div positioned by CSS top, left whereas the red circle follows the point in a second DOM canvas
|
|
on top of the PIXI canvas. Since the PIXI App has it's own resolution dependent coordinates app.convertPointFromPageToNode and app.convertPointFromNodeToPage
|
|
must obey the render resolution. Feel free to test this example with different screen resolutions.
|
|
</p>
|
|
<div style="position: relative; height: 500px;">
|
|
<canvas id="pixiCanvas" class="grayBorder interactive" style="position: absolute;">Canvas not supported</canvas>
|
|
<canvas id="domCanvas" width="640" height="480" style="z-index: 100000; pointer-events: none; position: absolute; border: 1px solid red;">
|
|
Canvas not supported.
|
|
</canvas>
|
|
<div id="domMarker" style="position: absolute; background-color: blue; width: 12px; height: 12px;"></div>
|
|
</div>
|
|
<script class="doctest">
|
|
|
|
class ScatterApp extends PIXIApp {
|
|
|
|
sceneFactory() {
|
|
return new ScatterContainer(this.renderer, { showBounds: true, showPolygon: true, app: this })
|
|
}
|
|
|
|
setup() {
|
|
super.setup()
|
|
let x = 30
|
|
let y = 30
|
|
let sprite = PIXI.Sprite.fromImage('../examples/women.jpeg')
|
|
sprite.interactive = true
|
|
let scatter = new DisplayObjectScatter(sprite, this.renderer,
|
|
{
|
|
x: x, y: y,
|
|
startScale: 0.25,
|
|
minScale: 0.2,
|
|
maxScale: 1
|
|
})
|
|
this.scene.addChild(sprite)
|
|
scatter.zoom(0.5, { animate: 1.0 })
|
|
this.women = sprite
|
|
|
|
let graphics = this.marker = new PIXI.Graphics()
|
|
graphics.beginFill(0xFF0000)
|
|
graphics.drawRect(-3, -3, 6, 6)
|
|
graphics.endFill()
|
|
this.stage.addChild(graphics)
|
|
return this
|
|
}
|
|
|
|
followPoint() {
|
|
let context = domCanvas.getContext('2d')
|
|
let localPoint = { x: 100, y: 100 }
|
|
let globalPoint = this.convertPointFromNodeToPage(this.women, localPoint.x, localPoint.y)
|
|
let canvasPoint = convertPointFromPageToNode(domCanvas, globalPoint.x, globalPoint.y)
|
|
let pixiPoint = this.convertPointFromPageToNode(this.stage, globalPoint.x, globalPoint.y)
|
|
|
|
domMarker.style.left = canvasPoint.x + 'px'
|
|
domMarker.style.top = canvasPoint.y + 'px'
|
|
this.marker.position = pixiPoint
|
|
|
|
context.clearRect(0, 0, 640, 480)
|
|
context.strokeStyle = 'red'
|
|
context.beginPath()
|
|
context.arc(canvasPoint.x, canvasPoint.y, 12, 0, Math.PI * 2)
|
|
context.stroke()
|
|
|
|
requestAnimationFrame((dt) => {
|
|
this.followPoint()
|
|
})
|
|
}
|
|
|
|
run() {
|
|
this.followPoint()
|
|
return this
|
|
}
|
|
}
|
|
|
|
const app = new ScatterApp({
|
|
view: pixiCanvas,
|
|
autoResize: false,
|
|
width: 640 / window.devicePixelRatio,
|
|
height: 480 / window.devicePixelRatio
|
|
})
|
|
app.setup()
|
|
app.run()
|
|
|
|
</script>
|
|
|
|
|
|
</body> |