hanyeah 专注于AS

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;
}

点击查看实例

2015年2月6日 | 发布:hanyeah | 分类:createjs | 评论:2

留言列表:

  • 请教一个问题 发布于 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" />禁用缩放,因为移动端默认双击是缩放。

      欢迎一起交流。
  • 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);
      }

发表留言: