cocosjs渲染過程(原生js動態渲染數據)

本文目錄一覽:

自學cocos2d js遊戲開發應該按什麼步驟進行

跟你簡要說一下我的自學路,以免你走彎路

背景:

有工作,而且很忙;在不影響工作基礎上用業餘時間鼓搗(經常會因為工作耽擱學習進度);基本沒技術背景(初中qbasic、高中pascal半吊子),大學文科,工作也不是搞代碼。因此我感覺我的自學路跟你還是挺契合的。

1

兩年前的一天,決定要做獨立遊戲製作人。選定引擎cocos2d,開始學習objective-c語言;(如果你打算只在iOS平台開發可以學obj-c配合cocos2d或者sprite kit;如果打算跨平台就要用cocos2d-x和c++了;當然unity什麼的也不錯但是我還沒嘗試過,一直很嚮往)

2

我跳過了iOS程序開發(似懂非懂看完了斯坦福那一系列的教學視頻),結合當時情況直接選擇了cocos2d引擎,這時開始接觸 @吳一刀 推薦的博客;我主要看的是子龍山人子龍山人 – 博客園、Ray WenderlichRay Wenderlich、Himi黑米GameDev街區這些博客里最基本的例子,知易那個以我當時的水平還看不懂。

3

嘗試開始設計自己的簡單遊戲,我做打地鼠!當然比教學例子里的打地鼠複雜多了

4

這個過程中發現自己懂的實在是不夠,所以又開啃這本書:Learn cocos2d 2 by Steffen Itterheim Andreas Low

5

慢慢的發現需要一些趁手的工具和編輯器,並發展出一套自己構建於cocos2d之上的遊戲設計架構。我目前的情況是這樣:

關卡編輯我使用plist文件配合自己寫的類;

sprite sheet使用TexturePackerTexturePacker;

動畫/UI編輯最初自己手寫太累,後來選擇了cocosbuilder,請注意現在這個軟件已經停止維護,轉而引導用戶使用SpriteBuilderSpriteBuilder(域名都做了自動跳轉;SpriteBuilder我木有研究過,建議你研究一下)。

粒子編輯我自己還沒實際用到,如果真正需要我感覺cocosbuilder的夠我用的。//更新:後來用到了ParticleDesigner和cocosbuilder兩個軟件的粒子編輯混搭

我當時遇到的一個大麻煩是如何讓cocosbuilder、cocos2d版本互相兼容且cocosbuilder無問題。大概情況是這樣:cocosbuilder2.1和cocos2d-iphone2.0及2.1版本都不協調怎麼辦?;What version of Cocosbuilder and Cocos2d-iphone should I choose?

目前我使用的cocosbuilder 2.1版本(漸變層有bug、並且很可惜動畫播放完沒有觸發消息的機制,我只好把每個動畫時長都手動記錄一下自己處理)

======3月12日更新======

在 @GarfieldKwong 指點下發現這個版本動畫播放完是可以觸發消息機制的,更高級版本3.x支持的效果應該是在動畫中就加入callback的關鍵幀

新技能get√

具體代碼可見下面學習案例的第一個例子里Explosion部分

=====================

cocosbuider的學習可以看兩個例子Creating a Game with CocosBuilder;Introduction to CocosBuilder;然後就是多用多嘗試。

6

整個學習過程要學會查資料、學會尋求幫助,我主要用的stackoverflow(話說剛剛發現stackoverflow的reputation喜過15,終於可以投票了:)

在學習過程中得到了子龍山人(我認為本尊是這位 @屈光輝 )、LearnCocos2d作者Steffen、 @kubisoft 以及眾多網上朋友的幫助,再次表示感謝。

7

硬件及開發者資格:看完c++開始看obj-c,這個過程一直是使用的vmware虛擬機安裝的mac系統寫程序;然後入手一個最便宜的mac pro、以及iPhone,嘗試玩各種遊戲;從看c++開始大約過了1年半(已經有非常簡陋的遊戲demo)才真正購入iOS開發者資格並開始真機測試。

8

嘗試過的一些其他工具、各種彎路和坑、以及發散內容:

可以拖拽方式寫代碼的stencyl Stencyl: Make iPhone, iPad, Android Flash Games without code;

最初學的不是ojc-c而是譚浩強老師的c++程序設計(雖然有人不喜譚老師,但那書是中文的讓我對面對對象程序設計有一些初步的概念,再看英文的obj-c不至於太摸不着頭腦,反正手頭正好有這麼一本買了6年沒看的c++。。。);

嘗試過Tiled Map Editor但自己目前的坑沒有用到;

嘗試過一點物理引擎和粒子,但自己目前的坑沒有用到;現在粒子用到了,做了火焰等效果,也挺美的;但是一定要注意CPU佔用優化,內存方面我最低支持4S沒遇到大問題

學習音樂製作,這個我小時候學琴一直也喜歡音樂所以有一點點底子,如果沒有基礎可能上手有門檻;開始用的軟件LMMS,但是音源插件在64位系統的問題我一直沒解決掉時間精力也不多,所以是暫時停滯了;最近發現Garage Band可能也可以寫歌;另外還試過一個很有歷史的微軟的音樂自動編輯器,很好玩,用來做背景音樂也不錯。

入手手繪板學畫畫(這中間糾結了好久才決定用位圖不用矢量圖),如果你能找到熱愛遊戲的美術同學一起搞那最好不過。但是我一直對畫畫心癢難搔。。。所以入了這個深坑,曬一曬:

轉載

z

cocos creator 2.4.0 渲染流程詳解(七:ForwardRender)

全文共5000+字,分為8個章節,由本人歷時一周整理而來。由於篇幅問題,將本文分為8個章節分開發布。全文 ( 不 ) 詳細描述了cocoscreator 引擎的2.40版本中,web平台的js部分引擎的渲染流程。請將文章配合源碼一起食用!

由於我尚在學習引擎源碼中,文章可能有不正確的部分,所以我會不斷更新內容。如有錯誤或補充,請留言交流!

全部章節鏈接:

一: 渲染流程中用到的核心類

二 : 渲染流程詳解

三: RenderFlow 的運行邏輯

四: Assembler 的作用

五: ModelBatcher 數據合批

六: 材質系統

七: ForwardRender

ForwardRender 繼承於 Base, 是與底層渲染最靠近的類型,當上面的流程處理完畢後,會在ForwardRender 的 render() 中處理當前場景的渲染狀態,材質,光照,通道,着色器,更新着色器的統一變量。並在 _draw() 中調用 device.draw()方法,進行繪製。

部分重要的繼承於 Base 的成員變量:

_device:根據運行平台對應的繪製圖形對象 gfx.Device 的實例,用於繪製圖形到屏幕,類型定義於 cocos2d\renderer\gfx\index.js。

_programLib : 管理 shader 定義,獲取,檢查等相關的變量。類型定義於 cocos2d\renderer\core\program-lib.js。

_stage2fn:保存有不同渲染通道的名稱與其對應的不同渲染方法。ForwardRender 中設置有 shadowcast, opaque, transparent 三種渲染通道。

_viewPools:單個相機的描述數據類(View) 的對象池。一個View對應一個相機。

_drawItemsPools:渲染數據類的對象池,保存有每個渲染批次需要的model,effect 等數據。

_stageItemsPools:單個渲染通道需要渲染的數據的對象池,本質是對 _drawItemsPools 中的數據按照不同通道進行了分類。

ForwardRender 中定義的成員變量:

_lights:保存所有燈光數據。

_shadowLights:保存所有陰影燈光數據。

類名 ForwardRender 翻譯為前向渲染,泛指傳統上只有 Opaque 和 Transparent 兩個通道的渲染技術。cocos有三個渲染通道,渲染通道方法定義在 _stage2fn 中。

渲染管線具體詳解請參考unity官方文檔(對的,真要學cocos還得看unity的文檔):

內置渲染管線中的渲染路徑

相關鏈接

如何用Cocos引擎打造次世代3D畫質‘遊戲大觀

從Cocos 2d-x 3.0起我們已經可以在遊戲中使用3D元素。Cocos引擎推出3D功能的時間不算太遲,我們已經可以看到越來越多的手機上能流暢地渲染3D遊戲,而且這些機型正在成為主流。在最近兩年我們可以看到,高端手機遊戲從2D轉到3D的傾向很明顯。許多遊戲開發商試圖在競爭激烈的紅海里佔有一席之地,那麼選擇開發3D遊戲或許會是一個強有力的競爭手段。

