cocos2dx学习经验:怎么在手游市场生存

Pages: 1/2
主题 : cocos2dx 3D战斗类游戏制作:【四】——一些零散笔记,3D小地图,android surfaceview等
级别: 新手上路
可可豆: 241 CB
威望: 221 点
在线时间: 124(时)
发自: Web Page
来源于&&分类
cocos2dx 3D战斗类游戏制作:【四】——一些零散笔记,3D小地图,android surfaceview等&&&
本帖被 lvlong 执行加亮操作()
在cocos的坐标系、cocos与Android之间遇到一些事情,做个笔记。首先是坐标系,Cocos的一个node,其rotation,是基于其父节点坐标的。例如layer里面添加一个camera,那么旋转camera的xyz,例如setRotation3d(Vec3(0,180,90)),并不是让camera绕自身y转180后,再绕自身z轴转90。而是camera绕layer的x转180,再绕layer的z转90。脑补一下就知道,实际上两个方式的z旋转,因为y上已经转了180,所以方向是相反的了。清楚了一点,有助于处理比较麻烦的坐标系相对旋转问题。camera是与精灵们在同一个layer,还是不同layer,取决于要不要观察相机后方而维持正常的Z旋转。然后就是独立于layer之外的camera,如何在小地图屏幕还原sprite的二维坐标?如果相机与sprite在同一layer,只需要相机矩阵简单一句mat.getInversed().transformVector(&pos)即可。但是当camera与layer分离时,又会有诸多情况,嘿嘿。这部分,贴一段看起来貌似OK但是实际会有问题的代码:Vec3 bossPos = boss_i-&getPosition3D();
Vec2 PosAfterRotate = Vec2(bossPos.x, bossPos.z).rotateByAngle(Vec2(0, 0), CC_DEGREES_TO_RADIANS(-_layer3D-&getRotation3D().y));//X与Z绕Y还原至垂直相机的平面
pos.x = PosAfterRotate.x; pos.y = bossPos.y; pos.z = PosAfterRotate.y;
pos.w = 1;
Mat4 mat = _CameraBird-&getNodeToWorldTransform();
mat.getInversed().transformVector(&pos);//使用相机矩阵,取得boss在屏幕的投射坐标
Vec2 bossPosAbs = Vec2(pos.x, pos.y) / (curPos.distance(bossPos));这段代码看似无误,实际运用中却会发现还原出的bossPosAbs与boss显示位置存在偏差,原因是什么,自己想吧,哈哈,就不说破了。正确的计算方式是什么?想明白了为什么这个会错,正确的自然也就呼之欲出了。然后是cocos与android的surfaceview的问题。android的surfaceview是在游戏被推入后台时,会被自动destroy的。然后程序再被唤醒时,它又会被oncreate。这涉及了诸多线程的问题,也就会产生一堆的怪事。首先,使用的是在主程序中创建一个新的surfaceview,通过其回调启动相机的方式。if(mPreviewSV==null){
    mPreviewSV = new SurfaceView(JniDoIt.this);
    addContentView(mPreviewSV,new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT)); // keep old views
    Log.i(&SHOW_AR&, &mPreviewSV is null and now it is added&);
    Log.i(&SHOW_AR&, &mPreviewSV already exist......&);
