独自一人的手游开发之路(持续更新)(cocos2dx-开发)(IOS)
这个坑是我2013年的时候挖的,当时正在看设计模式,想着写个游戏来实践下,于是就有了这个项目。那时候我天真的以为我可以很快就完成它,然而事实并非如此,这两年发生了太多事,加上之后大病一场,这个项目也就不了了之了。
不知道你们有没有在某个夜晚整宿整宿的睡不着,心里的空虚像潮水般涌来,觉得自己似乎从未真正的做成过某件事,这种没来由的遗憾塞满了我的心,这些辗转反复无法入眠的夜晚给了我一些不一样的感觉,让我觉得,有些事,既然决定了就要做完,哪怕只有孤独伴随。我很喜欢的一句话,送给我自己,也送给所有那些心中有未完成梦想的人。
正确的事情,什么时候做都不晚。
言归正传,说说这个项目。
策划上这个游戏是要做成横版的动作策略游戏,资源全套用的都是网络上的,冒险岛素材。这是一个召唤怪物出来替你打怪过关的游戏,点击下方的怪物卡牌,就会召唤出相应的士兵,这些士兵具有一定程度的AI,会自动锁定攻击最近的怪物,能根据你输入的策略符文改变打法,能触发技能,技能触发之后士兵头上会显示一个技能的图标,点击之后就能发出技能。召唤士兵和使用技能都要用能量,能量系统类似于植物大战僵尸,需要在其产生后手动点击收集,战斗中杀死敌人也会得到能量。士兵的技能可以通过配置画面更换,士兵的属性也可以提升,总之就是一款正宗的横版过关手游。然而这只是我脑子中的想法,并没有写成策划案,系统是想到哪写到哪。说说代码吧,整个项目的继承树由CGameObjectAbstract基类开始衍生,继承出CGameImageObject负责具有渲染的子类,CGameComponentObject负责没有渲染的功能,图形接口类总有CGameMonster,CGameSoidier等等。