上面的視頻是我的下一款遊戲作品《Food of the Gods》。這遊戲使用了Cocos 2d-x 3.3,視頻是從我iPhone上錄製的實際運行效果。在這篇文章里我將要介紹我是如何製作它、如何把它跑在cocos引擎上的。對於熟悉cocos官方提供的3D示例遊戲 《Fantasy Warrior》的開發者,將會看到以下一些主要不同點:

1. 光照貼圖(Light Mapping):你將看到每件物體都有被照亮並且投射陰影。光影效果的質量是由你的3D工具軟件決定的,用3D軟件能烘焙出複雜的光效,包括直接光照,反射光照,以及陰影。

2. 頂點合併(Vertex Blending):請注意看路、草地和懸崖交接的地方,看不到任何可見的接縫。

3. 透明遮罩(Alpha Masks):灌木如果沒有透明遮罩就跟紙片一樣。

4. 濾色疊加的公告板(Billboards):增加一些光束和其他環境的效果。

所有的模型都是用一個叫Modo的3D 軟件建模製作的,貼圖則是使用Photoshop。關於3D模型的製作和貼圖的繪製在此就不再贅述,網上已經有很多教程,在此主要介紹下跟Cocos 2d-x有關的部分。

模型網格和貼圖(Meshes and Textures)

如下圖所示,每個模型的貼圖都是由幾個256 x 256或者更小的貼圖組成的。同時你也會注意到我把所有的小圖片都合在了一張貼圖上,這是減少GPU繪製次數(draw call)最簡單的方法之一。貼圖是從 或者網上找的。

為了把這些圖片拼接起來,我使用的是Photoshop的補償濾鏡(offset filter)然後在接縫的地方用修復畫筆來做一些自然的過渡。為了獲得一種油畫的視覺效果我會先使用cutout濾鏡(注意:cutout濾鏡也會使得png格式圖片的壓縮效果更好),然後在需要的地方繪製一些高光和陰影的效果。我發現如果直接拿照片當貼圖的話,當你把它尺寸縮小的時候會出現圖像噪點。

另一種方案是為每一個模型網格製作一整張獨立的貼圖。當網格比較小或者攝像機不是很靠近網格的時候這種方法是可行的。如果你的photoshop技術過硬的話,出來的效果會更好。附帶的好處是,因為只使用一張貼圖因此只有一次GPU繪製調用。但我不建議採用這種方法來製作第一人稱射擊遊戲(FPS)中的建築,因為當你走得很靠近建築物的時候,貼圖分辨率過低的問題就會顯露出來。我不喜歡用這種整張貼圖方法,因為這實在太費時耗力了。這個場景的製作花了我足足四天時間。

光照貼圖(Light Maps)

當你做好模型和貼圖之後,現在就可以來烘焙光照貼圖了。Cocos 2d-x目前還不像Unreal或Unity一樣在官方編輯器里提供烘焙光照貼圖的功能,但是別失望,大部分的製作3D模型的軟件都可以烘焙光照貼圖,並且效果比市面上任何遊戲引擎的效果還好。首先,在你的3D工具軟件里,先給場景打好燈光,照亮場景,然後為每份網格製作第二張UV map。每份網格的表面都必須被映射在0到1範圍內的UV 平面上。這聽起來好像很複雜且耗時,但在Modo里這是非常簡單的。我先後使用 “Atlas map”的UV 工具和“Pack UV”工具,這兩個工具會自動將網格展開成一個相當不錯的排布圖。

這些都完成之後,設置3D工具軟件的渲染器為“只渲染烘焙的光照”,然後開始渲染。當然了,如果你想做一些環境光遮罩的效果也是可以的。

你也可以使用一些分辨率較低的光照貼圖。有時候這樣的效果反而會看起來更好,因為相互混疊的模糊像素會讓陰影看起來更柔和。上面的這些建築都映射到一張512 x 512的光照貼圖上。整個場景總共使用了4 張512 x 512的光照貼圖。請確保每個小圖塊之間有一定的空隙,且讓你的渲染範圍比這些圖塊的邊界多出幾個像素。這樣可以防止當較低的mip-maps(一種紋理採樣)起作用時黑邊出現在網格周圍的角落裡。

最後一點聽起來像是3D技術的行話。如果是對Texture Packer熟悉的話,那麼其中的“Extrude”值起到的作用就是剛剛我所描述的。對貼圖的邊緣接縫做一些塗抹處理,這樣在精靈之間就不會有那些煩人的縫隙了,那些縫隙在這裡會變成多邊形邊緣的黑邊。

