87 lines
1.8 KiB
JavaScript
87 lines
1.8 KiB
JavaScript
"use strict";
|
|
|
|
import Vector from './Vector';
|
|
|
|
class Star
|
|
{
|
|
constructor(inCanvas, inPosition, inSize)
|
|
{
|
|
this.canvas = inCanvas;
|
|
|
|
this.position = inPosition;
|
|
this.rotation = 0;
|
|
this.rotationStep = 0;
|
|
this.alpha = 1;
|
|
|
|
this.pointCount = 5;
|
|
|
|
this.size = inSize;
|
|
this.innerRingRatio = 0.5;
|
|
|
|
this.colour = "white";
|
|
}
|
|
|
|
/**
|
|
* The step around a circle (in radians) between each point (both inner and
|
|
* outer) on the star.
|
|
* Used by recalculatePoints().
|
|
* @return {number} The step around a circle between each point on the star.
|
|
*/
|
|
get pointStep()
|
|
{
|
|
return (Math.PI * 2) / (this.pointCount * 2);
|
|
}
|
|
|
|
get innerRingSize()
|
|
{
|
|
return this.innerRingRatio * this.size;
|
|
}
|
|
|
|
recalculatePoints()
|
|
{
|
|
this.points = [];
|
|
for (let n = 0, i = 0; n < Math.PI * 2; n += this.pointStep, i++)
|
|
{
|
|
let currentSize = i % 2 == 0 ? this.size : this.innerRingSize;
|
|
this.points.push(new Vector(
|
|
currentSize * Math.cos(Math.PI * 2 * (n / (Math.PI * 2)) - Math.PI / 2),
|
|
currentSize * Math.sin(Math.PI * 2 * (n / (Math.PI * 2)) - Math.PI / 2)
|
|
));
|
|
}
|
|
}
|
|
|
|
update(dt)
|
|
{
|
|
this.rotation += this.rotationStep * dt;
|
|
// if(this.rotation > Math.PI * 2)
|
|
// this.rotation -= Math.PI * 2;
|
|
// if(this.rotation < 0)
|
|
// this.rotation += Math.PI * 2;
|
|
}
|
|
|
|
render(context)
|
|
{
|
|
if(!(this.points instanceof Array))
|
|
this.recalculatePoints();
|
|
|
|
context.save();
|
|
context.translate(this.position.x, this.position.y);
|
|
context.rotate(this.rotation);
|
|
|
|
context.beginPath();
|
|
context.moveTo(this.points[0].x, this.points[0].y);
|
|
for (let point of this.points) {
|
|
context.lineTo(point.x, point.y);
|
|
}
|
|
context.closePath();
|
|
|
|
context.globalAlpha = this.alpha;
|
|
context.fillStyle = this.colour;
|
|
context.fill();
|
|
|
|
context.restore();
|
|
}
|
|
}
|
|
|
|
export default Star;
|