if(mySurfaceHolder==null){
    mySurfaceHolder = mPreviewSV.getHolder();
    mySurfaceHolder.setFormat(PixelFormat.TRANSPARENT);
    Log.i(&SHOW_AR&, &mySurfaceHolder is null and now it is defined to mPreviewSV.getHolder().......&+mySurfaceHolder);
    Log.i(&SHOW_AR&, &mySurfaceHolder already exist......&+mySurfaceHolder);
}回调定义:private class ArSurfaceHolderCallBack implements SurfaceHolder.Callback{}在游戏推入后台时,释放相机,并且删除surfaceview的回调,唤醒时重建一次surfaceview。如此做的结果是相机预览是恢复了,但是把cocos主界面也覆盖了,下面是其log
log那一行onenGL错误曾经误导了很久,那是一个在UI线程之外更新UI而产生的错误,结合cocos界面被覆盖的实际情况,感觉非常非常像是surfaceview进程与UI进程冲突,但是暂且忽略吧,因为后来发现完全注释掉surfaceview相关代码,这个错照样存在,而且在我最终的解决方案中,这个错虽然仍旧存在,但是可以做到正常唤醒。这个错应该是程序中某些其他位置导致的,暂且不理它。那么不使用回调方式,直接使用surfaceview类内部取得自身handler,在游戏推入后台时,释放相机,并且删除surfaceview,唤醒时重建一次surfaceview,重新启动回调和相机如何呢?呼叫方式:mPreviewSV = new ArSV(JniDoIt.getContext());
mPreviewSV.setId(100);
JniDoIt.this.addContentView(mPreviewSV,new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT)); // keep old views类定义:private class ArSV extends SurfaceView implements SurfaceHolder.Callback{
    private SurfaceHolder mySurfaceHolder =
    private Camera myCamera =
    
    @SuppressWarnings(&deprecation&)
    public ArSV(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        mySurfaceHolder = getHolder();// 获得surfaceHolder引用
        mySurfaceHolder.addCallback(this);
        // TODO Auto-generated constructor stub
    }
    
    
    public void surfaceCreated(SurfaceHolder holder){}
    ..........
}情况照旧,唤醒时,把cocos主界面也覆盖了。下面是其log。
log中可注意到一件小事,destroy发生在remove之前,而remove是主程序在PushBackground时使用如下代码进行的。
case PushBackground:
    if(null != compass){
        compass.stop();
        Log.i(&PushBackground&, &Compass stopped....&);
    }
    else{
        Log.i(&PushBackground&, &Compass not exist....&);    
    }
    if(mPreviewSV!=null){
        ViewGroup vg = (ViewGroup)mPreviewSV.getParent();
        Log.i(&PushBackground&,&child count=& + vg.getChildCount());
        View viewCamera =
        for(int i=0; i&vg.getChildCount(); i++){
            View view = vg.getChildAt(i);
            Log.i(&PushBackground&,&index=& + i +&:view = & + view+& id=&+view.getId());
            if(view.getId()==100){
                viewCamera=
                vg.removeView(viewCamera);
                mPreviewSV=
                Log.i(&PushBackground&,&Remove view = &+viewCamera+&id=&+view.getId());
            }
        }
        for(int i=0; i&vg.getChildCount(); i++){
            View view = vg.getChildAt(i);
            Log.i(&PushBackground&,&after clean-------&index=& + i +&:view = & + view+& id=&+view.getId());
            view.layout(120, 120, 250, 250);
        }
    }