如果你想犧牲內存和包大小來提高性能的話,你可以把顏色和光照信息都烘焙到一張貼圖上並避免共同使用一張光照貼圖。但是這樣做的話,同樣的像素密度,貼圖的大小至少得翻一倍。這完全取決於你個人、以及你遊戲的要求。

接下來,添加頂點顏色。我在地形上提供了頂點顏色,這可以讓着色器在合成懸崖頂上的草地貼圖時,不會有任何可見的接縫。下圖中塗成白色的頂點部分可以合成你指定的貼圖。在這個例子里實際上我只使用紅色通道,當然了根據實際需要你可以使用4個通道(RGBA)去合成不同的貼圖。

最後,我把整個場景分成了很多獨立的網格(mesh):每個建築都有自己獨立的網格,地形獨立一個網格,水也是獨立一個。帶透明遮罩的貼圖也會有一個網格——比如視頻中看到的植物葉子和小旗子。我這樣做有兩個原因,首先,讓地形、建築、水和帶透明遮罩的貼圖各自使用不同的着色器。其次,我們打算通過不渲染攝像機範圍外的對象來減少性能開支。很重要的一點是攝像機會根據網格的包圍盒來決定對象是否可見,因此盡量把網格弄成小塊,這樣包圍盒會比較小。

導出

完成了模型和貼圖之後,我們需要把每個mesh導出為一個.fbx文件。幸運的是,大多數的3D建模軟件都支持這個功能。Autodesk為此格式提供了一個免費SDK。但不幸的是,Modo 701在導出fbx格式時會出現相當多的錯誤。因此我必須自己寫一些腳本來保證第二組貼圖坐標和頂點顏色的正確導出。你可以從我個人網站上的“Modo Scripts”部分下載這個導出腳本。搞定fbx之後,你將需要用到Cocos 2d-x自帶的fbx-conv.exe命令行工具,它位於Cocos 2d-x根目錄的/tools下。

fbx-conv.exe -a your_mesh_name_here.fbx

使用“-a”參數後,工具會同時導出mesh的二進制文件(.c3b)和文本格式文件(.c3t)。文本格式的文件非常的有用,你可以利用它來查看所有的東西是否被正確導出,但千萬不要把它放到resource目錄下。如果所有的都被正確地導出的話,你將在c3t文件的開頭看到以下的內容:

“attributes”: [{

“size”: 3,

“type”: “GL_FLOAT”,

“attribute”: “VERTEX_ATTRIB_POSITION”

}, {

“size”: 3,

“type”: “GL_FLOAT”,

“attribute”: “VERTEX_ATTRIB_NORMAL”

}, {

“size”: 2,

“type”: “GL_FLOAT”,

“attribute”: “VERTEX_ATTRIB_TEX_COORD”

}, {

“size”: 2,

“type”: “GL_FLOAT”,

“attribute”: “VERTEX_ATTRIB_TEX_COORD1″

}]

注意VERTEX_ATTRIB_TEX_COORD1這個屬性。如果沒有它光照貼圖將無法顯示。如果你導出了一張帶頂點顏色的mesh,你也應該要看到一個類似的屬性才行。還有一點很重要,貼圖的坐標也必須按正確的順序才行。我通常採用的是第一個tex_coord是瓦片貼圖,最後一個tex_coord是光照貼圖。使用Modo的話,uv maps會按照字母順序排列。

着色器(Shaders)

我花了很長的一段時間來搞懂GLSL和着色器,但正如編程中經常遇到的,有時候一個點通了,其他的就都好理解了。一旦理解了其中的原理,你便會發現着色器真的很簡單。如果你不只是想用Cocos 2d-x來把貼圖套到模型網格上的話,你需要學會如何寫着色器。目前Cocos 2d-x沒有Unreal那樣好用的着色器可視化編輯器(visual shader editor),所以我們只能自己動手焊代碼。

本節我將講解我為視頻中的遊戲場景所寫的着色器,並說明我做了什麼、為什麼這樣做。如果你對着色器已經非常熟悉了,那麼可以快速跳過本節。

首先,先來看一下如何將着色器應用到模型網格上。

這段代碼摘自Cocos 2d-x的測試集cpp-tests工程。如果你用不同的着色器來加載大量的meshes,那麼最好根據功能來進行,這樣可以避免冗餘。那麼現在我們只關心如下的代碼段,來看下這個着色器。

