surfaceView开发游戏初涉一-创新互联

在使用surfaceView开发一个小游戏的过程中,遇到的一些问题记录:

发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及成都小搅拌车等,在重庆网站建设成都营销网站建设、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。

一、使用

    类A继承自surfaceView,在构造函数中使用getHolder()得到SurfaceHolder对象,SurfaceHolder可以得到Canvas对象,有了Canvas对象就可以做画图相关的操作了。

SurfaceHolder holder = getHolder();
Canvas canvas = holder.lock();
if(canvas == null){
    return;
}
canvas.save();
    //画图相关操作
canvas.restore();
holder.unlockCanvasAndPost(canvas);

    以上就是surfaceView的通用使用方式了,可以在线程中使用(这是与View的大区别)。

    以上代码有几个注意点

        1、必须判断canvas为空,如果使用线程循环操作时,在应用切换到后台,或退出应用时,canvas得到的对象是为空的。

        2、必须为canvas绘制背景图,如果没有背景图,绘制的图像在执行几次循环后,就会出现重影(在这个地方被坑了半天surfaceView开发游戏初涉一)。

二、开发游戏的时候参考了http://tanqisen.github.io/blog/2013/09/13/develop-android-wechat-flight-game-step-by-step-1/  这篇文章,博主写的游戏是一个小的框架,很到的体现了面向对象的思想。在这篇文章中博主的资源文件(.plist)是从微信上扣出来的。也没有对旋转的图片进行处理。这里补上我的一些处理经验。

        1、plist图像文件的生成和json字符串的生成。

                生成以上文件使用了一个破解版的工具TexturePacker。在处理这个问题时一个有游戏开发经验的同事给了我很大的帮助。非常感谢他。

        2、对于在plist中被旋转图片的处理。

                前提是使用TexturePacker生成的json格式的文件。将http://tanqisen.github.io/blog/2013/09/13/develop-android-wechat-flight-game-step-by-step-1/的代码下载下来后,找到GameContext中的displayArt()方法。

canvas.save();
		Sprite s = spriteManager.getSprite(a.sprite);
		Rect spriteFrame = a.spriteFrame();
		Rect colorRect = s.spriteColorRect;
		int left = 0,top = 0,right = 0,bottom = 0;
		if(s.isRotated()){
			int height = bmp.getWidth();
			Frame frame = s.getFrame();
			left = frame.getY()+spriteFrame.left;
			top = height-(frame.getX()+frame.getH())+spriteFrame.top;
			right = left + frame.getW();
			bottom = top + frame.getH();
			
			Matrix matrix = new Matrix();
			int px = 0,py = 0;
			px = spriteFrame.left;
			py = spriteFrame.top+height;
			matrix.setTranslate(px, py);
			matrix.postRotate(-90,px, py);
			canvas.clipRect(left, top, right, bottom);
			canvas.drawBitmap(bmp,matrix,paint);
		}else{
			left   = spriteFrame.left;
			top    = spriteFrame.top;
			right  = left + colorRect.width();
			bottom = top + colorRect.height();
			canvas.clipRect(leftviewRect.right?viewRect.right:right, bottom>viewRect.bottom?viewRect.bottom:bottom);
			canvas.drawBitmap(bmp, left - colorRect.left, top - colorRect.top, paint);
		}
		canvas.restore();

这是对被旋转顺时针旋转90度的处理方法。

        结语:

                感谢Cooper的文章分享,在进入陌生的开发领域时有一位有经验的朋友帮助是很重要的。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文名称:surfaceView开发游戏初涉一-创新互联
网站URL:http://csdahua.cn/article/dgiodc.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流