也就是说for循环都还没list到mPreviewSV,它就已经destroy了。不过在后续循环中它仍旧被remove了。分别在新线程中创建surfaceview,或者runonUIthread,没有什么区别,都存在surface在唤醒时,抢占顶层z序的问题。尝试使用bringToFront()将cocos的framelayout调到顶层,但是没什么作用。ok,ok,看起来,应该是surfaceview太强大了,要不然就是新线程中运行的绘屏surface会永远在最上层吧。好了,写完笔记,上张图,演示一些笔记里面说的这些东西是用在什么地方的,呵呵。坐标系转换是那个火控雷达用的,要让它显示出围绕着用户前后上下左右的敌机,并且用一颗绿色小准心死死咬住面前的敌机,就得靠几层的3D坐标向屏幕坐标的转换和映射了。背景的实景,就是依靠surfaceview开启的手机摄像头AR。
帅不帅,嘿嘿,是不是史上最另类的打飞机 [ 此帖被dark79在 14:41重新编辑 ]
QQ:扳机游戏工作室&&Trigger Studio
级别: 圣骑士
UID: 356822
可可豆: 790 CB
威望: 775 点
在线时间: 438(时)
发自: Web Page
支持下楼主...干的漂亮
级别: 骑士
UID: 349110
可可豆: 1244 CB
威望: 897 点
在线时间: 443(时)
发自: Web Page
波总么么哒
実際なってみても、あのころと何も変わらないような気がして。今でも、大人になったなんてはっきり自覚したことは、一度もない。
级别: 新手上路
可可豆: 241 CB
威望: 221 点
在线时间: 124(时)
发自: Web Page
回 2楼(小懒猫爱吃鱼) 的帖子
QQ:扳机游戏工作室&&Trigger Studio
级别: 新手上路
UID: 436368
可可豆: 182 CB
威望: 179 点
在线时间: 81(时)
发自: Web Page
一看就是大神&&&&小弟想做个&&3D空间控制飞机 自由飞的Demo&&摄像机的控制一直不对&& 大神能给点意见吗? 就是各个方向的旋转问题&&学生党 菜鸟一枚 给大神跪了
级别: 新手上路
可可豆: 241 CB
威望: 221 点
在线时间: 124(时)
发自: Web Page
回 4楼(wanggangaian) 的帖子
这个问题其实在本篇里面,我已经把重点说到了,限于项目限制,具体解决方案暂时不能说得更多,呵呵,但是我给出的那段有bug的代码已经非常接近了。
QQ:扳机游戏工作室&&Trigger Studio
级别: 新手上路
可可豆: 241 CB
威望: 221 点
在线时间: 124(时)
发自: Web Page
回 1楼(abc88798) 的帖子
嘿嘿,据说cocos下一版要出skybox和terrain了,在想下一篇是不是写一下这两个东西呢,捂了好久了,而且貌似项目已经不准备用这skybox和terrain了先上实现图显摆下吧,天空盒实现得比较完美,地形暂时还很粗糙其实,cocos做3D,只要自己愿意花点心思,可以做的很不错的!当然我不是说我发这个哦,哈哈,这个就是还没开始做美工的破烂:)[ 此帖被dark79在 00:57重新编辑 ]
图片:QQ图片20.png
图片:QQ图片52.png
QQ:扳机游戏工作室&&Trigger Studio
级别: 新手上路
UID: 436368
可可豆: 182 CB
威望: 179 点
在线时间: 81(时)
发自: Web Page
回 5楼(dark79) 的帖子
哦&&好吧&& 谢谢大神 &&&&
级别: 骑士
可可豆: 457 CB
威望: 417 点
在线时间: 323(时)
发自: Web Page
级别: 侠客
UID: 299859
可可豆: 233 CB
威望: 190 点
在线时间: 155(时)
发自: Web Page
围观大神,万一混脸熟了呢
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版独自一人的手游开发之路(持续更新)(cocos2dx-开发)(IOS)
来源:csdn
【这个坑是我2013年的时候挖的,当时正在看设计模式,想着写个游戏来实践下,于是就有了这个项目。那时候我天真的以为我可以很快就完成它,然而事实并非如此,这两年发生了太多事,加上之后大病一场,这个项目也就不了了之了。
不知道你们有没有在某个夜晚整宿整宿的睡不着,心里的空虚像潮水般涌来,觉得自己似乎从未真正的做成过某件事,这种没来由的遗憾塞满了我的心,这些辗转反复无法入眠的夜晚给了我一些不一样的感觉,让我觉得,有些事,既然决定了就要做完,哪怕只有孤独伴随。我很喜欢的一句话,送给我自己,也送给所有那些心中有未完成梦想的人。
正确的事情,什么时候做都不晚。
言归正传,说说这个项目。
策划上这个游戏是要做成横版的动作策略游戏,资源全套用的都是网络上的,冒险岛素材。这是一个召唤怪物出来替你打怪过关的游戏,点击下方的怪物卡牌,就会召唤出相应的士兵,这些士兵具有一定程度的AI,会自动锁定攻击最近的怪物,能根据你输入的策略符文改变打法,能触发技能,技能触发之后士兵头上会显示一个技能的图标,点击之后就能发出技能。召唤士兵和使用技能都要用能量,能量系统类似于植物大战僵尸,需要在其产生后手动点击收集,战斗中杀死敌人也会得到能量。士兵的技能可以通过配置画面更换,士兵的属性也可以提升,总之就是一款正宗的横版过关手游。然而这只是我脑子中的想法,并没有写成策划案,系统是想到哪写到哪。说说代码吧,整个项目的继承树由CGameObjectAbstract基类开始衍生,继承出CGameImageObject负责具有渲染的子类,CGameComponentObject负责没有渲染的功能,图形接口类总有CGameMonster,CGameSoidier等等。
主要使用的还是聚合模式,用自己的类封装了cocos2dx的功能。其他使用的设计模式还有工厂方法,单例,策略,桥接等等乱七八糟的都在用。先看自己抽象的CGameInstance类,涌来封装整个游戏的启动逻辑。
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::
CGameInstanceIOS(const CGameInstanceIOS& rhs)
const CGameInstanceIOS& operator=(const CGameInstanceIOS& rhs)
virtual ~CGameInstanceIOS()
std::cout<<"CGameInstance is destory"<<std::
static CGameInstanceIOS * sharedGameInstanceIOS();
virtual void InitGameInstance();
virtual void InitGameSetting();
virtual void CleareGameInstance();
virtual void PauseGameInstance();
virtual void ResumeGameInstance();
virtual void StartRunGameInstance();
CCScene * m_pGameS
CGameInstance.cpp
RPGMapstory
Created by Ling Dong on 13-9-4.
Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
#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 theGameI
return theGameI
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 "cocos2d.h"
using namespace cocos2d;
class CGameScene:public CCLayer
CGameScene()
std::cout<<"CGameScene is create"<<std::
virtual ~CGameScene()
std::cout<<"CGameScene is destory"<<std::
static CCScene * GetScene();
virtual bool init();
CREATE_FUNC(CGameScene);
void InitGameScene();
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 = P
CCPoint GetTouchPoint()const
return m_TouchP
void Func()
m_iGameRuningStateV
m_bIsNeedLoadR
m_bHasSaveD
std::string
m_szCurrentMapN
然后是自己定义的所有数据结构。】
代码错了问题 重新贴一下
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::
CGameInstanceIOS(const CGameInstanceIOS& rhs)
const CGameInstanceIOS& operator=(const CGameInstanceIOS& rhs)
virtual ~CGameInstanceIOS()
std::cout&&"CGameInstance is destory"&&std::
static CGameInstanceIOS * sharedGameInstanceIOS();
virtual void InitGameInstance();
virtual void InitGameSetting();
virtual void CleareGameInstance();
virtual void PauseGameInstance();
virtual void ResumeGameInstance();
virtual void StartRunGameInstance();
CCScene * m_pGameS
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 theGameI
return theGameI
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
CGameScene()
std::cout&&"CGameScene is create"&&std::
virtual ~CGameScene()
std::cout&&"CGameScene is destory"&&std::
static CCScene * GetScene();
virtual bool init();
CREATE_FUNC(CGameScene);
void InitGameScene();
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 = P
CCPoint GetTouchPoint()const
return m_TouchP
void Func()
m_iGameRuningStateV
m_bIsNeedLoadR
m_bHasSaveD
std::string
m_szCurrentMapN
CGameScene用来封装游戏流程
CGameScene.cpp
RPGMapstory
Created by Ling Dong on 13-9-4.
Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
#include &iostream&
#include &fstream&
#include "CGameScene.h"
#include "cocos2d.h"
#include "CGameDataStruct.h"
#include "CGameInstanceIOS.h"
#include "CGameDataManager.h"
#include "CGameSceneManager.h"
#include "CGameDamegeSystem.h"
#include "CGameResourceManager.h"
#include "CGameDataLibrary.h"
#include "CGameMonster.h"
#include "CGameAnimationManager.h"
#include "CGameSoldier.h"
#include "CGameTitle.h"
static CGameScene * pGameScene = NULL;
using namespace cocos2d;
CGameScene * GetGameScene()
return pGameS
CCScene * CGameScene::GetScene()
CCScene * pScene = CCScene::create();
CGameScene * pGameScene = CGameScene::create();
pScene-&addChild(pGameScene);
bool CGameScene::init()
if(!CCLayer::init())
InitGameScene();
void CGameScene::InitGameScene()
schedule(schedule_selector(CGameScene::RunGameWithFrame));
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_LOGO);
setTouchEnabled(true);
CCDirector::sharedDirector()-&getTouchDispatcher()-&addTargetedDelegate(this,0,false);
pGameScene
m_bIsNewGame
m_bHasSaveData
m_bFirstProtect
m_bIsNeedLoadResource
void CGameScene::RunGameWithFrame()
int iGameStateValue = CGameInstanceIOS::sharedGameInstanceIOS()-&GetGameStateValue();
switch(iGameStateValue)
case GAME_STATE_LOGO:
OnGameLogoAnimation();
case GAME_STATE_TITLE:
OnGameTitle();
case GAME_STATE_SELECT:
OnGameSelectScene();
case GAME_STATE_CONFIGURATION:
OnGameConfiguration();
case GAME_STATE_LOGIC:
OnGameSceneLogic();
case GAME_STATE_PAUSE:
case GAME_STATE_RESUME:
void CGameScene::OnGameTitle()
if(m_bTitleProtect == false)
m_bTitleProtect =
CGameTitle::sharedTitle();
CGameTitle::sharedTitle()-&DrawGameObject();
if(m_bHasTouch)
CGameTitle::sharedGameTitle()-&EndTitileScreen();
if(CGameSceneManager::sharedSceneManager()-&ShowSwitchSceneScreen() == true)
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_SELECT);
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_SELECT);
void CGameScene::OnGameLogoAnimation()
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_TITLE);
void CGameScene::OnGameSceneLogic()
CGameDataManager * pData = CGameDataManager::sharedDataManager();
CGameResourceManager * pResManager = CGameResourceManager::sharedGameRerourceMnager();
if(!m_bFirstProtect)
bool bIsNeedNewData = CGameDataManager::sharedDataManager()-&GetIsNeedNewSaveData();
PrintMessage("bIsNeedNewData not find");
if(bIsNeedNewData)
CGameDataManager::sharedDataManager()-&CreateNewSaveData();
CGameDataManager::sharedDataManager()-&LoadGameData();
//pMonster-&MoveMonsterByRange(ORIENTATION_LEFT, 40);
m_bFirstProtect =
if(m_bIsNeedLoadResource)
m_bIsNeedLoadResource =
//load resource
//根据配置文件创建所有地图,怪物,角色,事件等等。
CGameSceneManager * pSceneManager = CGameSceneManager::sharedSceneManager();
string szCurrentScene = pData-&GetCurrentSceneName();
pResManager-&LoadFirstData();
pSceneManager-&CreateNPCByIndex();
pSceneManager-&CreatePlayerControlBuIndex();
pSceneManager-&CreateMapByIndex();
pSceneManager-&CreateAudioByIndex();
pSceneManager-&CreateEventMachine();
pSceneManager-&CreateEnemyByIndex();
pSceneManager-&CreateNPCByIndex();
pSceneManager-&CreateUIByIndex();
//pSceneManager-&CreateSummonSystemByIndex();
CGameDataManager * pData = CGameDataManager::sharedDataManager();
UNION_KEYVALUE_TYPE
a.ValueInteger = 12;
pData-&SaveDataByKeyValue(VALUE_TYPE_INT, "MonsterID", a);
int b = pData-&GetDataByValueKey(VALUE_TYPE_INT, "MonsterID").ValueI
CGameSoidler * ps = CGameSoidler::CreateSoidlerByID("Soidier_ChaZiBing");
ps-&SetGameObjectPosition(500, 500);
CGameSceneManager::sharedSceneManager()-&AddSoidierToList(ps);
CGameSceneManager::sharedSceneManager()-&DrawGameMonsterModule();
CGameSceneManager::sharedSceneManager()-&DrawGameMapModlue();
CGameSceneManager::sharedSceneManager()-&DrawGameUIModule();
CGameSceneManager::sharedSceneManager()-&DrawGameDropModule();
CGameSceneManager::sharedSceneManager()-&DrawGameNPCModule();
CGameSceneManager::sharedSceneManager()-&RunTouchGame();
CGameDamegeSystem::sharedDamegeSystem()-&DrawGameObject();
CGameSceneManager::sharedSceneManager()-&DrawSoidierModule();
//CGameSceneManager::sharedSceneManager()-&DrawSummonSystemMoudle();
bool WaitingSec(int iSec)
static bool bCanNewTime =
static long long iLastTime = 0;
if(bCanNewTime)
bCanNewTime =
iLastTime = GetCurrentMSec();
if(GetCurrentMSec() - iLastTime & iSec *1000)
bCanNewTime =
bool CGameScene::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
GetGameScene()-&SetTouchPoint( pTouch-&getLocation());
Point = pTouch-&getLocation();
cout&&"point.x "&&Point.x&&
cout&&"Point.y "&&Point.y&&
static int i = 1;
CGameSoidler * pSoidier = CGameSceneManager::sharedSceneManager()-&GetStackTopSoidier();
if(pSoidier-&GetIsInRect(Point))
pSoidier-&SetSoidlerAnimationState(i++);
if(m_iGameRuningStateValue == GAME_STATE_TITLE)
m_bHasTouch =
CGameDamegeSystem::sharedDamegeSystem()-&ShowDamegeNumber(500+i , Point, DAMEGE_TYPE_CRUSH);
void CGameScene::OnGameConfiguration()
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_LOGIC);
void CGameScene::OnGameSelectScene()
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_CONFIGURATION);
void CGameScene::OnGamePause()
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_PAUSE);
void CGameScene::OnGameResume()
CGameInstanceIOS::sharedGameInstanceIOS()-&SetGameStateValue(GAME_STATE_RESUME);
void CGameScene::CleareGameScene()
CGameDataStruct 定义了所有的游戏数据结构
CGameDataStruct.h
RPGMapstory
Created by Ling Dong on 13-4-14.
Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
#ifndef RPGMapstory_CGameDataStruct_h
#define RPGMapstory_CGameDataStruct_h
#include &iostream&
#include &vector&
#include "cocos2d.h"
using namespace cocos2d;
extern void PrintMessage(const string& szMessage);
extern bool WaitingSec(int iSec);
static bool CANPRINT = 1;
当前的怪物ID
Monster_JiaYang
Monster_HongWoNiu
Monster_WanJuXiong
Monster_BaiXueRen
Monster_LanLing
Monster_PangXieBing
Monster_TuZiBing
Monster_ZhaoHuanShi
Monster_DaTuZiBing
Monster_DunPaiBing
Monster_HongDaFa
Monster_HuoFa
Monster_LanChui
Monster_LanLangFu
typedef unsigned int UINT;
class CGameS
const int VALUE_TYPE_STRING = 1;
const int VALUE_TYPE_INT = 2;
const int VALUE_TYPE_DOUBLE = 3;
const int VALUE_TYPE_BOOL = 4;
const int VALUE_TYPE_FLOAT = 5;
const int MAP_INDEX_CITY = 1;
const int MAP_INDEX_COUNTRY = 2;
const int GAME_STATE_START_RUN = 1;
const int GAME_STATE_NEW_GAME = 2;
const int GAME_STATE_PAUSE = 3;
const int GAME_STATE_RESUME = 4;
const int GAME_STATE_TITLE = 5;
const int GAME_STATE_LOGO = 6;
const int GAME_STATE_LOGIC = 7;
const int GAME_STATE_SELECT = 8;
const int GAME_STATE_CONFIGURATION = 9;
const float GAME_INTERVAL = 1.0/60;
const float GAME_TRANS_INTERVAL = 1;
/** 主角纸娃娃系统各部位的偏移值,基于主角坐标
const int OFFSET_HEAD_X = 1;
const int OFFSET_HEAD_Y = 25;
const int OFFSET_FACE_X = -2;
const int OFFSET_FACE_Y = 25;
const int OFFSET_BODY_X = 0;
const int OFFSET_BODY_Y = 0;
const int OFFSET_HAIR_X = -1;
const int OFFSET_HAIR_Y = 39;
const int OFFSET_TOP_1HWEAPONSWING_X = -1;
const int OFFSET_TOP_1HWEAPONSWING_Y = 3;
const int OFFSET_BOTTOM_X = -3;
const int OFFSET_BOTTOM_Y = 3;
const int OFFSET_SHOES_X = -1;
const int OFFSET_SHOES_Y = 0;
const int OFFSET_CAPES_X = 0;
const int OFFSET_CAPES_Y = 0;
const int OFFSET_GLOUES_X = -2;
const int OFFSET_GLOUES_Y = 8;
const int OFFSET_HAT_X = -1;
const int OFFSET_HAT_Y = 41;
const int OFFSET_SHIELD_X = -9;
const int OFFSET_SHIELD_Y = 0;
const int OFFSET_TOP_WALKING1_X = 1;
const int OFFSET_TOP_WALKING1_Y = 5;
const int CHARACTAR_INIT_ATTACK = 10;
const int CHARACTAR_INIT_DEFINESE = 10;
const int CHARACTAR_INIT_LEVEL = 1;
const int CHARACTAR_INIT_LIFE = 100;
const int CHARACTAR_INIT_MANA = 100;
/** 主角各部位的深度值
const int EQUIPMENT_DEEP_GLOUES = 100;
const int EQUIPMENT_DEEP_WEAPON_BLADE = EQUIPMENT_DEEP_GLOUES - 1;
const int EQUIPMENT_DEEP_WEAPON_HANDLE = EQUIPMENT_DEEP_GLOUES - 2;
const int EQUIPMENT_DEEP_HAT = EQUIPMENT_DEEP_GLOUES - 3;
const int EQUIPMENT_DEEP_HAIR = EQUIPMENT_DEEP_GLOUES - 4;
const int EQUIPMENT_DEEP_FACE = EQUIPMENT_DEEP_GLOUES - 5;
const int EQUIPMENT_DEEP_HEAD = EQUIPMENT_DEEP_GLOUES - 6;
const int EQUIPMENT_DEEP_SHOES = EQUIPMENT_DEEP_GLOUES - 7;
const int EQUIPMENT_DEEP_BOTTOM = EQUIPMENT_DEEP_GLOUES - 8;
const int EQUIPMENT_DEEP_TOP = EQUIPMENT_DEEP_GLOUES - 9;
const int EQUIPMENT_DEEP_SHIELD = EQUIPMENT_DEEP_GLOUES - 13;
const int EQUIPMENT_DEEP_CAPES = EQUIPMENT_DEEP_GLOUES - 11;
const int EQUIPMENT_DEEP_BODY = EQUIPMENT_DEEP_GLOUES - 12;
const float DEFAULT_ANIMATION_DELAY = 0.12;
const float MONSTER_ANIMATION_DELAY = 0.12;
const float EQU_ANIMATION_DELAY = 0.13;
const float EFFECT_ANIMATION_DELAY = 0.1;
const int DEFAULT_ANIMAITON_LOOPS = -1;
const int MONSTER_ANIMATION_LOOPS = -1;
const int EQU_ANIMATION_LOOPS = -1;
const int EFFECT_ANIMATION_LOOPS = -1;
const int MONSTER_ORIENTATION_LEFT = 1;
const int MONSTER_ORIENTATION_RIGHT = 2;
const int DEEP_MONSTER = 50;
const int DEEP_UI = 150;
const int DEEP_MAP = 40;
const int ORIENTATION_DOWN = 4;
const int ORIENTATION_UP = 2;
const int ORIENTATION_LEFT = 0;
const int ORIENTATION_RIGHT = 1;
const int MONSTER_EVENT_MOVE_LEFT = 0;
const int MONSTER_EVENT_MOVE_RIGHT = 1;
const int MONSTER_EVENT_MOVE_STAND = 2;
const int MONSTER_EVENT_ATTACKA = 3;
const int MONSTER_TYPE_NORMAL = 1;
const int MONSTER_TYPE_BOSS = 2;
const int DAMEGE_TYPE_NORMAL = 1;
const int DAMEGE_TYPE_CRUSH = 2;
const int SCROLL_TYPE_NORMAL = 1;
const int SOLIDER_ANIMATION_STATE_ATTACK = 1;
const int SOLIDER_ANIMATION_STATE_MOVE = 2;
const int SOLIDER_ANIMATION_STATE_STAND = 3;
const int SOLIDER_ANIMATION_STATE_DIE = 4;
const int SOLIDER_ANIMATION_STATE_HIT = 5;
enum enumMonsterState
MONSTER_STATE_STAND = 1,
MONSTER_STATE_MOVE,
MONSTER_STATE_DIE,
MONSTER_STATE_ATTACKA,
MONSTER_STATE_MOVE_LEFT,
MONSTER_STATE_MOVE_RIGHT,
MONSTER_STATE_HIT
enum enumEquipmentPart
EQU_PART_TOP = 1,
EQU_PART_BOTTOM,
EQU_PART_HAT,
EQU_PART_HEAD,
EQU_PART_FACE,
EQU_PART_HAIR,
EQU_PART_BODY,
EQU_PART_GLOUES,
EQU_PART_SHOES,
EQU_PART_SINGLE_WEAPON,
EQU_PART_SHIELD,
enum enumAnimationType
ANIMATION_TYPE_MONSTER = 1,
ANIMATION_TYPE_EQU,
ANIMATION_TYPE_EFFECT
enum enumAnimationFlags
FLAGS_STANDING = 1,
FLAGS_WALKINGA,
FLAGS_HIT,
FLAGS_ALERT,
FLAGS_JUMP,
FLAGS_DIE,
typedef struct TagAnimationStruct
AnimationFrameC
AnimationID;
AnimationFrontN
AnimaitonResourceImageN
AnimationResourcePlistN
AnimationT
AnimationF
vector&string&
AnimationFrameNameV
}STRUCT_ANIMATION,*STRUCT_ANIMTIONP;
/** 动画数据结构体,该结构包含所有动画的描述信息,所有动画都拥有一个此结构体描述
* - AnimationID
动画id,根据该id查找其他信息。
* - AnimationFrontName
动画前缀,根据该前缀获取所有与此动画相似的其他动画。
* - AnimationResourceImageName 动画所在资源文件名
* - AnimaitonResourcePlistName 动画描述文件名
* - AnimaitonFrameNameVec
该动画所有的的帧的名字容器。
* - AnimationFrameCount
该动画的帧的数量
typedef struct TagSaveDataStruct
string ValueS
string KeyS
}STRUCT_SAVEDATA,*STRUCT_SAVEDATAP;
typedef union unKeyValueType
const char
}UNION_KEYVALUE_TYPE;
typedef struct TagKeyValueStruct
const char * ValueS
UNION_KEYVALUE_TYPE unKeyV
}STRUCT_KEYVALUE,*STRUCT_KEYVALUEP;
/** 键值对结构体,用于存储所有经由ResourceManager对象获取的数据。
* - KeyString 关键字字符串,通过该串查找值
* - ValueString 值字符串,获得后根据具体情况转换为其他类型。
typedef struct TagResourceLoadStruct
CurrentMapN
CurrentMapPlistN
CurrentMonsterPlistN
CurrentBGM;
CurrentNPCPlistN
CurrentMapImageN
}STRUCT_RESLOAD,*STRUCT_RESLOADP;
/** 当前地图所需要的资源名称结构
enum enumOrientation
RightDown,
typedef union unMonsterDataType
const char*
}UNION_MONSTERDATA_TYPE;
typedef struct TagMonsterKeyValue
string KeyS
UNION_MONSTERDATA_TYPE unV
}STRUCT_MONSTER_KEY_VALUE;
typedef struct TagMonsterDataKeyValueStrucnt
string KeyS
string ValueS
}STRUCT_MONSTER_DATA_KEYVALUE;
typedef struct TagMonsterDataStrcut
vector&int&
MonsterItemV
MonsterSpeedV
MonsterAttackV
MonsterItemN
MonsterDefenseV
MonsterMoveH
MonsterMoveW
MonsterStandH
MonsterStandW
MonsterDieW
MonsterDieH
MonsterAttackAH
MonsterAttackAW
MonsterHitW
MonsterHitH
MonsterSkillN
MonsterExpV
MonsterHPV
vector&STRUCT_MONSTER_KEY_VALUE& KeyValueV
}STRUCT_MONSTER_DATA,*STRUCT_MONSTER_DATAP;
typedef struct TagDamegeStruct
CCLabelBMFont * DamegeL
}STRUCT_DAMEGE,* STRUCT_DAMEGEP;
typedef struct TagBrickStruct
int BrickPointX;
int BrickPointY;
int BrickI
}STRUCT_BRICK,* STRUCT_BRICKP;
typedef struct TagMapStruct
vector&STRUCT_BRICK&
}STRUCT_MAP,* STRUCT_MAPP;
extern CGameScene * GetGameScene();
extern long long GetCurrentMSec();
baseball11:
自己写游戏真难啊,支持下
关键是坚持下来
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

 

随机推荐