当前位置:  编程技术>移动开发
本页文章导读:
    ▪CCScale9Sprite跟CCControlButton        CCScale9Sprite和CCControlButton在2dx下用到了android下的.9.png图片,下面是原图    查了一下2dx里有CCScale9Sprite,直接贴上背景图,毫无问题, CCSize bgRect = CCSizeMake(size.width,size.height/3); CCScale9Sprite *bac.........
    ▪ 寨子腾讯“爱消除”游戏7日教程-DAY2        山寨腾讯“爱消除”游戏7日教程--DAY2 【课程内容】 今天我们将利用昨天搭建好得游戏框架来实现一个简单的动画效果。 【源代码下载地址】http://download.csdn.net/detail/elong_2009/6444787 1、动画.........
    ▪ Tiny210 U-BOOT(10)-DDR2初始化顺序       Tiny210 U-BOOT(十)----DDR2初始化顺序现在网上的S5PV210的u-boot源码中关于内存的初始化过程,基本上我没有找到任何资料有过分析DDR2的内存初始化代码的。在看u-boot的这段代码时,也徘徊了很久,.........

[1]CCScale9Sprite跟CCControlButton
    来源: 互联网  发布时间: 2014-02-18
CCScale9Sprite和CCControlButton

在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;
	}
}








    
[2] 寨子腾讯“爱消除”游戏7日教程-DAY2
    来源: 互联网  发布时间: 2014-02-18
山寨腾讯“爱消除”游戏7日教程--DAY2


【课程内容】

今天我们将利用昨天搭建好得游戏框架来实现一个简单的动画效果。

【源代码下载地址】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();        

     }

    }

 

最后的效果如下图:

 

 

 


    
[3] Tiny210 U-BOOT(10)-DDR2初始化顺序
    来源: 互联网  发布时间: 2014-02-18
Tiny210 U-BOOT(十)----DDR2初始化顺序

现在网上的S5PV210的u-boot源码中关于内存的初始化过程,基本上我没有找到任何资料有过分析DDR2的内存初始化代码的。在看u-boot的这段代码时,也徘徊了很久,不知道如下手,很多文章或资料都将这一段分析过程有意无意的隐藏掉了,最多也只是提一下说参考裸板的代码,在找不到任何资料的情况下,我只能依靠芯片手册上,三星在内存控制器这一章,写的关于DDR2的初始化顺序的28个步骤来一条一条去读去看,在安静下来看了芯片手册以后,我发现三星给的裸板的DDR初始化代码和芯片手册上的初始化步骤完全一致,有的时候,最好的资料其实就在手边,只是我一直在想着找捷径,学习哪有那么多捷径?


现在开始关注一下芯片手册上关于DDR2的初始化流程,P598页:

1.查看芯片手册DDR2的初始化顺序

Initialization sequence for DDR2 memory type
1.  To provide stable power for controller and memory device, the controller must assert and hold CKE to a logic low level. Then apply stable clock. Note: XDDR2SEL should be High level to hold CKE to low. 
2. Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_incbit-fields to correct value according to clock frequency. Set the PhyControl0.ctrl_dll_onbit-field to ‘1’ to turn on the PHY DLL. 
3. DQS Cleaning: Set the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetcbit-fields to correct value according to clock frequency and memory tAC parameters. 
4. Set the PhyControl0.ctrl_start bit-field to ‘1’.  
5. Set the ConControl. At this moment, an auto refresh counter should be off.  
6. Set the MemControl. At this moment, all power down modes should be off. 
7. Set the MemConfig0 register. If there are two external memory chips, set the MemConfig1 register. 
8. Set the PrechConfigand PwrdnConfigregisters. 
9. Set the TimingAref, TimingRow, TimingDataand TimingPower registers according to memory AC parameters. 
10. If QoS scheme is required, set the QosControl0~15and QosConfig0~15registers. 
11. Wait for thePhyStatus0.ctrl_lockedbit-fields to change to ‘1’. Check whether PHY DLL is locked. 
12. PHY DLL compensates the changes of delay amountcaused by Process, Voltage and Temperature (PVT) variation during memory operation. Therefore, PHY DLL should not be off for reliable operation. It can be off except runs at low frequency. If off mode is used, set thePhyControl0.ctrl_forcebit-field to correct value according to thePhyStatus0.ctrl_lock_value[9:2]bit-field to fix delay amount. Clear the PhyControl0.ctrl_dll_on bit-field to turn off PHY DLL. 
13. Confirm whether stable clock is issued minimum 200us after power on 
14. Issue a NOPcommand using the DirectCmdregister to assert and to hold CKE to a logic high level.
15. Wait for minimum 400ns. 
16. Issue a PALL command using the DirectCmd register. 
17. Issue an EMRS2 command using the DirectCmd register to program the operating parameters. 
18. Issue an EMRS3 command using the DirectCmd register to program the operating parameters. 
19. Issue an EMRS command using the DirectCmd register to enable the memory DLLs. 
20. Issue a MRS command using the DirectCmd register to reset the memory DLL. 
21. Issue a PALL command using the DirectCmd register. 
22. Issue two Auto Refreshcommands using the DirectCmd register. 
23. Issue a MRS command using the DirectCmd register to program the operating parameters without resetting the memory DLL. 
24. Wait for minimum 200 clock cycles. 
25. Issue an EMRS command using the DirectCmd register to program the operating parameters. If OCD calibration is not used, issue an EMRS command to set OCD Calibration Default. After that, issue an EMRS command to exit OCD Calibration Mode and to program the operating parameters. 
26. If there are two external memory chips, perform steps 14~25 for chip1 memory device. 
27. Set the ConControlto turn on an auto refresh counter. 
28. If power down modes is required, set the MemControl registers. 