GLProgram* shader =GLProgram::createWithFilenames(“shaders/lightmap1.vert”,”shaders/lightmap2.frag”);

GLProgramState* state = GLProgramState::create(shader);

mesh-setGLProgramState(state);

Texture2D* lightmap =Director::getInstance()-getTextureCache()-addImage(“lightmap.png”);

state-setUniformTexture(“lightmap”,lightmap);

“lightmap1.vert”是頂點着色器(vertex shader)。如果將其應用到網格上,那麼每個頂點的每一幀都將執行這個操作。而“lightmap2.frag”是片段着色器(fragment shader),網格上貼圖的每個像素的每一幀都將執行這個操作。我不太確定為什麼將其命名為“片段着色器”,我一直認為應叫做“像素”着色器(pixel shader)。從這段描述,我們可以很容易理解為什麼大量着色器指令會降低幀率,尤其是你用片段着色器的話。

接下來我們詳細地分解頂點着色器:

attribute vec4 a_position;

attribute vec2 a_texCoord;

attribute vec2 a_texCoord1;

這些屬性是由渲染器提供的。“a_position”是頂點的位置。“a_texCoord” 和 “a_texCoord1”對應你那兩個UV坐標。還記得在.cbt文本格式文件中開頭部分的“VERTEX_ATTRIB_TEX_COORD”么?這些值與屬性對應起來了。你可以在渲染器中獲取更多其他的屬性,包括頂點法線(vertexnormal)和頂點顏色(vertex color)。請在cocos引擎的CCGLProgram.cpp中查看完整屬性列表。

varying vec2 v_texture_coord;

varying vec2 v_texture_coord1;

“varying”值將被傳到片段着色器中(fragment shader)。片段着色器所需要的任何變量前都需要添加“varying”限定符。這個例子中,我們僅需要知道這兩個貼圖的坐標。

void main(void)

{

gl_Position = CC_MVPMatrix * a_position;

v_texture_coord.x = a_texCoord.x;

v_texture_coord.y = (1.0 – a_texCoord.y);

v_texture_coord1.x = a_texCoord1.x;

v_texture_coord1.y = (1.0 – a_texCoord1.y);

}

設置頂點位置,拷貝貼圖的坐標給varying values,這樣片段着色器就可以使用這些值。現在我們一起來分解片段着色器。

#ifdef GL_ES

varying mediump vec2 v_texture_coord;

varying mediump vec2 v_texture_coord1;

#else

varying vec2 v_texture_coord;

varying vec2 v_texture_coord1;

#endif

聲明從頂點着色器傳遞過來的“varying” 值

uniform sampler2D lightmap;

還記得在將着色器應用到網格時所使用的 state-setUniformTexture(“lightmap“,light map); 語句么?這個值就是對應語句中的那個貼圖。

void main(void)

{

gl_FragColor = texture2D(CC_Texture0, v_texture_coord) *(texture2D(lightmap, v_texture_coord1) * 2.0);

}

這個語句設置像素顏色。首先你會注意到從未聲明過的 CC_Texture0變量。Cocos 2d-x中有大量可在着色器中使用的默認統一變量。再次強調,可在CCGLProgram.cpp中查看完整屬性列表。這個例子中,CC_Texture0對應在3D模型中所應用到網格中的貼圖。texture2D命令會在給定的貼圖坐標中去查找貼圖的像素顏色和透明度。它會返回一個包含了那個像素的RGBA值的vec4值 。所以這裡我會在UV1中查找到瓦片貼圖的顏色值,然後在UV2中查到光照貼圖的顏色值,最後把兩個值相乘。

你應該注意到了我先是把光照貼圖的顏色值兩兩相乘了。因為貼圖顏色值範圍為0.0-1.0,所以很顯然,如果用白色值vec4(1.0, 1.0, 1.0, 1.0)去乘中間灰值vec4( 0.5, 0.5, 0.5,1.0 ),那麼你仍是得到一個中間灰值vec4( 0.5, 0.5, 0.5,1.0 )。將兩個值相乘可以使貼圖更亮,同時也可以使貼圖更暗,這將使你獲得一個很好的可變的亮度範圍。

cocos creator 如何加載一張圖片並渲染出來的

導讀:   ccc 我們在使用一張圖片的時候,使用cc.laod api ,回調傳回來cc.spriteFrame 或者cc.texture來供我們使用。下面的內容會解密中間到底經歷了哪些過程(native)。

