« 对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);

       }

}

转载于:https://www.cnblogs.com/dubo-/p/6676239.html

UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView相关推荐

  1. UML设计系列(4):用例图

    目录 传送门 UML之类图 UML之时序图 UML之状态机 什么是用例图 感受一下 基本概念 用例图的作用 用例的组成 参与者 用例 关联 总结&参考 参考资料:<UML2基础.建模与设 ...

  2. 类图 顺序图 活动图 状态图 用法和比较

    使用电梯仿真系统来解释下列各种图的关系 类图 为什么要使用用类图: 我们在开发系统的时候是不是经常采用 分而治之  的思想 即将其分解为较为简单的子系统. 而使用类图道理也是一样,目的就是为了简化逻辑 ...

  3. UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图

    2009-01-20 作者:Randy Miller 来源:网络 面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified M ...

  4. UML 建模步骤 用例图 类图 对象图 包图 顺序图/时序图 状态图 活动图 协作图

    统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明.可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言. UML是面向对象设计的建 ...

  5. UML用例图、活动图、顺序图、类图、对象图、通信图(协作图)、状态机图特点

    UML– 用例图 用例图展现的是一组用例.参与者和扩展关系.包含关系等.该图的作用是描述系统的行为,即该系统在它的上下文环境中所提供的外部可见服务.注:参与者不一定是人,可以是其它除系统以外的事物. ...

  6. 探讨使用UML设计机器学习特征工程与深度学习建模等大数据分析软件

    大数据人工智能软件产品研发,是在传统软件工程的基础上,增加了数据特征分析.人工智能算法建模及模型训练过程,同时也增加了很大的不确定性. 0. 前言 本文以程序员视角,以客户流失为案例,使用UML方式设 ...

  7. UML设计系列(8):数据库关联关系图

    传送门 UML设计系列(1):状态机图 UML设计系列(2):类图 UML设计系列(3):时序图 UML设计系列(4):用例图 UML设计系列(5):系统依赖图 UML设计系列(6):活动图 UML设 ...

  8. 第三视角团队:项目UML设计(团队)

    项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...

  9. 团队作业之现场UML设计

    项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...

  10. 福大软工 1816:项目UML设计(团队作业三)

    项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...

最新文章

  1. Hibernate获取数据java.lang.StackOverflowError
  2. Thrift的java和php数据交互
  3. 北方人思想为什么落后_广西人为什么很少到北方打工?
  4. 贪心算法之活动选择问题
  5. zillow房价预测比赛_Zillow Prize: 百万美刀奖金的房价预测比赛
  6. dns提供商主机名_在 Kubernetes 中使用 DNS 和 Headless Service 发现运行中的 Pod
  7. Nginx Location块中proxy_pass配置/路径问题
  8. 【Caffe代码解析】SyncedMemory
  9. 输出表格csv_自动提取生成excel表格!推荐一款开源工具
  10. java后台对接app微信支付
  11. python学习笔记(六):if语句之处理数据
  12. XXL-JOB漏洞解决,Eclipse Jetty HTTP请求走私漏洞
  13. 884.两句话中的不常见单词
  14. 电脑开机后网络一直转圈,程序也打不开——亲测解决办法
  15. 腾讯云服务器基础使用方法
  16. C#中判断空字符串的3种方法性能分析 1
  17. Android Menu 之 ContextMenu 详解
  18. Yolov3-v5正负样本匹配机制
  19. 一个解决MacBook Pro 突然连接无线不能上网 方案
  20. 冯绍峰,如果你爱她,记得不要把名字倒过来讲!

热门文章

  1. Python闭包及其作用域
  2. 优化SQl的30中常用方法
  3. 重置outlook 2010
  4. 关于webStrom-11.1配置less且自动生成.css和自动压缩为.min.css/.min.js
  5. Flex AdvancedDataGrid 数据展示异常
  6. linux 擦脚印工具,linux一步一脚印---rm命令
  7. 用eclipse创建WebService Step by Step
  8. DPDK pmd驱动初始化(十九)
  9. linux常用命令linux自动挂载WinXP系统下的分区
  10. jeecg uedit 自定义图片上传路径