• 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);

           }

    }

  • 相关阅读:
    唯有坚持方能成功
    Java程序猿,你为什么要关注Scala
    HDU 2871 Memory Control(线段树)
    SQL 合并两个结果集 一个倒序,一个正序
    Charm Bracelet(poj3624)(01背包)
    Dijkstra算法,求单源最短路径(包括路径)
    aix平台安装10.2.0.5的CRS时遇到的bug
    Java语言基础系列之1--用IDEA编写HelloWorld
    UVA 10986 Sending email SPFA
    NumberProgressBar开源项目学习
  • 原文地址:https://www.cnblogs.com/dubo-/p/6676239.html
Copyright © 2020-2023  润新知