在2dx下用到了android下的.9.png图片,下面是原图
查了一下2dx里有CCScale9Sprite,直接贴上背景图,毫无问题,
CCSize bgRect = CCSizeMake(size.width,size.height/3); CCScale9Sprite *background = CCScale9Sprite::create("dialog_bg.png"); background->setContentSize(bgRect); background->setPosition(ccp(bgRect.width/2,-bgRect.height/2)); this->addChild(background,5);然后按钮里也需要用到这个素材图,拉伸图片到我们需要的,用到了CCControlButton
CCLabelTTF *title1 = CCLabelTTF::create("拍照", "Marker Felt", 30); CCControlButton* btn_takephoto = CCControlButton::create(title1,CCScale9Sprite::create("dialog_normal.png")); /* 设置按钮按下时的图片 */ btn_takephoto->setBackgroundSpriteForState(CCScale9Sprite::create("dialog_pressed.png"), CCControlStateSelected); btn_takephoto->setPosition(ccp(bgRect.width/2,bgRect.height/5*4)); btn_takephoto->setPreferredSize(btnRect); btn_takephoto->addTargetWithActionForControlEvents(this, cccontrol_selector(DialogPhoto::MenuItemCallback), CCControlEventTouchUpInside); background->addChild(btn_takephoto);当然也可以用CCMenuItemSprite
CCScale9Sprite* sp1 = CCScale9Sprite::create("dialog_normal.png"); sp1->setContentSize(btnRect); CCScale9Sprite* sp2 = CCScale9Sprite::create("dialog_pressed.png"); sp2->setContentSize(btnRect); CCMenuItemSprite* btn_takephoto = CCMenuItemSprite::create(sp1,sp2,this,menu_selector(DialogShare::MenuItemCallback)); btn_takephoto->setPosition(ccp(bgRect.width/2,bgRect.height/5*4)); btn_takephoto->setTag(DialogTakePhoto); CCLabelTTF* pLabel1 = CCLabelTTF::create("拍照", "Arial", 20); pLabel1->setColor(ccc3(0, 0, 0)); pLabel1->setPosition(ccp(btnRect.width/2,btnRect.height/2)); btn_takephoto->addChild(pLabel1);
m_pMenu = CCMenu::create(btn_takephoto,btn_photoalbum,btn_cancel, NULL); m_pMenu->setPosition(CCPointZero); background->addChild(m_pMenu);
下面就是我们所需的效果
#pragma once #include "cocos2d.h" #include "HelloWorldScene.h" #include "cocos-ext.h" USING_NS_CC_EXT; USING_NS_CC; class DialogShare: public CCLayerColor { // 模态对话框菜单 CCMenu *m_pMenu; // 记录菜单点击 bool m_bTouchedMenu; public: DialogShare(); ~DialogShare(); static cocos2d::CCScene* scene(); virtual bool init(); // 初始化对话框内容 void initDialog(); CREATE_FUNC(DialogShare); void onEnter(); void onExit(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); void MenuItemCallback(CCObject *pSender); };
#include "DialogShare.h" #include "HelloWorldScene.h" enum { DialogTakePhoto, DialogPhotoAlbum, DialogCancel, }; CCScene* DialogShare::scene() { CCScene *scene = CCScene::create(); DialogShare *layer = DialogShare::create(); scene->addChild(layer); return scene; } DialogShare::DialogShare() { } DialogShare::~DialogShare() { } bool DialogShare::init() { bool bRet = false; do { CC_BREAK_IF(!CCLayerColor::initWithColor(ccc4(0, 0, 0, 125))); this->initDialog(); bRet = true; } while (0); return bRet; } void DialogShare::initDialog() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSize bgRect = CCSizeMake(size.width,size.height/3); CCScale9Sprite *background = CCScale9Sprite::create("dialog_bg.png"); background->setContentSize(bgRect); background->setPosition(ccp(bgRect.width/2,-bgRect.height/2)); this->addChild(background,5); CCSize btnRect = CCSizeMake(bgRect.width/2,bgRect.height/5); CCScale9Sprite* sp1 = CCScale9Sprite::create("dialog_normal.png"); sp1->setContentSize(btnRect); CCScale9Sprite* sp2 = CCScale9Sprite::create("dialog_pressed.png"); sp2->setContentSize(btnRect); CCMenuItemSprite* btn_takephoto = CCMenuItemSprite::create(sp1 ,sp2,this,menu_selector(DialogShare::MenuItemCallback)); btn_takephoto->setPosition(ccp(bgRect.width/2,bgRect.height/5*4)); btn_takephoto->setTag(DialogTakePhoto); CCLabelTTF* pLabel1 = CCLabelTTF::create("拍照", "Arial", 20); pLabel1->setColor(ccc3(0, 0, 0)); pLabel1->setPosition(ccp(btnRect.width/2,btnRect.height/2)); btn_takephoto->addChild(pLabel1); CCScale9Sprite* sp3 = CCScale9Sprite::create("dialog_normal.png"); sp3->setContentSize(btnRect); CCScale9Sprite* sp4 = CCScale9Sprite::create("dialog_pressed.png"); sp4->setContentSize(btnRect); CCMenuItemSprite* btn_photoalbum = CCMenuItemSprite::create(sp3 ,sp4,this,menu_selector(DialogShare::MenuItemCallback)); btn_photoalbum->setPosition(ccp(bgRect.width/2,bgRect.height/5*5/2)); btn_photoalbum->setTag(DialogPhotoAlbum); CCLabelTTF* pLabel2 = CCLabelTTF::create("相册中选取", "Arial", 18); pLabel2->setColor(ccc3(0, 0, 0)); pLabel2->setPosition(ccp(btnRect.width/2,btnRect.height/2)); btn_photoalbum->addChild(pLabel2); CCScale9Sprite* sp5 = CCScale9Sprite::create("dialog_cancel_normal.png"); sp5->setContentSize(btnRect); CCScale9Sprite* sp6 = CCScale9Sprite::create("dialog_pressed.png"); sp6->setContentSize(btnRect); CCMenuItemSprite* btn_cancel = CCMenuItemSprite::create(sp5 ,sp6,this,menu_selector(DialogShare::MenuItemCallback)); btn_cancel->setPosition(ccp(bgRect.width/2,bgRect.height/5)); btn_cancel->setTag(DialogCancel); CCLabelTTF* pLabel3 = CCLabelTTF::create("取消", "Arial", 16); pLabel3->setColor(ccc3(0, 0, 0)); pLabel3->setPosition(ccp(btnRect.width/2,btnRect.height/2)); btn_cancel->addChild(pLabel3); m_pMenu = CCMenu::create(btn_takephoto,btn_photoalbum,btn_cancel, NULL); m_pMenu->setPosition(CCPointZero); background->addChild(m_pMenu); background->runAction(CCEaseExponentialOut::create(CCMoveTo::create(0.5f,ccp(bgRect.width/2,bgRect.height/2)))); } void DialogShare::onEnter() { CCLayerColor::onEnter(); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,kCCMenuHandlerPriority-1, true); } void DialogShare::onExit() { CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); CCLayerColor::onExit(); } bool DialogShare::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent); return true; } void DialogShare::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchMoved(pTouch, pEvent); } } void DialogShare::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchEnded(pTouch, pEvent); m_bTouchedMenu = false; } } void DialogShare::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchEnded(pTouch, pEvent); m_bTouchedMenu = false; } } void DialogShare::MenuItemCallback(cocos2d::CCObject *pSender) { CCMenuItemImage* button=(CCMenuItemImage*)pSender; switch (button->getTag()) { case DialogTakePhoto: CCLog("DialogTakePhoto++++++"); break; case DialogPhotoAlbum: CCLog("DialogPhotoAlbum++++++"); break; case DialogCancel: CCLog("DialogCancel++++++"); this->removeFromParentAndCleanup(true); break; } }
【课程内容】
今天我们将利用昨天搭建好得游戏框架来实现一个简单的动画效果。
【源代码下载地址】http://download.csdn.net/detail/elong_2009/6444787
1、动画的简单原理
实现动画的原理很简单,就是利用人眼的视觉暂留,将一系列相差不多的图片按顺序显示,就会在大脑里留下连续动作的印象。
在android中,要实现动画效果,要么通过循环调用canvas.draw系统方法,要么通过调用OpenGL ES中的GLSurfaceView.Renderer实现方法onDrawFrame方法。
canvas画图确实要简单得多,但要实现更好的性能最好还是调用OpenGL ES方法,因为它的性能相对来说要好一些。本课程使用OpenGL ES的方法。
实现动画的关键就是实现GLSurfaceView.Renderer接口内的方法,最重要的一个就是onDrawFrame,这个方法大体的原理是开起一个线程,在此线程内不断的调用onDrawFrame,以实现动画效果。因此onDrawFrame的主要作用就是将不同的图片显示出来就可以了。
2、动画素材
在昨天的课程中,我们将多个素材集中在同一个图片文件中,然后通过设置纹理顶点来获取不同的素材。
今天我们使用另外一种方法。因为,从天天爱消除的res文件夹中,我们能直接得到十张(loading_01.png ~ loading_10.png)用于动画效果的图片,而该图片背景是透明的,用PhotoShop加工时,分辨率不好控制,导致最后显示效果不是很好。
有一点需要注意的是,loading_xx.png的分辨率是280x150,并不是OpenGL ES要求的2的n次方,因此,如果在运行今天的程序时,如果你发现显示不正常,很有可能就是这个原因造成的,你需要手工将图片转换成满足要求的分辨率,如 256x128。不过目前大多数手机都不会受这个约束限制,因此您可能并不会遇到这个问题。但考虑到兼容性,您在获取素材时,还是考虑这个问题比较好!
3、设计渲染类 DrawLoading
DrawLoading 的作用是显示正在加载的动画效果。公共方法draw实现对该动画效果的渲染。
以下是纹理坐标的定义,与昨天的情况不同,由于不需要根据witch来确定纹理顶点坐标,因此给出的定义非常简单:
float textureCoors[]=new float[]//顶点纹理S、T坐标值数组
{
0,0,
0,1,
1,1,
1,1,
1,0,
0,0
};
在draw方法中,通过绑定不同的纹理来实现绘制不同的图片:
gl.glBindTexture(GL10.GL_TEXTURE_2D,textureId[witch]);//为画笔绑定指定ID纹理
4、动画效果控制
如前所述,要实现动画效果,其实就是不停地绘制不同的图片。在DrawLoading 类的构造函数里面,启用了一个线程,每隔100ms对witch进行递增,witch代表了要绘制哪一张图片。这样,在 onDrawFrame 重绘画面时,就会根据witch来渲染,动画效果就出来了。
public DrawLoading(int[] textureId)
{
this.textureId=textureId;
initVertexBuffer(); //根据col,row初始化顶点坐标
initTextureBuffer(); //初始化纹理顶点数据
if (!bThreadRun)//防止重复创建Thread
{
bThreadRun = true;
new Thread()
{
public void run()
{
while(true)
{
try
{
witch++;
if (witch >= 10) witch = 0;
Thread.sleep(100);//休息100ms
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}.start();
}
}
最后的效果如下图:
现在网上的S5PV210的u-boot源码中关于内存的初始化过程,基本上我没有找到任何资料有过分析DDR2的内存初始化代码的。在看u-boot的这段代码时,也徘徊了很久,不知道如下手,很多文章或资料都将这一段分析过程有意无意的隐藏掉了,最多也只是提一下说参考裸板的代码,在找不到任何资料的情况下,我只能依靠芯片手册上,三星在内存控制器这一章,写的关于DDR2的初始化顺序的28个步骤来一条一条去读去看,在安静下来看了芯片手册以后,我发现三星给的裸板的DDR初始化代码和芯片手册上的初始化步骤完全一致,有的时候,最好的资料其实就在手边,只是我一直在想着找捷径,学习哪有那么多捷径?
现在开始关注一下芯片手册上关于DDR2的初始化流程,P598页:
1.查看芯片手册DDR2的初始化顺序
15. 等最小400ns