主要使用的还是聚合模式,用自己的类封装了cocos2dx的功能。其他使用的设计模式还有工厂方法,单例,策略,桥接等等乱七八糟的都在用。先看自己抽象的CGameInstance类,涌来封装整个游戏的启动逻辑。
[code=c]
//
// CGameInstanceIOS.h
// RPGMapstory
//
// Created by Ling Dong on 13-8-27.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#ifndef RPGMapstory_CGameInstanceIOS_h
#define RPGMapstory_CGameInstanceIOS_h
static void fun();
#include "CGameInstanceAbstract.h"
#include "cocos2d.h"
using namespace cocos2d;
class CGameInstanceIOS:public CGameInstanceAbstract
{
protected:
CGameInstanceIOS()
{
std::cout<<"CGameInstanceIOS is create"<<std::endl;
}
CGameInstanceIOS(const CGameInstanceIOS& rhs)
{
}
const CGameInstanceIOS& operator=(const CGameInstanceIOS& rhs)
{
}
public:
virtual ~CGameInstanceIOS()
{
std::cout<<"CGameInstance is destory"<<std::endl;
}
static CGameInstanceIOS * sharedGameInstanceIOS();
virtual void InitGameInstance();
virtual void InitGameSetting();
virtual void CleareGameInstance();
virtual void PauseGameInstance();
virtual void ResumeGameInstance();
virtual void StartRunGameInstance();
private:
CCScene * m_pGameScene;
};
#endif
//
// CGameInstance.cpp
// RPGMapstory
//
// Created by Ling Dong on 13-9-4.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#include <iostream>
#include "CGameInstanceIOS.h"
#include "CGameDataStruct.h"
#include "cocos2d.h"
#include "CGameScene.h"
using namespace cocos2d;
static CGameInstanceIOS * theGameInstnace = 0;
CGameInstanceIOS * CGameInstanceIOS::sharedGameInstanceIOS()
{
if(!theGameInstnace)
{
theGameInstnace = new CGameInstanceIOS();
if (theGameInstnace)
{
theGameInstnace->InitGameInstance();
return theGameInstnace;
}
}
return theGameInstnace;
}
void CGameInstanceIOS::InitGameInstance()
{
}
void CGameInstanceIOS::InitGameSetting()
{
CCDirector::sharedDirector()->setOpenGLView(CCEGLView::sharedOpenGLView());
CCDirector::sharedDirector()->setDisplayStats(true);
CCDirector::sharedDirector()->setAnimationInterval(GAME_INTERVAL);
}
void CGameInstanceIOS::CleareGameInstance()
{
}
void CGameInstanceIOS::StartRunGameInstance()
{
m_pGameScene = CGameScene::GetScene();
CCDirector::sharedDirector()->runWithScene(m_pGameScene);
}
void CGameInstanceIOS::PauseGameInstance()
{
m_iGameStateValue = GAME_STATE_PAUSE;
}
void CGameInstanceIOS::ResumeGameInstance()
{
m_iGameStateValue = GAME_STATE_RESUME;
}
然后是自己继承自CCLayer的CGameScene涌来封装游戏流程。
//
// CGameScene.h
// RPGMapstory
//
// Created by Ling Dong on 13-9-4.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#ifndef RPGMapstory_CGameScene_h
#define RPGMapstory_CGameScene_h
#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;
class CGameScene:public CCLayer
{
public:
CGameScene()
{
std::cout<<"CGameScene is create"<<std::endl;
}
virtual ~CGameScene()
{
std::cout<<"CGameScene is destory"<<std::endl;
}
static CCScene * GetScene();
virtual bool init();
CREATE_FUNC(CGameScene);
void InitGameScene();
/*
* init game
*/
void RunGameWithFrame();
/*
* 游戏帧循环
*/
void CleareGameScene();
/*
* 清除游戏资源
*/
void OnGameLogoAnimation();
/*
* logo动画事件处理器
*/
void OnGameTitle();
/*
* 标题画面处理器
*/
void OnGameSelectScene();
/*
* 选择关卡画面处理器
*/
void OnGameSceneLogic();
/*
* 场景逻辑处理器
*/
void OnGameConfiguration();
/*
* 配置角色画面处理器
*/
void OnGamePause();
void OnGameResume();
bool ccTouchBegan(CCTouch * pTouch, CCEvent * pEvent);
void SetTouchPoint(const CCPoint& Point)
{
m_TouchPoint = Point;
}
CCPoint GetTouchPoint()const
{
return m_TouchPoint;
}
void Func()
{
int a;
};
private:
int m_iGameRuningStateValue;
bool m_bFirstProtect;
bool m_bGameRuning;
bool m_bIsNeedLoadResource;
bool m_bHasSaveData;
bool m_bHasTouch;
bool m_bIsNewGame;
bool m_bTitleProtect;
std::string m_szCurrentMapName;
CCPoint m_TouchPoint;
};
#endif
然后是自己定义的所有数据结构。
不知道你们有没有在某个夜晚整宿整宿的睡不着,心里的空虚像潮水般涌来,觉得自己似乎从未真正的做成过某件事,这种没来由的遗憾塞满了我的心,这些辗转反复无法入眠的夜晚给了我一些不一样的感觉,让我觉得,有些事,既然决定了就要做完,哪怕只有孤独伴随。我很喜欢的一句话,送给我自己,也送给所有那些心中有未完成梦想的人。
正确的事情,什么时候做都不晚。
言归正传,说说这个项目。
策划上这个游戏是要做成横版的动作策略游戏,资源全套用的都是网络上的,冒险岛素材。这是一个召唤怪物出来替你打怪过关的游戏,点击下方的怪物卡牌,就会召唤出相应的士兵,这些士兵具有一定程度的AI,会自动锁定攻击最近的怪物,能根据你输入的策略符文改变打法,能触发技能,技能触发之后士兵头上会显示一个技能的图标,点击之后就能发出技能。召唤士兵和使用技能都要用能量,能量系统类似于植物大战僵尸,需要在其产生后手动点击收集,战斗中杀死敌人也会得到能量。士兵的技能可以通过配置画面更换,士兵的属性也可以提升,总之就是一款正宗的横版过关手游。然而这只是我脑子中的想法,并没有写成策划案,系统是想到哪写到哪。说说代码吧,整个项目的继承树由CGameObjectAbstract基类开始衍生,继承出CGameImageObject负责具有渲染的子类,CGameComponentObject负责没有渲染的功能,图形接口类总有CGameMonster,CGameSoidier等等。


