前回までのあらすじは、
イージングをランダムに変える
まず、
var stage;
var myBitmap;
var top = 0;
var bottom;
var left = 0;
var right;
var currentSide;
function initialize() {
canvasObject = document.getElementById("myCanvas");
var file = "images/Pen.png";
var loader = new createjs.LoadQueue(false);
right = canvasObject.width;
bottom = canvasObject.height;
stage = new createjs.Stage(canvasObject);
loader.addEventListener("fileload", draw);
loader.loadFile(file);
}
function draw(eventObject) {
var myImage = eventObject.result;
var halfWidth = myImage.width / 2;
var halfHeight = myImage.height / 2;
top += halfHeight;
bottom -= halfHeight;
left += halfWidth;
right -= halfWidth;
myBitmap = new createjs.Bitmap(myImage);
myBitmap.regX = halfWidth;
myBitmap.regY = halfHeight;
myBitmap.x = halfWidth;
myBitmap.y = (top + bottom) / 2;
stage.addChild(myBitmap);
stage.update();
setRandomTween(myBitmap, "left");
createjs.Ticker.addEventListener("tick", stage);
}
function setRandomTween(target, side) {
var nextPoint = getNextPosition(side);
var randomTime = Math.random() * 5000 + 1000;
setTween(target, nextPoint, randomTime, createjs.Ease.bounceOut);
}
function setTween(target, myPoint, time, easing) {
createjs.Tween.get(target)
.to({x:myPoint.x, y:myPoint.y}, time, easing)
.call(setRandomTween, [target, currentSide]);
}
function getNextPosition(side) {
var nextX;
var nextY = Math.random() * (bottom - top) + top;
if (side == "left") {
currentSide = "right";
nextX = right;
} else {
currentSide = "left";
nextX = left;
}
return new createjs.Point(nextX, nextY);
}
ランダムに選ぶイージングは、

イージングの種類も数も、
var easings = [createjs.Ease.circIn, createjs.Ease.bounceOut, createjs.Ease.elasticInOut];
function setRandomTween(target, side) {
var nextPoint = getNextPosition(side);
var randomTime = Math.random() * 5000 + 1000;
var easing = easings[Math.floor(Math.random() * easings.length)];
// setTween(target, nextPoint, randomTime, createjs.Ease.bounceOut);
setTween(target, nextPoint, randomTime, easing);
}
さらに、
function draw(eventObject) {
var myImage = eventObject.result;
var halfWidth = myImage.width / 2;
var halfHeight = myImage.height / 2;
/*
top += halfHeight;
bottom -= halfHeight;
left += halfWidth;
right -= halfWidth;
*/
setGeometricData(halfWidth, halfHeight);
// ...[中略]...
}
function setGeometricData(offsetX, offsetY) {
top += offsetY;
bottom -= offsetY;
left += offsetX;
right -= offsetX;
}
第2回コード2にこれらの手を加えたのが、
var stage;
var myBitmap;
var top = 0;
var bottom;
var left = 0;
var right;
var currentSide;
var easings = [createjs.Ease.circIn, createjs.Ease.bounceOut, createjs.Ease.elasticInOut];
function initialize() {
canvasObject = document.getElementById("myCanvas");
var file = "images/Pen.png";
var loader = new createjs.LoadQueue(false);
right = canvasObject.width;
bottom = canvasObject.height;
stage = new createjs.Stage(canvasObject);
loader.addEventListener("fileload", draw);
loader.loadFile(file);
}
function draw(eventObject) {
var myImage = eventObject.result;
var halfWidth = myImage.width / 2;
var halfHeight = myImage.height / 2;
setGeometricData(halfWidth, halfHeight);
myBitmap = new createjs.Bitmap(myImage);
myBitmap.regX = halfWidth;
myBitmap.regY = halfHeight;
myBitmap.x = halfWidth;
myBitmap.y = (top + bottom) / 2;
stage.addChild(myBitmap);
stage.update();
setRandomTween(myBitmap, "left");
createjs.Ticker.addEventListener("tick", stage);
}
function setGeometricData(offsetX, offsetY) {
top += offsetY;
bottom -= offsetY;
left += offsetX;
right -= offsetX;
}
function setRandomTween(target, side) {
var nextPoint = getNextPosition(side);
var randomTime = Math.random() * 5000 + 1000;
var easing = easings[Math.floor(Math.random() * easings.length)];
setTween(target, nextPoint, randomTime, easing);
}
function setTween(target, myPoint, time, easing) {
createjs.Tween.get(target)
.to({x:myPoint.x, y:myPoint.y}, time, easing)
.call(setRandomTween, [target, currentSide]);
}
function getNextPosition(side) {
var nextX;
var nextY = Math.random() * (bottom - top) + top;
if (side == "left") {
currentSide = "right";
nextX = right;
} else {
currentSide = "left";
nextX = left;
}
return new createjs.Point(nextX, nextY);
}
ランダムの偏りを考える
】つぎに、

