使用createjs制作小游戏
简介
createjs包含四个独立的模块:easeljs是最主要的部分,大部分都使用这个库来实现,其他三个是辅助的。Tweenjs是实现动画效果的库,preloadjs是做预加载的,soundjs是处理音频的,我这次做的游戏只有一个背景音乐,所以没有用上。下次可以试试。
模块分解
这次的小游戏有三页,根据其他教程,我用了三个js分别实现,然后在index页面实现三个页面的跳转,由于createjs没有专门场景切换的功能,我只能使用remove的方式来移除上一个页面,不知道是我没发现还是真没有。下面分别介绍三个页面
场景一
场景一比较简单是一个引导页,我做了一些简单的动画,然后就是一个按钮进入第二页,即正式页面,下面主要介绍一下封装,代码如下:
(function(){
function screen1(){
this.Container_constructor();
this.timer = null;
this.flag = 0;
this.setup();
}
var p = createjs.extend(screen1, createjs.Container);
p.setup = function(){
var bg = new createjs.Bitmap(queue.getResult('bg1'));
this.addChild(bg);
createjs.Tween.get(light1, {loop: -1}).to({alpha: 0}, 200);
};
window.screen1 = createjs.promote(screen1, "Container");
}());
这里最createjs的一种封装方法,可以直接使用new screen1来调用了,里面涉及三个方面
var bg = new createjs.Bitmap(queue.getResult('bg1'));
这句是创建一个图片,其中queue.getResult(‘bg1’)是来自preloadjs的,可以用图片的具体地址代替
this.addChild(bg);
是将刚才的图片添加到舞台
createjs.Tween.get(light1, {loop: -1}).to({alpha: 0}, 200);
是使用Tweenjs来实现动画,这里的light1是自行创建的对象,loop属性是循环,to里面的alpha是将对象的alpha属性设为0,200是持续时间。
可以使用Tweenjs实现复杂的动画效果
场景二
场景二是主要页面,包含一个左右移动的爪子,点击按钮,爪子会下探,之后变成抓去一个礼盒,最后页面切换到第三页,主要代码如下
(function(window){
function screen2(index){
this.Container_constructor();
this.ct;
this.box = queue.getResult('box');
this.stick = new createjs.Bitmap(queue.getResult('img01'));
this.claw = new createjs.Bitmap(queue.getResult('img02'));
this.setup();
}
var p = createjs.extend(screen2, createjs.Container);
p.setup = function(){
var bgLeft = new createjs.Bitmap(queue.getResult('bg2'));
bgLeft.sourceRect = new createjs.Rectangle(0, 0, 375, 1206);
var bgRight = new createjs.Bitmap(queue.getResult('bg2'));
bgRight.sourceRect = new createjs.Rectangle(375, 0, 375, 1206);
btn.on("click", this.clawClick, this, true);
this.addChild(bg);
this.ct = createjs.Tween.get(theClaw, {loop: -1, bounce: true}).to({x:592}, 2000);
};
p.clawClick = function(){
if (!this.ct.paused) {
this.ct.paused = true;
}
createjs.Tween.get(this.claw)
.to({y: 680}, 1000)
.wait(500)
.call(function(){
this.image = box;
})
.to({y: 300}, 1000)
.wait(1000)
.call(function(){
next2();
});
}
window.screen2 = createjs.promote(screen2, "Container");
}(window));
这里使用了Bitmap的sourceRect功能用来做一个开门的动画,使用Tweenjs实现了爪子下拉然后抓取的效果
场景三
场景三只是简单的将微信图像和昵称放在图上,然后生成一张图片供用户保存
(function(window){
function screen3(nickname){
this.Container_constructor();
this.nickname = nickname;
this.setup();
}
var p = createjs.extend(screen3, createjs.Container);
p.setup = function(){
var bg = new createjs.Bitmap(queue.getResult('res'));
this.addChild(bg);
setTimeout(savePic, 1000);
};
window.screen3 = createjs.promote(screen3, "Container");
}(window));
调度
var canvas = document.getElementById("myCanvas");
canvas.style.position = "absolute";
var w = document.body.offsetWidth;
var h = document.body.offsetHeight;
var scale = w / canvas.width;
canvas.style.width = w + "px";
canvas.style.height = h + "px";
canvas.style.left = 0;
canvas.style.top = 0;
var stage, s1, s2, nickname, bgm, musicRotation;
var music = document.getElementById('bgm');
stage = new createjs.Stage(canvas);
createjs.Touch.enable(stage);
var loading = new createjs.Bitmap('./images/loading.jpg');
var text = new createjs.Text("加载中 0%", "50px Arial", "#fff");
text.x = 255;
text.y = 590;
stage.addChild(loading);
stage.addChild(text);
stage.update();
var boxIndex = Math.ceil(Math.random() * 5);
var resIndex = Math.ceil(Math.random() * 30);
var queue = new createjs.LoadQueue(true, '', true);
queue.on("complete", handleComplete, this);
queue.on("fileprogress", handleProgress, this);
queue.loadManifest([
{id: 'bg1', src: './images/bg1.jpg'},
{id: 'bg2', src: './images/bg2.jpg'},
]);
function handleComplete(){
stage.removeChild(loading);
stage.removeChild(text);
init();
}
function handleProgress(){
text.text = '加载中 ' + Math.round(queue.progress * 100) + '%';
stage.update();
}
function init(){
s1 = new screen1();
s1.on('click', next);
stage.addChild(s1);
bgm = new createjs.Bitmap(queue.getResult('music'));
bgm.x = 695;
bgm.y = 135;
bgm.regX = 30;
bgm.regY = 30;
stage.addChild(bgm);
bgm.on('click', toggleMusic);
musicRotation = createjs.Tween.get(bgm, {loop: -1}).to({rotation: 360}, 1500);
startGame();
}
function next(){
createjs.Tween.get(s1).to({alpha: 0}, 1000).call(function(){
s1.parent.removeChild(s1);
s2 = new screen2(4);
stage.addChild(s2);
stage.setChildIndex(bgm, 1);
})
}
function next2(){
s2.removeChildAt(3, 4, 5, 6, 7);
createjs.Tween.get(s2.getChildAt(1)).to({skewY: 90}, 1000);
createjs.Tween.get(s2.getChildAt(2)).to({skewY: -90}, 1000).call(function(){
s2.parent.removeChild(s2);
s3 = new screen3(nickname);
stage.addChild(s3);
});
}
function savePic(){
var image = new Image();
image.src = canvas.toDataURL("image/png");
document.body.appendChild(image);
canvas.style.display = 'none';
}
function toggleMusic(){
if (musicRotation.paused) {
music.play();
musicRotation.paused = false;
}else{
music.pause();
musicRotation.paused = true;
}
}
function startGame(){
createjs.Ticker.addEventListener('tick', function(){
stage.update();
});
}