06
2015
02

createjs屏幕适配问题

我们用做游戏的时候,舞台的宽高是固定的,这样我们才能专心来实现游戏的逻辑,游戏做好了之后,要放到不同的设备上运行,要面对各种分辨率,还要面对手机的屏幕旋转。游戏主舞台宽高是固定的,适应屏幕无非就是控制舞台的缩放和位移。

缩放以适应屏幕大小效果不好,做游戏很少会用;按宽或者按高等比缩放也不太实用;常用的就是等比缩放并居中。其实无论哪种方式,原理都是一样的。

好多引擎都提供了相应的方法来实现屏幕适配,使得我们可以专注做游戏。createjs没有深入研究,不知道有没有。

其实自己实现一下也很简单,而且自己写得还好把握,引擎提供的方法一旦出问题,会很麻烦。

屏幕适配应该属于传统html的范畴,canvas只是html5新增的众多标签中的一个,既然是html标签,和div等标签一样,也有style属性,也可以用css或js设置其样式。

不说废话了,直接上代码:

  1.     window.onload=function(){

  2.             /*省略,具体实现可点击最后的实例*/

  3.             //=====================================

  4.             //上面创建了一个动画,为了观看匹配后的效果

  5.             window.onresize=function(){ 

  6.             //console.log("resize");

  7.             var canvas=stage.canvas;//获取到canvas,也可以用document.getElementById("gameMain");

  8.             //获取浏览器可是区域宽高;需要考虑不同浏览器的兼容问题,或者直接用jquary,这里只是给出个思路,没有考虑浏览器的兼容问题。

  9.             //获取宽高对于不熟悉前端的人比较麻烦,各种兼容性问题,一定要多用百度

  10.             //document.body.clientHeight可能会一直是0,自己百度解决

  11.             canvas.style.position="absolute";//canvas用绝对定位

  12.             var w=document.body.clientWidth;//获取浏览器可视区域的宽

  13.             var h=document.body.clientHeight;//获取浏览器可视区域的高

  14.             //console.log(w,h);

  15.             //等比缩放并居中显示

  16.             var scale=Math.min(w/canvas.width,h/canvas.height);

  17.             canvas.style.width=canvas.width*scale+"px";

  18.             canvas.style.height=canvas.height*scale+"px";

  19.             canvas.style.left=(w-parseInt(canvas.style.width))*0.5+"px";

  20.             canvas.style.top=(h-parseInt(canvas.style.height))*0.5+"px";

  21.             }

  22.             window.onresize();//手动resize一次

  23.     }



自己写可以熟悉熟悉原生的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;
}

点击查看实例

« 上一篇下一篇 »

相关文章:

使用Typescript开发基于createjs的项目  (2016-8-25 9:54:40)

createjs中文API  (2016-8-18 8:45:24)

pixi和createjs效率对比  (2016-8-2 9:45:21)

createjs中stage.mouseX的bug  (2016-7-12 9:14:44)

createjs启用touch事件  (2016-7-12 9:7:5)

createjs指定文本最大高度  (2016-6-14 10:0:38)

如何使用Createjs来编写HTML5游戏(转)  (2016-2-3 13:57:38)

createjs中Text中文不换行的问题(2)  (2015-11-25 10:58:11)

(十二)createjs游戏-围住神经猫  (2015-11-18 14:7:20)

(十一)createjs游戏-游戏框架  (2015-11-18 11:16:31)

评论列表:

1.请教一个问题  2016/8/17 16:08:05 回复该留言
我用了createjs,在 Safari浏览器下,游戏过程中只要触碰屏幕背景图就闪动一次 ,请问这个是啥子原因啊?
.hanyeah  2016/8/18 8:31:27 回复该留言
你应该是在移动端测试的。
这是移动端的问题,百度了一下解决方案,比如http://www.cnblogs.com/banmengbanxing/p/4930711.html,可以试试。
一般移动端还会<meta name="viewport" content="width=device-width,user-scalable=no" />禁用缩放,因为移动端默认双击是缩放。

欢迎一起交流。
2.tym  2016/10/7 21:44:42 回复该留言
animate cc 中我用shape在canvas中画了一个圆,想在上面加一个事件,按上它,就得到它的名称,然后移动它,删节除它.
.hanyeah  2016/10/9 13:22:07 回复该留言
//animate cc中的话,将圆转成影片剪辑,然后选中舞台上圆的实例,在属性面板里边给实例取个名字,比如就叫"yuan";
//选中关键帧,按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);
}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。