日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/7/25 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。