接着之前的做了一些改动:1、由单个方向改为5个方向(静止0、右1、左2、上3、下4);
2、第一次点击开启自动移动,之后的按钮点击改变方向;
3、精灵移动不出窗口
废话不多说,上代码文件吧。
.h文件
#ifndef __SpriteMove_H__
#define __SpriteMove_H__
#include "cocos2d.h"
using namespace cocos2d;
class SpriteMove :
public CCLayer
{
public:
SpriteMove(void);
~SpriteMove(void);
CREATE_FUNC(SpriteMove);//autorelese构造方法
bool init();//页面初始化方法
CCSprite *m_pSprite;//俺把这个声明成全局的,方便后面该方向,嘿嘿。
int m_iDirection;//表示方向的值1、2、3、4
bool m_bIsClick;//判断是否开启自动更新
void Click(CCObject *pSender);//按钮点击回调
void DirectionChange(int m_iDirection);//改变方向的方法
void update(float dt);//自动更新
};
#endif
.cpp文件
#include "SpriteMove.h"
//构造
SpriteMove::SpriteMove(void)
{
}
//析构
SpriteMove::~SpriteMove(void)
{
}
//页面初始化
bool SpriteMove::init()
{
//首先是的加一个精灵,不然等下拿什么来移动呢- -!
m_pSprite = CCSprite::create("CloseNormal.png");
m_pSprite->setPosition(ccp(m_pSprite->getContentSize().width/2,m_pSprite->getContentSize().height/2));//定到左下角罚站去~~~
addChild(m_pSprite);//为什么要加上去,就不说了吧- -
//既然是通过按钮来控制精灵的移动,那肯定是的有一个按钮的撒~~~
CCMenu *pMenu = CCMenu::create();//按钮要放到菜单里面才能起到按钮的作用的撒,所以……
pMenu->setPosition(CCPointZero);//依旧还是给菜单定个位
addChild(pMenu);//要把菜单加到层上吧,不然怎样知道有菜单呢,是吧~~~
//创建一个按钮-----------没图片咯,那就来一堆关机按钮吧~~~
CCMenuItemImage *pButton = CCMenuItemImage::create(//创建一个CCMenuItemImage按钮,又是create方法呢,autorelease哦,哈哈~~
"CloseNormal.png",//通常情况下显示这个png,NormalImage咯
"CloseSelected.png",//被点了就会变成这个png的,SelectedImage,嗯,很明显的单词啊。
this,
menu_selector(SpriteMove::Click));//回调方法
pButton->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));//给按钮放到你想放倒的位子去,定位。(CCDirector::sharedDirector()->getWinSize():这个就是获取窗口大小的方法)
pMenu->addChild(pButton);
m_bIsClick = false;
return true;
}
//按钮点击的回调
void SpriteMove::Click(CCObject *pSender)
{
m_iDirection = rand()%5;
if(m_bIsClick == false)
{
m_bIsClick = true;
scheduleUpdate();
}
CCLOG("%d",m_iDirection);
}
//精灵移动方法
void SpriteMove::DirectionChange(int m_iDirection)
{
CCSize WinSize = CCDirector::sharedDirector()->getWinSize();//获取窗口大小来判断精灵是否有移出窗口
switch(m_iDirection)
{
case 1:
if(m_pSprite->getPositionX()+m_pSprite->getContentSize().width<=WinSize.width-m_pSprite->getContentSize().width/2)//如果向右是可以走那就向右走
{
m_pSprite->setPosition(ccp(m_pSprite->getPositionX()+m_pSprite->getContentSize().width,m_pSprite->getPositionY()));//向右移动
}
break;
case 2:
if (m_pSprite->getPositionX()-m_pSprite->getContentSize().width>0)//判断能不能向左移动
{
m_pSprite->setPosition(ccp(m_pSprite->getPositionX()-m_pSprite->getContentSize().width,m_pSprite->getPositionY()));//向左移动
}
break;
case 3:
if(m_pSprite->getPositionY()+m_pSprite->getContentSize().height<=WinSize.height)//判断能不能向上移动
{
m_pSprite->setPosition(ccp(m_pSprite->getPositionX(),m_pSprite->getPositionY()+m_pSprite->getContentSize().height/2));//向上移动
}
break;
case 4:
if(m_pSprite->getPositionY()-m_pSprite->getContentSize().height>0)//最后一个方向--向下移动
{
m_pSprite->setPosition(ccp(m_pSprite->getPositionX(),m_pSprite->getPositionY()-m_pSprite->getContentSize().height));//向下移动
}
break;
default:
break;
}
}
//自动更新
void SpriteMove::update(float dt)
{
DirectionChange(m_iDirection);
}
//------------------------------------------------------------------------------------------用随机数来取方向,随机数是大致写了一下--------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------以上代码均是个人理解,如有错误,欢迎指正,谢谢!----------------------------------------------------------------------//