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);
?????? }
}
轉載于:https://www.cnblogs.com/dubo-/p/6676239.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView的全部內容,希望文章能夠幫你解決所遇到的問題。