『壹』 怎麼在cocos2dx的基礎上學習opengl,shader
說說我的經驗吧。
一、cocos2d-x 部分
1.1 技術選型
從第三個手游開始,我實在被Adobe的ANE和國內的小平台折騰得沒了脾氣,決定轉到cocos2d-x。在選擇哪種語言綁定的時候糾結了很久,最後力排眾議選了 lua:Cocos2dx+lua合適還是Cocos2dx+js合適? cocos2d-x 2.x 的lua綁定做得並不好,於是我選擇了 quick-cocos2d-x (後來,quick被觸控收購)。
1.2 學習 C++
C++ Primer 中文版(第 5 版) (豆瓣) 是不錯的入門書籍,建議看第五版,我寫過一篇 C++Primer 第4版和第5版比較 。學習期間建議畫一些思維導圖幫助理解和整理思路。例如這個(不完整):
學習DEMO的過程中,你必須熟悉自己開發平台的IDE,例如Windows上必須熟悉 Visual Studio,而OS X上必須熟悉xcode,Linux平台上就熟悉Eclipse+CDT吧。
注意,quick-cocos2d-x 是不支持Linux開發平台的。
2014-05-17更新:quick已經使用QT重寫了player部分,但依然不支持Liunx平台。
1.4 了解引擎的文件夾結構
基於 cocos2d-x 源碼生成的文檔並不怎麼詳細,許多功能必須看源碼。但這個階段,我不建議糾結源碼太深,倒是可以糾結一下 cocos2d-x 的文件夾結構,看看各個類放在什麼地方,找一找常見的哪些宏和常量以及枚舉定義在什麼地方,這花不了多少時間,但能讓你對cocos2d-x有更深刻的了解,同時給你很強的成就感。這種成就感沖淡了你面對大量源碼時候的無力感,讓你能夠繼續前行。
1.5 重復上面的第3步:再次學習DEMO
這時候看DEMO可能會輕松不少,但是你會有更多的問題去糾結。例如多解析度支持?例如坐標系統?例如繪圖功能?例如層級管理系統?例如事件傳遞系統?等等等等……這時候可以去Google(注意不要用百毒和其他搜索引擎)找文檔看了。
1.5 重復上面的第3步:再次學習DEMO
這時候看DEMO可能會輕松不少,但是你會有更多的問題去糾結。例如多解析度支持?例如坐標系統?例如繪圖功能?例如層級管理系統?例如事件傳遞系統?等等等等……這時候可以去Google(注意不要用百毒和其他搜索引擎)找文檔看了。
『貳』 cocos2dx 3.x版本中導入tiled地圖如何導入對象層中對象的自定義信息(源碼+注釋)
步驟如下:
1. cocos2d-x 中使用類 TMXTiledMap 創建瓦片地圖
2. 使用 TMXTiledMap 中的 getObjectGroup 介面取得對象層
3. 使用對象層的 getObject 介面獲取對象信息,對象信息是一個 ValueMap 實例
4. 從 ValueMap 中取出數據
測試地圖如下所示:
『叄』 手機游戲用Cocos2d游戲引擎的開發代碼如何保障不會被逆向破解
目前針對Cocos2d游戲引擎的開發代碼防逆向主要是通過隱藏lua腳本文件,根據愛加密介紹,通過隱藏lua腳本文件,可以保護代碼不被黑客給逆向,從而保護游戲邏輯的安全性。希望可以採納,謝謝!
『肆』 Cocos Creator 引擎源碼調試、修改
Cocos Creator 的引擎部分包括 JavaScript 、 Cocos2d-x-lite 和 adapter 三個部分,各部分對應源碼在(Mac 版):
JavaScript:CocosCreator.app/Resource/engine(JS 引擎)
Cocos2d-x-lite:CocosCreator.app/Resource/cocos2d-x(Cococ2d-x 引擎)
adapter:CocosCreator.app/Resource/builtin/
『伍』 哪裡有DemoLogin登錄界面cocos2dx手機游戲源碼
一個登陸界面由背景圖層和一些文本標簽、輸入框、按鈕等組成。一般是按照從下到上的順序創建控制項。
第一步是給根節點設置貼圖,首先是選在對象結構中選中根節點,並打開屬性面板,然後在資源面板中找到Register.png,並拖拽到屬性面板中的文件屬性框內58player.com/code-2943-1.html。
『陸』 如何使用cocos2d和box2d來製作一個Breakout游戲:PART
大家也可以到Ray的網站查看本教程的中文版本。Simple Breakout Game ScreenshotBbox2d是一個非常強大的物理引擎庫,同時它與cocos2d結合非常適合在iphone上面做游戲開發。著名的angry birds,tiny wings都是用box2d寫的。你可以用它做好多事情,當然,最好的學習方法就是使用它來創建一個簡單的游戲。在這個教程中,我們將一步一步創建一個簡單的breakout游戲,完成碰撞檢測,籃球反彈物理效果,通過touch拖動paddle(就是上圖的白色矩形),以及勝利/失敗的場景。 (Jump to part two of the series.)如果你還不了解cocos2d和box2d,你可能先要讀一讀 《如何使用cocos2d製作一個簡單的iphone游戲》 以及《在cocos2d裡面如何使用box2d物理引擎:彈球》.好了,是時候製作breakout了! 一個永遠反彈的球S首先,打開Xcode,選擇 cocos2d-0.99.1 Box2d Application template創建一個工程,命名為「 Box2DBreakout」. 刪除掉模板代碼,因此你會有一個空的工程來重新開始—具體步驟可以參照 《在cocos2d裡面如何使用box2d物理引擎:彈球》 這個教程。一旦你有了一個很好的干凈的工程後,接下來,在HelloWorldScene.h中導入下面的頭文件: #import "Box2D.h" 同時在HelloWorld類中添加以下成員變數: b2World *_world; b2Body *_groundBody; b2Fixture *_bottomFixture; b2Fixture *_ballFixture; 然後在HelloWorldScene.mm文件頂部定義比率: #define PTM_RATIO 32 這個比率我們在上一個教程中已經討論過了,這里就不再啰嗦了。 然後,在init方法中加入下列代碼: CGSize winSize = [CCDirector sharedDirector].winSize; // Create a world b2Vec2 gravity = b2Vec2(0.0f, 0.0f); bool doSleep = true; _world = new b2World(gravity, doSleep); // Create edges around the entire screen b2BodyDef groundBodyDef; groundBodyDef.position.Set(0,0); _groundBody = _world->CreateBody(&groundBodyDef); b2PolygonShape groundBox; b2FixtureDef groundBoxDef; groundBoxDef.shape = &groundBox; groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0)); _bottomFixture = _groundBody->CreateFixture(&groundBoxDef); groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO)); _groundBody->CreateFixture(&groundBoxDef); groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO)); _groundBody->CreateFixture(&groundBoxDef); groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0)); _groundBody->CreateFixture(&groundBoxDef); 好,這個代碼和我們上一個教程中,為整個屏幕創建一個盒子邊界差不多。然後,這一次,我們把重力設置為0,因為,在我們的breakout游戲中,我們並不需要重力!注意,我們存儲了底部的fixture的一個指針,以方便後面使用(在後面的教程中,我們將用來追蹤什麼時候籃球與頂部相碰撞了)。現在,下載我製作的 籃球圖片 並且拖到Resources文件夾中,確保 「Copy items into destination group』s folder (if needed)」 被復選中。讓我們往場景裡面添加一個精靈吧。緊接著上面的代碼,加入下面的代碼片段: // Create sprite and add it to the layer CCSprite *ball = [CCSprite spriteWithFile:@"Ball.jpg" rect:CGRectMake(0, 0, 52, 52)]; ball.position = ccp(100, 100); ball.tag = 1; [self addChild:ball]; 這里沒什麼疑問,我們已經做過好多次類似的事情了。注意,我們為籃球設置了一個tag標識,後面你會看到,這個tag標記有什麼用。 接下來,為shape創建一個body: // Create ball body b2BodyDef ballBodyDef; ballBodyDef.type = b2_dynamicBody; ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO); ballBodyDef.userData = ball; b2Body * ballBody = _world->CreateBody(&ballBodyDef); // Create circle shape b2CircleShape circle; circle.m_radius = 26.0/PTM_RATIO; // Create shape definition and add to body b2FixtureDef ballShapeDef; ballShapeDef.shape = &circle; ballShapeDef.density = 1.0f; ballShapeDef.friction = 0.f; ballShapeDef.restitution = 1.0f; _ballFixture = ballBody->CreateFixture(&ballShapeDef); 這個看起來和上一篇教程中的也很像。再鞏固一下吧,為了創建一個body對象,我們先要創建一個body定義結構,然後再創建body,接著是shape,再指定fixture結構,最後是創建fixture對象。 更新:注意,我們也把球的摩擦力設置為0.這樣可以防止球在碰撞的時候,由於摩擦損失能量,導致來回碰撞的過程中會有一點點偏差。 好了,是時候做一些完全不同的事了!緊接上面的代碼: b2Vec2 force = b2Vec2(10, 10); ballBody->ApplyLinearImpulse(force, ballBodyDef.position); 這里往球上面施加了一個沖力(impulse),這樣可以讓它初始化的時候朝一個特定的方向運動。 最後一件事情,就是在init方法中,增加一個tick調度方法: [self schele:@selector(tick:)]; 下面是tick方法的實現: - (void)tick:(ccTime) dt { _world->Step(dt, 10, 10); for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) { if (b->GetUserData() != NULL) { CCSprite *sprite = (CCSprite *)b->GetUserData(); sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); } } } 當然,這里也和上一個教程中的一樣,沒有什麼特別的。 最後一件事我們永遠不忘記!那就是清理: - (void)dealloc { delete _world; _groundBody = NULL; [super dealloc]; } 好了,讓我們試一下吧。編譯並運行工程,你將會看到一個球無限地在屏幕裡面來回彈!—-很酷吧!增加Paddle如果沒有一個paddle的話,那麼就不可能稱其為一個breakout游戲。下載我製作的paddle圖片 然後把它拖到Resources文件夾中,同時確保 「Copy items into destination group』s folder (if needed)」 被復選上。然後在HelloWorldScene.h文件中往HelloWorld類中添加下列成員變數: b2Body *_paddleBody; b2Fixture *_paddleFixture; 然後,在init方法中構建paddle body: // Create paddle and add it to the layer CCSprite *paddle = [CCSprite spriteWithFile:@"Paddle.jpg"]; paddle.position = ccp(winSize.width/2, 50); [self addChild:paddle]; // Create paddle body b2BodyDef paddleBodyDef; paddleBodyDef.type = b2_dynamicBody; paddleBodyDef.position.Set(winSize.width/2/PTM_RATIO, 50/PTM_RATIO); paddleBodyDef.userData = paddle; _paddleBody = _world->CreateBody(&paddleBodyDef); // Create paddle shape b2PolygonShape paddleShape; paddleShape.SetAsBox(paddle.contentSize.width/PTM_RATIO/2, paddle.contentSize.height/PTM_RATIO/2); // Create shape definition and add to body b2FixtureDef paddleShapeDef; paddleShapeDef.shape = &paddleShape; paddleShapeDef.density = 10.0f; paddleShapeDef.friction = 0.4f; paddleShapeDef.restitution = 0.1f; _paddleFixture = _paddleBody->CreateFixture(&paddleShapeDef); 我不想花太多的時間解釋上面的內容了。因為,和之前的創建籃球的body的過程差不太多。這里只給出不同的地方:當你創建CCSprite的時候,你並不需要指定精靈的大小。如果你傳遞一個文件名給它,它會自動計算出大小。注意,這里不是使用circle shape了。這一次,我們使用polygon shape。我們使用一個輔助方法來創建shape,當然,其形狀是個盒子。我們使用了SetAsBox方法來指定shape相對於body的位置,這個方法在構建復雜的對象的時候比較有用。這里,我們只是讓shape在body中間。我把paddle的密度設置得比球要大得多,同時調節了一下其它的參數。(這些參數要靠試,按照真實的高中物理知識去計算,可能得不到)同時,我們存儲paddleBody和paddleFixture的引用,為了方便後面使用。如果你編譯並運行的話,你將會看到屏幕中間有一個paddle,而且球碰到它將會反彈。 然後,這還不是很有趣,因為我們還不能移動paddle!移動Paddle移動paddle需要touch事件,所以先在init方法中允許touch事件: self.isTouchEnabled = YES; 然後,在HelloWorldScene.h的HelloWorld類中添加下面的成員變數: b2MouseJoint *_mouseJoint; 現在,讓我們實現touch方法!首先是ccTouchesBegan: - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint != NULL) return; UITouch *myTouch = [touches anyObject]; CGPoint location = [myTouch locationInView:[myTouch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); if (_paddleFixture->TestPoint(locationWorld)) { b2MouseJointDef md; md.bodyA = _groundBody; md.bodyB = _paddleBody; md.target = locationWorld; md.collideConnected = true; md.maxForce = 1000.0f * _paddleBody->GetMass(); _mouseJoint = (b2MouseJoint *)_world->CreateJoint(&md); _paddleBody->SetAwake(true); } } 呃,好多新知識!讓我們一點一點來討論。 首先,我們把touch坐標轉換成coocs2d坐標(convertToGL)然後,再轉換成Box2d坐標(locationWorld)。 然後,我們使用paddle fixture的一個方法來測試這個touch點是否在fixture內部。 如果是的話,我們就創建一個所謂的」滑鼠關節「。在Box2d裡面,一個滑鼠關節用來讓一個body朝著一個指定的點移動—在這里個例子中,就是用戶點的方向。 當你創建一個mouse joint後,你賦值給它兩個body。第一個沒有被使用,通常都是設置成ground body。第二個,就是你想讓它移動的body,在這個例子中就是paddle。 接下來,你指定移動的終點—這個例子中就是用戶點擊的位置。 然後,你告訴box2d,但bodyA和bodyB碰撞的時候,把它當成是碰撞,而不是忽略它。這個很重要!因為,我之前沒有設置它為ture,結果不行!因此,當我們用滑鼠拖動這個paddle的時候,它並不會與屏幕的邊界相碰撞,而且有時候,我的paddle直接就飛出屏幕之外了。這個非常非常奇怪,不過我現在知道是為什麼了。因為沒有設置bodyA和bodyB是可碰撞的。 你然後指定移動body的最大的力是多少。如果你減少這個數值的話,paddle body響應滑鼠移動時就會慢一些。但是,我們想讓paddle快速地響應滑鼠的變化。 最後,我們把這個關節加入到world中,同時,保存這個指針,因為後面有用。同時,我們還要把body設置成蘇醒的(awake)。之所以要這么做,是因為如果body在睡覺的話,那麼它就不會響應滑鼠的移動! 好了,接下來,讓我們添加ccTouchesMoved方法: -(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint == NULL) return; UITouch *myTouch = [touches anyObject]; CGPoint location = [myTouch locationInView:[myTouch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); _mouseJoint->SetTarget(locationWorld); } 這個方法的開頭部分和ccTouchesBegan差不多—我們把touch坐標轉換成Box2d坐標。唯一的區別就是,我們更新了滑鼠關節的目標位置(也就是我們想讓paddle移動的位置的)。 接下來,我們添加ccTouchesCacelled和ccTouchesEnded方法: -(void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint) { _world->DestroyJoint(_mouseJoint); _mouseJoint = NULL; } } - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (_mouseJoint) { _world->DestroyJoint(_mouseJoint); _mouseJoint = NULL; } } 我們在這些方法中做的只有一件事,就是在我們移動完paddle或者取消移動之後銷毀mouse joint。 編譯並運行,你現在可以用滑鼠移動paddle了,同時可以讓它與籃球相互碰撞了! 很好。。。不過,等一下,這還不是一個breakout!我們不可以把paddle移動到任何位置,我們只能在屏幕底部左右來回移動它!限制Paddle的移動我們可以很容易地限制paddle的移動,只需要添加另外一個關節,叫做prismatic joint。這個關節會限制一個body的移動沿著一根指定的軸。 因此,我們可以使用這種方法來限制paddle相對於地面移動,也就是說只能沿著x軸移動。 讓我們看看相關代碼。往init方法中加入下列代碼: // Restrict paddle along the x axis b2PrismaticJointDef jointDef; b2Vec2 worldAxis(1.0f, 0.0f); jointDef.collideConnected = true; jointDef.Initialize(_paddleBody, _groundBody, _paddleBody->GetWorldCenter(), worldAxis); _world->CreateJoint(&jointDef); 第一件事情就是指定一個沿著x軸的向量。然後,我們需要指定collideConnected為true,因此,我們的球才能夠正確的反彈,而不是飛到屏幕之外去。 然後,初始化關節,指定paddle和ground兩個body,再使用world對象來創建關節! 更新:我第一次嘗試去修正這個bug的時候,我通過直接調整球的速度,使用SetLinearVelocity方法。然後,Steve Oldmeadow也指出,這非常不好!它會破壞物理模擬,最好的方法是通過調用SetLinearDamping方法,間接影響速度。因此,現在這個教程就是這個做的。(damping就是阻尼的意思) 接下來,在tick方法中添加下列代碼,具體位置是在獲得user data之後: if (sprite.tag == 1) { static int maxSpeed = 10; b2Vec2 velocity = b->GetLinearVelocity(); float32 speed = velocity.Length(); if (speed > maxSpeed) { b->SetLinearDamping(0.5); } else if (speed < maxSpeed) { b->SetLinearDamping(0.0); } } 這里,我們判斷sprite的tag,看是否是球的tag。如果是的話,我們就檢查它的速度,如果太大的話,就設置它的阻尼為0.5,這樣可以讓它慢下來。 如果你編譯並運行的話,你將會看到一個球以非常適中的速度在屏幕四周來回反彈。給我源代碼!這里是本教程的 完整源代碼 。這只是一部分,第二部分的教程會包含一個完整的breakout的源碼。接下來呢?目前為止,我們已經有一個籃球在屏幕四周來回反彈了,同時還有一個paddle可以用滑鼠來控制其移動。在下個教程中,我們將創建一些方塊,當球碰到它們的時候,方塊就會消失。
『柒』 如何使用Cocos2d-x完美呈現捕魚3
捕魚達人3與前兩部相比,技術上有哪些突破和創新?
捕魚達人3作為前兩代成功作品的續作,我們需要從玩法到技術,全面超越前代。所以在技術上,我們主要做了下面一些突破和創新:
1)魚的3D渲染。 跟2D渲染相比,3D渲染可以讓魚看起來更加立體和真實。 3D骨骼動畫可以讓動作更加豐富和平滑。另外我們還為魚增加了表情動作,讓魚兒更具個性化。
2) 純3D路徑。 前兩代的2D路徑在我們新的3D場景下,表現力要弱很多。為此我們設計了全新的3D路徑編輯器,魚的游動不僅僅在一個面上游動,而是一個立體空間,這樣魚的游動過程會更加平滑和真實。
3) 豐富的武器表現效果。 以前的武器效果,我們一般是結合幀動畫和粒子效果實現,在捕魚3中,我們的武器很多是通過 shader 實現的,讓效果更加絢麗和富於變化。比如閃電武器,泡泡武器等。
4) 3D的後處理和燈照效果。大家可以看到我首屏模擬海洋的效果,就用到相關技術。還有魚身上的波光效果。
2.《捕魚達人3》使用了最新的Cocos2d-x中3D功能,它有哪些突出的亮點?請舉幾個游戲里的具體案例說明
1)繼承Cocos2d-x的設計思路,只要具備Cocos2d-x的編程經驗, 在使用和理解上完全無障礙,可以立馬上手寫代碼。
2) 豐富的材質系統,可以自定義模型不同渲染效果。 比如:我們的魚身上的渲染效果已經電鰻魚的閃電效果
3) 強大的模型編輯器,可以自定義模型的材質
3. 引擎3D功能使用的時候感覺和2D部分區別在哪?
設計理念和開發流程和2D差不多
4. 游戲裡面的動畫效果,是UI實現的,還是Cocos引擎的3D效果?比如那個漩渦,是不是使用引擎的3D效果可以做很多不同的漂亮效果呢?
渲染時用3D的材質系統實現的, 由於材質系統的擴展能力很強,做出各種漂亮的效果完全沒問題。
5. Cocos2d-x的3D技術穩定性如何?是否已經到了可以大規模市場化應用的階段?
挺好的,我們Android版本的適配度高達92%以上。
6. 引擎粒子效果的效率一直備受爭議,請問捕魚達人3有沒有專門做優化?
我們對同一種粒子做了批次處理。另外,還通過腳本, 嚴格控制了粒子的個數,不能超過某個上限值。
7. 在《捕魚達人3》開發過程中,遇到哪些困難和挑戰?你們是如何克服的?
游戲開發都會面臨一個資源的管理問題,就是資源如何從美術製作,在到程序使用以及後續的維護。捕魚3的資源類型比較多。2D層有圖片,ui資源,動畫資源,字體資源,粒子資源。 3D層又涉及3D模型,材質,紋理,shader等。另外,還有track,策劃配置文件等。所以種類非常多。 還因為捕魚3的適配性要求比較高,所以,我們有些資源按照解析度有劃分了幾大類。 還附加一條,資源還分不同的語言版本。 上線之後,資源本身還需要跟隨發布版本一起維護。所以中間的問題非常多。 在我們項目中會嚴格對資源進行規范, 包括命名,目錄結構。資源如何從美術維護的目錄流動到程序使用的目錄等。另外還維護了一套基於ant+python的腳本來去驅動資源的流轉。 實現一鍵生成程序所需要的資源。 無須人工的干預, 非常便捷。
另外我們還有一鍵打Windows,iOS,Android各種程序包的腳本,方便做版本的daily build。
8. 《捕魚達人3》的背後一定有一支強大的團隊,包括多方面能力的配合,能否分享一下團隊協作和管理的經驗?
就我們研發而言, 其實最重要是前期做好開發規范,然後打造融洽的團隊氛圍,明確每個人的開發任務,大家隨著項目的發展一起往前進步。
9. 最後,對其它有志進入手遊行業或者在摸索中前行的手游開發者,您能否給一些建議?
雖然很多媒體都在高喊:手游已是一片紅海。 但這個市場遠沒有飽和,移動設備的增量仍然很大。而且區別於端游市場的客戶端大作,頁游市場的各種網游。手游的游戲類型更加多樣化,更加豐富。休閑的,棋牌的,各類網游,都有成功的案例。所以,這個市場更加靈活,更適合小團隊創造奇跡,仍然有很多的機會。另外從技術上講,由於存在Cocos2d-x這種幾乎處於壟斷地位的引擎, 手游也是一個更加開放的市場。 網上有一大堆的學習資料和游戲源碼, 只要你有點計算機基礎,入門還是很容易的。重要的是自己能夠靜下心來多看多寫些代碼,爭取獨立發布一款產品。我見過不少人自己做一點東西都沒堅持下來,做一半就放棄掉。其實在多堅持下,離成功就近了很多。
『捌』 自學cocos2d js游戲開發應該按什麼步驟進行
跟你簡要說一下我的自學路,以免你走彎路
背景:
有工作,而且很忙;在不影響工作基礎上用業余時間鼓搗(經常會因為工作耽擱學習進度);基本沒技術背景(初中qbasic、高中pascal半吊子),大學文科,工作也不是搞代碼。因此我感覺我的自學路跟你還是挺契合的。
1
兩年前的一天,決定要做獨立游戲製作人。選定引擎cocos2d,開始學習objective-c語言;(如果你打算只在iOS平台開發可以學obj-c配合cocos2d或者sprite kit;如果打算跨平台就要用cocos2d-x和c++了;當然unity什麼的也不錯但是我還沒嘗試過,一直很嚮往)
2
我跳過了iOS程序開發(似懂非懂看完了斯坦福那一系列的教學視頻),結合當時情況直接選擇了cocos2d引擎,這時開始接觸 @吳一刀 推薦的博客;我主要看的是子龍山人<子龍山人 - 博客園>、Ray Wenderlich<Ray Wenderlich>、Himi<黑米GameDev街區>這些博客里最基本的例子,知易那個以我當時的水平還看不懂。
3
嘗試開始設計自己的簡單游戲,我做打地鼠!當然比教學例子里的打地鼠復雜多了
4
這個過程中發現自己懂的實在是不夠,所以又開啃這本書:Learn cocos2d 2 by Steffen Itterheim & Andreas Low
5
慢慢的發現需要一些趁手的工具和編輯器,並發展出一套自己構建於cocos2d之上的游戲設計架構。我目前的情況是這樣:
關卡編輯我使用plist文件配合自己寫的類;
sprite sheet使用TexturePacker<TexturePacker>;
動畫/UI編輯最初自己手寫太累,後來選擇了cocosbuilder,請注意現在這個軟體已經停止維護,轉而引導用戶使用SpriteBuilder<SpriteBuilder>(域名都做了自動跳轉;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;Introction 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
『玖』 求cocos2d-x教程
cocos教程網路網盤免費資源在線學習
鏈接: https://pan..com/s/1lYZHKPPVuvBR4rddE1jasA
cocos教程 極客學院Cocos2d-x源碼 05_第5階段 項目實戰 04_第4階段 功能擴展 03_第3階段 常用功能 02_第2階段 基礎知識 01_第1階段 環境搭建 5 使用Eclipse在Ubuntu下搭建Cocos2d-x 3集成開發環境 4 Cocos Code IDE使用 3 Windows環境下Visual Studio 2013中搭建Cocos2d-x 3.1集成開發環境 2 Cocos2d-x3.1rc0項目創建及新功能介紹 1 WinMac環境Cocos2d-x開發環境搭建 06. HelloWorld示例詳解.webm 05. 在Mac平台編譯成Android程序.webm 04. Mac平台開發環境搭建.webm
『拾』 Cocos2d-x之獲取圖像像素值
製作游戲時,我們最常用的圖片格式是png,因為png可以有透明的背景,這樣在游戲顯示圖片是,透明的部分不會顯示,只顯示我們要的那部分。但是,透明的部分依然是圖片的一部分,當你製作了一個非矩形的按鈕,會有相當多的透明部分點擊有效,那麼如何做到點擊透明部分無效呢?這就是本片文章要講的:獲取圖像像素值。當然不僅僅在製作非矩形按鈕時有用,在游戲中的很多涉及圖片處理功能的地方也大有用途。
廢話不多說,直接貼源碼(Cocos2d-x 3.x版本):
HelloWorldScene.h文件
HelloWorldScene.cpp文件:
在GetRGBA函數中,調用了OpenGL的介面glReadPixels,它用於讀取一些像素。當前可以簡單理解為「把已經繪制好的像素(它可能已經被保存到顯卡的顯存中)讀取到內存」。
glReadPixels函數總共有七個參數。前四個參數可以得到一個矩形,該矩形所包括的像素都會被讀取出來。(第一、二個參數表示了矩形的左下角橫、縱坐標,坐標以窗口最左下角為零,最右上角為最大值;第三、四個參數表示了矩形的寬度和高度)
第五個參數表示讀取的內容,例如:GL_RGB就會依次讀取像素的紅、綠、藍三種數據,GL_RGBA則會依次讀取像素的紅、綠、藍、alpha四種數據,GL_RED則只讀取像素的紅色數據(類似的還有GL_GREEN,GL_BLUE,以及GL_ALPHA)。如果採用的不是RGBA顏色模式,而是採用顏色索引模式,則也可以使用GL_COLOR_INDEX來讀取像素的顏色索引。目前僅需要知道這些,但實際上還可以讀取其它內容,例如深度緩沖區的深度數據等。
第六個參數表示讀取的內容保存到內存時所使用的格式,例如:GL_UNSIGNED_BYTE會把各種數據保存為GLubyte,GL_FLOAT會把各種數據保存為GLfloat等。
第七個參數表示一個指針,像素數據被讀取後,將被保存到這個指針所表示的地址。注意,需要保證該地址有足夠的可以使用的空間,以容納讀取的像素數據。例如一幅大小為256*256的圖象,如果讀取其RGB數據,且每一數據被保存為GLubyte,總大小就是:256*256*3 = 196608位元組,即192千位元組。如果是讀取RGBA數據,則總大小就是256*256*4 = 262144位元組,即256千位元組。
注意:glReadPixels實際上是從緩沖區中讀取數據,如果使用了雙緩沖區,則默認是從正在顯示的緩沖(即前緩沖)中讀取,而繪制工作是默認繪制到後緩沖區的。因此,如果需要讀取已經繪制好的像素,往往需要先交換前後緩沖。