UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView
« 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL
在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作;并且对于游戏界面的切换,元素动作的处理,都已经有人做好了这些工作,并将其封装到框架中,其中Cocos2d-android就是这样一个框架。
Cocos2d实现游戏的绘制:
1、实现步骤:
首先来说,要想绘制出游戏界面,按照谷歌文档中的说明,需要实现两步操作:
①、所有的SurfaceView和SurfaceHolder.Callback,被UI Thread调用
也就是说需要接收用户的操作
②、确保所绘制的进程是有效的:
就要调用SurfaceHolder.Callback中的创建方法creat被调用和销毁方法destroy被调用
2、具体的实现:
1)、Cocos2d中有CCGLSurfaceView这个类,是继承于SurfaceView的,并实现了SurfaceHolder.Callback的接口。创建出这个对象,就有了绘制游戏界面的容器。
2)、绘制容器中的画面和元素,还要接受用户的操作;就需要将绘制的操作放在一个子线程中执行,UI Thread这个线程接收用户的操作;通过GLThread这个类实现不断的绘制界面的操作。
GLThread绘制线程的实现:
①、复写了run方法,在run方法中调用了GLThread自己的run方法:guardedRun
此方法中,通过while(true)不停的绘制,其中有相应的标记进行控制
绘制的方法:mRenderer.onDrawFrame(gl);【绘制一帧】
【void org.cocos2d.opengl.GLSurfaceView.Renderer.onDrawFrame(GL10 gl)】
②、Canvas和GL10这个接口如何进行处理绘制的:
在Canvas中,Bitmap和GL是互斥的,一个为null,另一个必须不为null
Cocos2d底层用到的是OpenGL的信息,所以方法中传递的是gl的接口
③、GLThread的开启:
@、在GLSurfaceView中的setRenderer方法中开启的:
mGLThread = new GLThread(renderer);
mGLThread.start();
@、在CCDirector(继承了GLSurfaceView.Renderer)的initOpenGLViewWithView方法中调用了setRenderer
@、的调用是由attachInView(View view)方法返回的
最终是由导演CCDirector进行调用,这是导演的第一个工作,
attachInView(View view)的作用是将导演和SurfaceView进行绑定,绑定时,将绘制线程开启起来
(3)由此,大致过程如下:
①、创建出CCGLSurfaceView(即对应的SurfaceView),设置显示setContentView(surfaceView)
②、紧随其后,创建出导演CCDirector【通过单例获取:director=CCDirector.sharedDirector();】
③、通过调用导演中的attachInView(surfaceView),传入surfaceView:
这样就建立了CCDirector和SurfaceView之间的关系
并且还开启了绘制线程,进行绘制:
attachInView(View view)方法调用了initOpenGLViewWithView方法【都是导演中的方法】
initOpenGLViewWithView方法调用了setRenderer【开启绘制线程用的】
在setRenderer中创建了绘制线程,并开启起来
mGLThread = new GLThread(renderer);
mGLThread.start();
3、界面元素的展示:
上面的操作只是创建出界面,可以不断绘制界面中的内容,要想丰富界面,就需要添加元素到界面中。
Cocos2的架构:
①、Cocos2D Graphic图形引擎②、CocosDenshion Audio声音引擎③、物理引擎④、Lua脚本库
其中对于图形引擎,在Cocos2d中,绘制游戏就相当于在拍电影
由导演类CCDirector控制这个游戏元素的展现和消失;其中还包括场景类CCScene和精灵类CCSprite
说明:
1)CCDirector(导演):
引擎的控制者,控制场景的切换,游戏引擎属性的设置 【管理整棵大树】
2)CCScene (场景):场景类
例如游戏的闪屏,主菜单,游戏主界面等。
【类似于树根,树干】
3)CCLayer(布景):图层类
每个图层都有自己的触发事件,该事件只能对其拥有的元素有效,而图层之上的元素所包含的元素,是不受其事件管理的【类似于树枝】
4)CCSprite(人物):精灵类,
界面上显示的最小单元【类似于树叶】
5)CCNode:
引擎中最重要的元素,所有可以被绘制的东西都是派生于此。它可以包含其它CCNode,可以执行定时器操作,可以执行CCAction。
CCScene,CCLayer,CCSprite的父类
6)CCAction(动作):动作类
如平移、缩放、旋转等动作
示例代码:
public
class MainActivity extends Activity {
private CCDirector director;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
//创建surfaceView
CCGLSurfaceView surfaceView = new
CCGLSurfaceView(this);
setContentView(surfaceView);
//创建导演
director =
CCDirector.sharedDirector();
/* 设置相关参数
*/
//横屏显示
director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft);
//设置屏幕大小
director.setScreenSize(480, 320);
//显示帧率
director.setDisplayFPS(true);
//①建立CCDirector和SurfaceView之间的关系;开启绘制线程
director.attachInView(surfaceView);
/*
* 管理显示内容
*/
//创建场景
CCScene scene = CCScene.node();
// FirstLayer layer = new FirstLayer();
// ActionLayer layer = new
ActionLayer();
DemoLayer layer = new DemoLayer();
//添加场景中的layer
scene.addChild(layer);
director.runWithScene(scene);
}
@Override
protected void onResume() {
director.onResume();
super.onResume();
}
@Override
protected void onPause() {
director.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
director.end();
super.onDestroy();
}
}
public
class FirstLayer extends CCLayer {
private static final String TAG =
"FristLayer";
private int count;
public FirstLayer(){
// 一个场景里面只能有一个layer可以处理用户的Touch
this.setIsTouchEnabled(true);
count = 0;
init();
}
/*
* 初始化
* 展示精灵并实现动画
*/
private void init() {
//创建精灵
CCSprite sprite =
CCSprite.sprite("z_1_01.png");
this.addChild(sprite);
sprite.setAnchorPoint(0, 0);
CCSprite spritex =
CCSprite.sprite("z_1_01.png");
spritex.setFlipX(true);
spritex.setAnchorPoint(0, 0);
spritex.setPosition(100, 0);
this.addChild(spritex, 0, 10);
CCSprite spritey =
CCSprite.sprite("z_1_01.png");
spritey.setFlipY(true);
spritey.setAnchorPoint(0, 0);
spritey.setPosition(0, 100);
this.addChild(spritey);
}
@Override
public boolean ccTouchesBegan(MotionEvent
event) {
// 坐标转换:将MotionEvent封装的手机屏幕坐标系的坐标信息转换成Cocos2D的坐标系
CGPoint touchPos=
this.convertTouchToNodeSpace(event);
CCSprite sprite = (CCSprite)
this.getChildByTag(10);
boolean containsPoint =
CGRect.containsPoint(sprite.getBoundingBox(), touchPos);
if(containsPoint){
// sprite.setOpacity(new
Random().nextInt(255));
// count++;
// sprite.setVertexZ(1.0f+count);//最大132?
// Log.i(TAG,
"count=="+count);
//移除精灵
// sprite.removeSelf();
//隐藏精灵
sprite.setVisible(false);
/*
* Tips:此处不能使用sprite.removeSelf();
* 否则在第二次点击的时候,就会挂掉,因为再次点击的时候,精灵已经从layer中移除出去了
*/
}
return
super.ccTouchesBegan(event);
}
}
UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView的更多相关文章
- UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图
面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...
- (转)UML实践----用例图、类图、对象图、顺序图、协作图、状态图、活动图、组件图、配置图
面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...
- (转)UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图
原文链接:http://dn.codegear.com/article/31863 面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是 ...
- [2018福大至诚软工助教]UML设计小结
[2018福大至诚软工助教]UML设计小结 一.得分 总分(50分) 团队信息 (4分) 队名 (1分) 团队成员的学号与姓名(需要标注队长)(1分) 本次作业的博客链接(1分) 三者完全,4分 团队 ...
- 【项目 · Wonderland】UML设计
团队作业---UML设计 Part 0 · 简要目录 Part 1 · 团队分工 Part 2 · UML Part 3 · 工具选择 Part 1 · 团队分工 Part 2 · UML 描述信息: ...
- 第三视角团队:项目UML设计(团队)
项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...
- 福大软工 1816:项目UML设计(团队作业三)
项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...
- 团队作业之现场UML设计
项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...
- 阿里八八“好记”——UML设计
团队分工 叶文滔:软件整体框架部分 俞鋆:后端数据库部分 王国超:日程多日显示部分 黄梅玲:日程详细显示部分 张岳.刘晓.李嘉群:用户部分 UML设计 整体框架 用例图 类图 活动图 状态图 数据库部 ...
- UML 用例图,时序图,活动图的定义以及区别
1.用例图,时序图,活动图的定义 1.用例图: 用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色" ...
随机推荐
- #include <algorithm>中sort的一般用法
1.sort函数的时间复杂度为n*log2(n),执行效率较高. 2.sort函数的形式为sort(first,end,method)//其中第三个参数可选. 3.若为两个参数,则sort的排序默认是 ...
- JAVA-JAVA、JavaScript、JavaWeb的关系
相关资料:1.http://www.cnblogs.com/youring2/archive/2013/06/06/3120645.html2.https://jingyan.baidu.com/ar ...
- 4款基于html5 canvas充满想象力的重力特效
今天给大家分享4个物理和重力实验,用来展示 html canvas 的强大.几年前,所有这些实验都必须使用 Java 或 Flash 才能做.在下面这些惊人的例子中,就个人而言,我比较喜欢仿真布料的那 ...
- 一款简洁的纯css3代码实现的动画导航
之前为大家介绍了好多导航菜单,今天给大家分享一款简洁的纯css3代码实现的动画导航.鼠标经过的时候以背景色以菱形渐变为长方形.效果图如下: 在线预览 源码下载 实现的代码. html代码: < ...
- Ubuntu 12.04下NFS安装配置图解
以前就听说过nfs服务,但是一直没有用,在学习制作根文件系统的时候,才算是真正用上它了,我感觉它还不错,通过它“挂载”制作好的根文件系统.它在嵌入式中的角色就用下面的一张图说明吧! 用网线将主机与开发 ...
- jQuery插件 -- 表单验证插件jquery.validate.js
最常使用JavaScript的场合就是表单的验证,而jQuery作为一个优秀的JavaScript库,也提供了一个优秀的表单验证插件----Validation.Validation是历史最悠久的jQ ...
- 解决javaWEB 下载文件中文名称乱码问题
response.setContentType("application/x-msdownload;"); response.setCharacterEncoding(" ...
- iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放
一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...
- C/C++-中的sort排序用法
转载于:http://www.cnblogs.com/luorende/p/6121906.htmlSTL中就自带了排序函数sortsort 对给定区间所有元素进行排序 要使用此函数只需用#inclu ...
- nodejs基础 -- EventEmitter
var events = require('events'); nodejs所有的异步I/O操作在完成时都会发送一个事件到事件队列 nodejs里面的许多对象都会分发事件,如: 一个net.Serve ...