加載:首先會在js引擎中,通過一些方式得到資源的完整信息,包括資源的完整路徑資源類型等(可以了解下load的加載過程)。

然後調用jsb_global_load_image方法,利用native來加載這張圖片到內存中,拿到內存首地址和內存大小。

把剛才拿到的信息轉為jsObject,內存地址和大小會被描述成arrayBuff,包裝好的對象回調回給js。

js引擎拿到回調後會創建一個texture來,然後調用 texture.initWithElement()方法,把之前包裝好的數據再傳回給native的texture對象(js的texture利用jsb來管理native的texture對象,並且是1對1的)。

渲染:native的texture接收到數據後會用OpenGL的api來開闢顯存,綁定紋理數據(分配一個紋理id給native的texture)。然後通過device(DeviceGraphics是單例,大多數的OpenGL api接口都是通過他調用)渲染到屏幕上。(OpenGL api可自行查找資料)

我們在js端讓一個精靈顯示圖片的時候,是在load的回調里 把cc.spriteFrame給精靈使用,spriteFrame里持有cc.texture對象,cc.texture又持有由native返回的數據。通過這種方式讓紋理數據和將要渲染的對象綁定起來。

還有許多包括頂點數據  node的位置 大小 shader 等等 都在RenderFlow等類中獲取和封裝(比較複雜),最後配合紋理數據 渲染出來。我們加載的一張圖片就這樣渲染到了屏幕上。

流程圖:

cocos js 怎樣做出按鈕選中效果

cocos js 做出按鈕選中效果示例:

一,首先使用cocos新建一個Cocos2d-js的新項目,然後再cocostudio中創建一個場景,在場景中添加三個按鈕分別設置三態的圖片

二,打開編輯器,實現代碼如下:

var HelloWorldLayer = cc.Layer.extend({

ctor:function () {

this._super();

//導入cocostudio中拼好的界面

mainscene = ccs.load(res.MainScene_json).node;

this.addChild(mainscene);

this.teamButton = ccui.helper.seekWidgetByName(mainscene,”Button_0″);

var btn2 = ccui.helper.seekWidgetByName(mainscene,”Button_1″);

var btn3 = ccui.helper.seekWidgetByName(mainscene,”Button_2″);

//先默認設置一個按鈕為選中狀態   this.teamButton.setBrightStyle(ccui.Widget.BRIGHT_STYLE_HIGH_LIGHT);

this.teamButton.setEnabled(false);

var teamInfo = this.teamButton;

this.teamButton.addTouchEventListener(this.selectedBtn1,this);

btn2.addTouchEventListener(this.selectedBtn2,this);

btn3.addTouchEventListener(this.selectedBtn3,this);

return true;

},

selectedBtn1: function (sender, type) {

if(type == ccui.Widget.TOUCH_ENDED){

this.callBack(sender);

cc.log(“==========商店界面”);

}

},

selectedBtn2: function (sender, type) {

if(type == ccui.Widget.TOUCH_ENDED){

this.callBack(sender);

cc.log(“==========卡牌界面”);

}

},

selectedBtn3: function (sender, type) {

if(type == ccui.Widget.TOUCH_ENDED){

this.callBack(sender);

cc.log(“==========戰鬥界面”);

}

},

callBack: function (sender) {

if (this.teamButton == sender){

return;

}else{

this.teamButton.setBrightStyle(ccui.Widget.BRIGHT_STYLE_NORMAL);

this.teamButton.setEnabled(true);

sender.setBrightStyle(ccui.Widget.BRIGHT_STYLE_HIGH_LIGHT);

sender.setEnabled(false);

this.teamButton = sender;

}

},

});

var HelloWorldScene = cc.Scene.extend({

onEnter:function () {

this._super();

var layer = new HelloWorldLayer();

this.addChild(layer);

}

});

三,運行就可以查看界面,點擊不同的按鈕顯示不同的輸出結果

[Log] ==========商店界面 (CCDebugger.js, line 331)

[Log] ==========卡牌界面 (CCDebugger.js, line 331)

[Log] ==========戰鬥界面 (CCDebugger.js, line 331)

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/152552.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-13 06:04
下一篇 2024-11-13 06:04

相關推薦

  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • QML 動態加載實踐

    探討 QML 框架下動態加載實現的方法和技巧。 一、實現動態加載的方法 QML 支持從 JavaScript 中動態指定需要加載的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29

發表回復

登錄後才能評論