译文如下:
1. 提供稳压电源给内存控制器和内存芯片,内存控制器必须保持CLE在低电平,此时就会提供稳压电源。注:当CKE引脚为低电平时,XDDR2SEL应该处于高电平
2. 依照时钟频率正确配置PhyControl0.ctrl_start_point和PhyControl0.ctrl_incbit-fields的值。配置的PhyControl0.ctrl_dll_on值为'1'以打开PHY DLL。
3. DQS Cleaning:依照时钟频率和内存的tAC参数正确设置PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetcbit-fields位的值。
4. 配置PhyControl0.ctrl_start位的值为'1'
5. 配置ConControl,与此同时,auto refresh自动刷新计数器应该关闭
6. 配置MemControl,与此同时,所有的power down(休眠模式)应该闭关
7. 配置MemConfig0寄存器。如果有两组内存芯片(比如有8片DDR,这8片DDR是分别挂在Memory Port1和Memory Port2上),再配置MemConfig1寄存器。
8. 配置PrechConfig和PwrdnConfig寄存器
9. 依照内存的tAC参数配置TimingAref, TimingRow, TimingData和TimingPower寄存器
10. 如果需要QoS标准,配置QosControl0~15和QosConfig0~15r寄存器
11. 等待PhyStatus0.ctrl_locked位变为'1'。检查是否PHY DLL是否已锁
12. PHY DLL补偿在内存操作时由PVT(Process, Voltage and Temperature,处理器、电压和温度)变化引起的延迟量。但是,PHY DLL不能因某些可靠的内存操作而切断,除非是工作在低频率下。如果关闭PHY DLL,依照PhyStatus0.ctrl_lock_value[9:2]位的值正确配置PhyControl0.ctrl_force位的值来弥补延迟量(fix delay amount)。清除PhyControl0.ctrl_dll_on位的值来关闭PHY DLL。
13. 上电后,确定最小值为200us的稳定时钟是否发出
14. 使用DirectCmd寄存器发出一个NOP命令,保证CKE引脚为高电平
15. 等最小400ns
16. 使用DirectCmd寄存器发出一个PALL命令
17. 使用DirectCmd寄存器发出一个EMRS2命令,program操作参数
18. 使用DirectCmd寄存器发出一个EMRS3命令,program操作参数
19. 使用DirectCmd寄存器发出一个EMRS命令来使能内存DLLs
20. 使用DirectCmd寄存器发出一个MRS命令,重启内存DLL
21. 使用DirectCmd寄存器发出一个PALL命令
22. 使用DirectCmd寄存器发出两个Auto Refresh(自动刷新)命令
23. 使用DirectCmd寄存器发出一个MRS命令,program操作参数,不要重启内存DLL
24. 等待最小200时钟周期
25. 使用DirectCmd寄存器发出一个EMRS命令给程序的运行参数。如果OCD校正(Off-Chip Driver,片外驱动调校)没有使用,改善一个EMRS命令去设置OCD校准的默认值。在此之后,发送一个EMRS指令去退出OCD校准模式,继续program操作参数
26. 如果有两组DDR芯片,重复14-25步配置chip1的内存,刚刚配置的是chip0,也就是第一组内存芯片
27. 配置ConControlto来打开自动刷新计数器
28. 如果需要power down(休眠)模式,配置MemControl寄存器.


知道了上面的这些初始化步骤,现在再去看三星给的裸板代码中关于SDRAM的BL1的代码,就比较清楚了。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
数据库 iis7站长之家
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3