surfaceView开发游戏初涉一

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

一、使用

类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绘制背景图,如果没有背景图,绘制的图像在执行几次循环后,就会出现重影(在这个地方被坑了半天)。

二、开发游戏的时候参考了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(left<viewRect.left?viewRect.left:left, top<viewRect.top?viewRect.top:top, 
					right>viewRect.right?viewRect.right:right, bottom>viewRect.bottom?viewRect.bottom:bottom);
			canvas.drawBitmap(bmp, left - colorRect.left, top - colorRect.top, paint);
		}
		canvas.restore();

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

结语:

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

时间: 2024-10-14 00:53:52

surfaceView开发游戏初涉一的相关文章

独立开发游戏越来越容易:Unity 发布旗下的最新游戏引擎 Unity 5,依然有免费版(转)

独立开发者开发游戏正变得越来越容易,因为在游戏设计中很多吃力不讨好的工作可以直接采用像 Epic Games 或 Unity Technologies 这样的游戏引擎来解决.而这几天,游戏引擎商们先后宣布,旗下产品将以更廉价甚至是免费的方式提供给游戏开发者们,开发游戏的门槛又进一步降低了. 先是 Epic Games 在周一通过官方博客宣布旗下 Unreal Engine 4 (虚幻引擎 4)即日起免费提供给 所有开发者使用.只有当开发者利用 Unreal Engine 4 所制作的游戏每个季度

【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做了介绍,也带大家配置了SDL的开发环境.请大家按照上一课的步骤创建一个SDL工程,能够初步运行. 如果遇到问题,可以百度,Google相关平台SDL的配置.或者联系小编. 当然了,有些朋友可能会说开发C语言游戏还可以用GTK+这个库,但是个人认为GTK+没有SDL那么适合开发游戏,其创建图形界面的能

GameBuilder开发游戏应用系列之100行代码实现贪吃蛇

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-801422234293697 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-801422234293697 微信扫描: 运行截图: 除了重力感应游戏,GameBuilder开发传统的游戏也毫不逊色,作为一个怀旧的人,总是对这类游戏情有独钟. 贪吃蛇主要靠一个[UICanvas]来实现,前面一片博客GameB

安卓开发游戏用Cocos2d什么版本?

这两天上课,讲了两天半的游戏开发,做一个植物大战僵尸的小demo,最终实现到一步步点击进入游戏后,豌豆射手可以打死僵尸,僵尸可以啃坚果. 使用的是Cocos2d-android,老师在讲课的时候主要就是说这样写可以实现这样的效果,哒哒哒做出来.我听着十分焦灼..难受,因为这些类的今生前世,什么关系,都是干什么的啊不是很清楚.于是下来自己查相关的资料,在网上搜知识点,发现引用了一本书<cocos2d-x权威指南>,讲的比较详细,于是下来看,直接看第三章核心类,看到代码发现是C++的,感觉不对头.

silverlight开发游戏中的大坑

最初做<金X>使用silverlight是因为看了深蓝色的右手的silverlight游戏开发教程,这里赞一下,教程写的非常好!做游戏的基础思想均涵盖了,能够给游戏开发的新手提供很多思维方式上的引导. 但是在我个人开发.发布金X的过程中,陆续发现有一些silverlight的大坑,这里给大家分享一下,防止大家犯重复错误. 1.DateTime数据结构的处理 在游戏中,如果想使用DateTime数据结果来存时间的话,一定要慎用DateTime.ToString和DateTime.Parse方法.

GameBuilder开发游戏应用系列之70行代码实现套圆环

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-551421721381542 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-551421721381542 微信扫描: 运行截图: 套圆环是火舞上的一款非常火爆的游戏,它是FlappyBird的变种,也是重力感应类的游戏,不同的是碰撞检测从FlappyBird的钢管,变成中间的一根绳子. 这根绳子在Game

Unreal SDK 游戏开发从入门到精通(UnrealScript语法、UI Scene界面、UDK独立开发游戏)

对这个课程有兴趣的朋友可以加我的QQ2059055336和我联系 课程内容简介 本系列讲座主要讲述如何利用UDK开发游戏程序. 本课程主要分为四个部分: 1.学习UnrealScript的基本语法, 为下面的学习打下良好的基础 2.系统学习UDK的主要模块, 熟悉并掌握游戏开发的各个系统 3.使用UDK独立开发游戏Demo, 体验和理解UDK对游戏开发流程的整合 课程大纲 第一章初步接触Unreal SDK 1.1 Unreal sdk简介aaa 1.2 UC语言的基本介绍 1.3 搭建UDK的

【C语言探索之旅】第三部分第三课:SDL开发游戏之显示图像

内容简介 1.第三部分第三课: SDL开发游戏之显示图像 2.第三部分第四课预告: SDL开发游戏之事件处理 第三部分第三课:SDL开发游戏之显示图像 上一课中,我们学习了如何加载SDL库(SDL_Init),释放SDL库(SDL_Quit),如何打开一个窗口(Window),如何使用表面(Surface). 这些都是SDL库最最基本的操作.暂时,我们只会给窗口自带的表面上点颜色,好像挺乏味的. 这一课我们来学习如何插入图片.上一课我们说过,SDL中绘制图样需要在Surface上进行.Surfa

【现身说法】玩游戏不如自己开发游戏

内容简介 [现身说法]玩游戏不如自己开发游戏 自己开发游戏比玩游戏好玩100倍 现在这个时代,众多智能产品的出现,使得游戏市场风云变换.一时间,手游和更新奇的游戏形式(例如虚拟现实)成了继小霸王,街机,Game Boy,PS,PC游戏之后的又一霸主. 这也使得玩游戏的人数与日俱增,App Store和Google Play这两个iOS和Android最大的App平台,超过60%是游戏类App.下图是2015第一季度Google Play的App分配比例: 我国的先辈们说过:"先天下之忧而忧,后天