我们用做游戏的时候,舞台的宽高是固定的,这样我们才能专心来实现游戏的逻辑,游戏做好了之后,要放到不同的设备上运行,要面对各种分辨率,还要面对手机的屏幕旋转。游戏主舞台宽高是固定的,适应屏幕无非就是控制舞台的缩放和位移。
缩放以适应屏幕大小效果不好,做游戏很少会用;按宽或者按高等比缩放也不太实用;常用的就是等比缩放并居中。其实无论哪种方式,原理都是一样的。
好多引擎都提供了相应的方法来实现屏幕适配,使得我们可以专注做游戏。createjs没有深入研究,不知道有没有。
其实自己实现一下也很简单,而且自己写得还好把握,引擎提供的方法一旦出问题,会很麻烦。
屏幕适配应该属于传统html的范畴,canvas只是html5新增的众多标签中的一个,既然是html标签,和div等标签一样,也有style属性,也可以用css或js设置其样式。
不说废话了,直接上代码:
window.onload=function(){
/*省略,具体实现可点击最后的实例*/
//=====================================
//上面创建了一个动画,为了观看匹配后的效果
window.onresize=function(){
//console.log("resize");
var canvas=stage.canvas;//获取到canvas,也可以用document.getElementById("gameMain");
//获取浏览器可是区域宽高;需要考虑不同浏览器的兼容问题,或者直接用jquary,这里只是给出个思路,没有考虑浏览器的兼容问题。
//获取宽高对于不熟悉前端的人比较麻烦,各种兼容性问题,一定要多用百度
//document.body.clientHeight可能会一直是0,自己百度解决
canvas.style.position="absolute";//canvas用绝对定位
var w=document.body.clientWidth;//获取浏览器可视区域的宽
var h=document.body.clientHeight;//获取浏览器可视区域的高
//console.log(w,h);
//等比缩放并居中显示
var scale=Math.min(w/canvas.width,h/canvas.height);
canvas.style.width=canvas.width*scale+"px";
canvas.style.height=canvas.height*scale+"px";
canvas.style.left=(w-parseInt(canvas.style.width))*0.5+"px";
canvas.style.top=(h-parseInt(canvas.style.height))*0.5+"px";
}
window.onresize();//手动resize一次
}
自己写可以熟悉熟悉原生的html,如果打算做html5游戏,很有好处。
作者很讨厌html的各种兼容性问题,如果哪位有兴趣,可以封装一个方法,和大家一起分享。
================================================
<canvas height="300" width="300" style="width:300px;height:300px;">浏览器暂不支持canvas</canvas>
canvas的width、height属性,以及style里边的width、height属性,有兴趣可以研究一下。
本页下面的实例,在谷歌浏览器下测试通过,不保证适应所有设备,所有浏览器。
现在一直用的方式。如果不是等比缩放,居中,改onCustomResize中代码即可。
//侦听加载完成事件,以及resize事件。
if (window.addEventListener) {
window.addEventListener('DOMContentLoaded', onCustomLoaded, false); //firefox
window.addEventListener('load', onCustomLoaded, false);
window.addEventListener('resize', onCustomResize, false);
} else if (window.attachEvent) {
window.attachEvent('onload', onCustomLoaded); //IE
window.attachEvent('resize', onCustomResize); //IE
}
var c_canvas=document.getElementById("canvas");//canvas对象
if(c_canvas)onCustomResize(null);
/**
* 加载完成
* @param {[type]} e [description]
* @return {[type]} [description]
*/
function onCustomLoaded(e){
console.log("loaded");
c_canvas=document.getElementById("canvas");
onCustomResize(null);
}
/**
* 窗口尺寸变化时,等比缩放,居中canvas
* @param {[type]} e [description]
* @return {[type]} [description]
*/
function onCustomResize(e){
//console.log("resize");
if(!c_canvas)return;
var w=parseInt(c_canvas.width);
var h=parseInt(c_canvas.height);
var size=getViewPortSize();
var scale=Math.min(size.w/w,size.h/h);
c_canvas.style.width=w*scale+"px";
c_canvas.style.height=h*scale+"px";
c_canvas.style.position ="absolute";
c_canvas.style.left=(size.w-w*scale)/2+"px";
c_canvas.style.top=(size.h-h*scale)/2+"px";
}
/**
* 获取浏览器窗口的可视区域的宽度
* @return {[type]} [description]
*/
function getViewPortSize() {
var o={"w":NaN,"h":NaN};
o.w=document.documentElement.clientWidth || document.body.clientWidth;
o.h=document.documentElement.clientHeight || document.body.clientHeight;
return o;
}
评论列表:
这是移动端的问题,百度了一下解决方案,比如http://www.cnblogs.com/banmengbanxing/p/4930711.html,可以试试。
一般移动端还会<meta name="viewport" content="width=device-width,user-scalable=no" />禁用缩放,因为移动端默认双击是缩放。
欢迎一起交流。
//选中关键帧,按f9,在动作面板里添加代码:
this.yuan.name="yuan";//给圆起个名字,实例名和实例的name属性要区分开。
this.yuan.addEventListener("click",clickHandler);//圆添加点击侦听
function clickHandler(e){
//处理点击事件
var yuan=e.currentTarget;//获取到点击的圆
yuan.removeEventListener("click",clickHandler);//移除点击事件的侦听
var theName=yuan.name;//获取点击的圆的name属性
console.log("点击了圆:"+theName);
//移动圆,这里根据需求来
yuan.x+=50;
yuan.y+=50;
//两秒钟之后删除圆
setTimeout(function(){
if(yuan.parent)yuan.parent.removeChild(yuan);
},2000);
}