游戏开发之旅第五章

1、创建工程

main函数里面的:要设置尺寸,根据图片的大小来设置:eglView->setFrameSize(800, 500);

遇到一个问题是,图片800*500,但是窗口显示的是1024*768;这里需要看AppDelegate类里面的

bool AppDelegate::applicationDidFinishLaunching() {
pDirector->setContentScaleFactor(MIN(mediumResource.size.height / designResolutionSize.height, mediumResource.size.width / designResolutionSize.width));
}

设置实际显示窗口的大小。

因为游戏里面是帧的概念,类似于一张图片一张图片地播放,给人感觉是正常的在动。

所以这里要设置每秒要播放多少帧pDirector->setAnimationInterval(1.0 / 60);

每张图片的构成是通过程序将所有图片,按照自己的意愿的层次叠加最终显示的一张图片展示给玩家看的。

 

2、创建对象

cocos里面的每个对象都是通过静态的create函数进行创建的;这个create函数是官方定义的模板如下

复制代码
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}
复制代码

如上所示对象被创建之后会调用返回bool类型的init函数,所以当构造对象的时候需要创建对应的init函数。然后调用一个autorelease函数进行内存自动化管理。但是这里要注意的是程序每播放完一帧则会扫描一遍所有的对象,如果指针的引用计数为0则会自动删除。所以如果要自己进行内存管理的话,需要在创建完成之后调用retain函数将引用计数加1,当调用这个之后记得在不需要这个函数的时候调用release

 

3、控件

需要跟客户进行交互的控件都是CCControlXXXX的方式,可以添加各种事件消息。

如果我这里创建的按钮

复制代码
void TollgateScene::createJumpBtn()
{
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCLabelTTF* jumpTitle = CCLabelTTF::create("jump", "Arial", 35);
    CCScale9Sprite* norBG = CCScale9Sprite::create("button.png");
    CCScale9Sprite* lightBG = CCScale9Sprite::create("buttonHighlighted.png");

    CCControlButton* jumpBtn = CCControlButton::create(jumpTitle, norBG);
    jumpBtn->setPosition(ccp(visibleSize.width - 80, 50));
    jumpBtn->setBackgroundSpriteForState(lightBG, CCControlStateHighlighted);
    jumpBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(TollgateScene::jumpEvent), CCControlEventTouchDown);
    this->addChild(jumpBtn, 3);
}

void TollgateScene::jumpEvent(CCObject* pSender, CCControlEvent event)
{
    m_player->jump();
}
复制代码

 

有意思的函数:

setAnchorPoint(CCPoint(x, y)); 默认是0.5,0.5,即表示所指定位置的中间;(0,0)表示左下角,(1,0)表示左上角,(1,1)右下角。

当要显示文本的时候可以通过指定pos,然后再通过这个函数来指定文本是靠向哪一边。

 

事件的组合:

复制代码
    CCMoveBy* mback = CCMoveBy::create(0.1f, CCPoint(-20, 0));
    CCMoveBy* mforword = CCMoveBy::create(0.1f, CCPoint(20, 0));
    CCRotateBy* rback = CCRotateBy::create(0.1f, -5, 0);
    CCRotateBy* rforword = CCRotateBy::create(0.1f, 5, 0);

    CCSpawn* sback = CCSpawn::create(mback, rback, NULL);
    CCSpawn* sforword = CCSpawn::create(mforword, rforword, NULL);

    CCSequence* sequeue = CCSequence::create(sback, sforword, NULL);

    stopAllActions(); // 清理上次留下的action
    //resetData();
    this->runAction(sequeue);
复制代码

如上所示,事件的组合方式可以是合并,也可以是队列。

 

posted @   LCAC  阅读(153)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示