垂直の辺は点の間が詰まっていて、
この結果が、
今回はランダムについてこだわりたいので、
- 四辺を1本の直線に伸ばす
- 直線の上の1点をランダムに選ぶ
- 直線を矩形に戻して点の座標を調べる
四辺から行き先をランダムに決める
それでは、
// ...[中略]...
function setRandomTween(target, side) {
// var nextPoint = getNextPosition(side);
var position = getNextPosition(side);
var nextPoint = getPoint(position);
// ...[中略]...
}
四辺を扱うための変数も新たに加える。まず、
var sides = ["left", "top", "right", "bottom"];
var lengths;
function setGeometricData(offsetX, offsetY) {
// ...[中略]...
var width = right - left;
var height = bottom - top;
lengths = [height, width, height, width];
lengthsTotal = height + width + height + width;
}
では、
ひとつは、
関数
辺を調べる順は配列
ランダムな数値
function getNextPosition(mySide) {
var index = sides.indexOf(mySide);
var range = lengthsTotal - lengths[index];
var position = range * Math.random();
var returnObject;
var count = lengths.length;
for (var i = 1; i < count; i++) {
var indexNext = (index + i) % count;
var length = lengths[indexNext];
if (position <= length) {
var side = sides[indexNext];
returnObject = {side:side, position:position};
currentSide = side;
break;
} else {
position -= length;
}
}
return returnObject;
}
行き先の辺とピクセル位置が定められた引数
function getPoint(position) {
var myPoint = new createjs.Point();
var side = position.side;
var value = position.position;
switch (side) {
case "top":
myPoint.x = value + left;
myPoint.y = top;
break;
case "bottom":
myPoint.x = value + left;
myPoint.y = bottom;
break;
case "left":
myPoint.x = left;
myPoint.y = value + top;
break;
case "right":
myPoint.x = right;
myPoint.y = value + top;
break;
}
return myPoint;
}
これで、

var stage;
var myBitmap;
var top = 0;
var bottom;
var left = 0;
var right;
var currentSide;
var easings = [createjs.Ease.circIn, createjs.Ease.bounceOut, createjs.Ease.elasticInOut];
var sides = ["left", "top", "right", "bottom"];
var lengths;
function initialize() {
canvasObject = document.getElementById("myCanvas");
var file = "images/Pen.png";
var loader = new createjs.LoadQueue(false);
right = canvasObject.width;
bottom = canvasObject.height;
stage = new createjs.Stage(canvasObject);
loader.addEventListener("fileload", draw);
loader.loadFile(file);
}
function draw(eventObject) {
var myImage = eventObject.result;
var halfWidth = myImage.width / 2;
var halfHeight = myImage.height / 2;
setGeometricData(halfWidth, halfHeight);
myBitmap = new createjs.Bitmap(myImage);
myBitmap.regX = halfWidth;
myBitmap.regY = halfHeight;
myBitmap.x = halfWidth;
myBitmap.y = (top + bottom) / 2;
stage.addChild(myBitmap);
stage.update();
setRandomTween(myBitmap, "left");
createjs.Ticker.addEventListener("tick", stage);
}
function setGeometricData(offsetX, offsetY) {
top += offsetY;
bottom -= offsetY;
left += offsetX;
right -= offsetX;
var width = right - left;
var height = bottom - top;
lengths = [height, width, height, width];
lengthsTotal = height + width + height + width;
}
function setRandomTween(target, side) {
var position = getNextPosition(side);
var nextPoint = getPoint(position);
var randomTime = Math.random() * 5000 + 1000;
var easing = easings[Math.floor(Math.random() * easings.length)];
setTween(target, nextPoint, randomTime, easing);
}
function setTween(target, myPoint, time, easing) {
createjs.Tween.get(target)
.to({x:myPoint.x, y:myPoint.y}, time, easing)
.call(setRandomTween, [target, currentSide]);
}
function getNextPosition(mySide) {
var index = sides.indexOf(mySide);
var range = lengthsTotal - lengths[index];
var position = range * Math.random();
var returnObject;
var count = lengths.length;
for (var i = 1; i < count; i++) {
var indexNext = (index + i) % count;
var length = lengths[indexNext];
if (position <= length) {
var side = sides[indexNext];
returnObject = {side:side, position:position};
currentSide = side;
break;
} else {
position -= length;
}
}
return returnObject;
}
function getPoint(position) {
var myPoint = new createjs.Point();
var side = position.side;
var value = position.position;
switch (side) {
case "top":
myPoint.x = value + left;
myPoint.y = top;
break;
case "bottom":
myPoint.x = value + left;
myPoint.y = bottom;
break;
case "left":
myPoint.x = left;
myPoint.y = value + top;
break;
case "right":
myPoint.x = right;
myPoint.y = value + top;
break;
}
return myPoint;
}
これで予定したお題は仕上がった。CreateJSのバージョンが古い第1回とはもちろん、