主要使用的还是聚合模式,用自己的类封装了cocos2dx的功能。其他使用的设计模式还有工厂方法,单例,策略,桥接等等乱七八糟的都在用。先看自己抽象的CGameInstance类,涌来封装整个游戏的启动逻辑。
[code=c]
//
// CGameInstanceIOS.h
// RPGMapstory
//
// Created by Ling Dong on 13-8-27.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#ifndef RPGMapstory_CGameInstanceIOS_h
#define RPGMapstory_CGameInstanceIOS_h
static void fun();
#include "CGameInstanceAbstract.h"
#include "cocos2d.h"
using namespace cocos2d;
class CGameInstanceIOS:public CGameInstanceAbstract
{
protected:
CGameInstanceIOS()
{
std::cout<<"CGameInstanceIOS is create"<<std::endl;
}
CGameInstanceIOS(const CGameInstanceIOS& rhs)
{
}
const CGameInstanceIOS& operator=(const CGameInstanceIOS& rhs)
{
}
public:
virtual ~CGameInstanceIOS()
{
std::cout<<"CGameInstance is destory"<<std::endl;
}
static CGameInstanceIOS * sharedGameInstanceIOS();
virtual void InitGameInstance();
virtual void InitGameSetting();
virtual void CleareGameInstance();
virtual void PauseGameInstance();
virtual void ResumeGameInstance();
virtual void StartRunGameInstance();
private:
CCScene * m_pGameScene;
};
#endif
//
// CGameInstance.cpp
// RPGMapstory
//
// Created by Ling Dong on 13-9-4.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#include <iostream>
#include "CGameInstanceIOS.h"
#include "CGameDataStruct.h"
#include "cocos2d.h"
#include "CGameScene.h"
using namespace cocos2d;
static CGameInstanceIOS * theGameInstnace = 0;
CGameInstanceIOS * CGameInstanceIOS::sharedGameInstanceIOS()
{
if(!theGameInstnace)
{
theGameInstnace = new CGameInstanceIOS();
if (theGameInstnace)
{
theGameInstnace->InitGameInstance();
return theGameInstnace;
}
}
return theGameInstnace;
}
void CGameInstanceIOS::InitGameInstance()
{
}
void CGameInstanceIOS::InitGameSetting()
{
CCDirector::sharedDirector()->setOpenGLView(CCEGLView::sharedOpenGLView());
CCDirector::sharedDirector()->setDisplayStats(true);
CCDirector::sharedDirector()->setAnimationInterval(GAME_INTERVAL);
}
void CGameInstanceIOS::CleareGameInstance()
{
}
void CGameInstanceIOS::StartRunGameInstance()
{
m_pGameScene = CGameScene::GetScene();
CCDirector::sharedDirector()->runWithScene(m_pGameScene);
}
void CGameInstanceIOS::PauseGameInstance()
{
m_iGameStateValue = GAME_STATE_PAUSE;
}
void CGameInstanceIOS::ResumeGameInstance()
{
m_iGameStateValue = GAME_STATE_RESUME;
}
然后是自己继承自CCLayer的CGameScene涌来封装游戏流程。
//
// CGameScene.h
// RPGMapstory
//
// Created by Ling Dong on 13-9-4.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#ifndef RPGMapstory_CGameScene_h
#define RPGMapstory_CGameScene_h
#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;
class CGameScene:public CCLayer
{
public:
CGameScene()
{
std::cout<<"CGameScene is create"<<std::endl;
}
virtual ~CGameScene()
{
std::cout<<"CGameScene is destory"<<std::endl;
}
static CCScene * GetScene();
virtual bool init();
CREATE_FUNC(CGameScene);
void InitGameScene();
/*
* init game
*/
void RunGameWithFrame();
/*
* 游戏帧循环
*/
void CleareGameScene();
/*
* 清除游戏资源
*/
void OnGameLogoAnimation();
/*
* logo动画事件处理器
*/
void OnGameTitle();
/*
* 标题画面处理器
*/
void OnGameSelectScene();
/*
* 选择关卡画面处理器
*/
void OnGameSceneLogic();
/*
* 场景逻辑处理器
*/
void OnGameConfiguration();
/*
* 配置角色画面处理器
*/
void OnGamePause();
void OnGameResume();
bool ccTouchBegan(CCTouch * pTouch, CCEvent * pEvent);
void SetTouchPoint(const CCPoint& Point)
{
m_TouchPoint = Point;
}
CCPoint GetTouchPoint()const
{
return m_TouchPoint;
}
void Func()
{
int a;
};
private:
int m_iGameRuningStateValue;
bool m_bFirstProtect;
bool m_bGameRuning;
bool m_bIsNeedLoadResource;
bool m_bHasSaveData;
bool m_bHasTouch;
bool m_bIsNewGame;
bool m_bTitleProtect;
std::string m_szCurrentMapName;
CCPoint m_TouchPoint;
};
#endif
然后是自己定义的所有数据结构。
...全文
相关推荐
cocos2dx 石头剪子布 手游源码
cocos2dx 石头剪子布 手游源码,vs2010编译,cocos2dx 1.x引擎
Cocos2dx中UIWebView替换为WKWebView
IOS开发中因为引入cocos2dx,导致代码审核不通过无法提交( Apple will stop accepting submissions of apps that use UIWebView APIs )。该问题的解决方案有两种:1)升级Cocos2dx的版本,在查看Cocoas官网及Cocoas论坛,cocoas在4.0修复了这个问题,如果可以更新到4.0以上,建议更新;不想更新的话,可以修改UIWebView为WKWebView。具体的修改方式使用以下的文件替换cocoas引擎中的UIWebViewImpl-ios.mm文件即可。
cocos2dx 源码 act横版战斗手游 学习游戏架构 动作游戏
cocos2dx 源码 act横版战斗手游 学习游戏架构 动作游戏,非常有学习参考价值
cocos2dx手游
cocos2dx开发的手游,在安卓环境中生成的飞机大战游戏。
黄金矿工—Cocos2dx游戏代码(自己开发)IOS-Xcode平台
自己开发的黄金矿工,虽然不是很精致,但可以为像我这样的新手学习提供帮助,谢谢大家


