【cocos2d-x入门实战】微信飞机大战之三:引擎坐标系,锚点和背景滚动

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/11730601

飞机要起飞了,不过明眼人一看就知道起飞的不是飞机,是背景,相对运动引起的错觉。


1.cocos2d-x引擎的坐标系

在这之前我们先了解一下cocos2d-x引擎中的坐标系:

(1)UI坐标系。这也是触摸事件中使用的坐标系,原点在左上,坐标值往右下方向递增。

(2)OpenGL坐标系。这是cocos2d-x中使用的坐标系。也是我们平常编程所使用的,原点在左下,坐标值往右上方向递增。

UI坐标系和OpenGL坐标系之间的转换是我们经常要处理的,其实它们的纵坐标和即是屏幕的高。当然Cocos2d-x也提供了非常方便的转换函数给我们使用。

CCPoint CCDirector::convertToGL(const CCPoint& uiPoint)
{
    CCSize s = m_obWinSizeInPoints;
    float newY = s.height - uiPoint.y;
    
    return ccp(uiPoint.x, newY);
}

CCPoint CCDirector::convertToUI(const CCPoint& glPoint)
{
    CCSize winSize = m_obWinSizeInPoints;
    float oppositeY = winSize.height - glPoint.y;
    
    return ccp(glPoint.x, oppositeY);
}


2.锚点

锚点在cocos2d-x引擎中是个很重要的概念,可以这么理解,锚点就是一个基准点。比如我们要把一个100x200的长方形放在屏幕上。

第一种情况

m_sprite->setAnchorPoint(ccp(0.5,0.5));
m_sprite->setPosition(ccp(300,300));

第二种情况

m_sprite->setAnchorPoint(ccp(0,0));
m_sprite->setPosition(ccp(300,300));


3.飞机要起飞了

不,背景要起飞了。

这里我们采用的办法是让2张一样的背景循环进行滚动,然后通过每次滚动的时间间隔和像素间隔来控制背景滚动的速度,也就是飞机飞行的速度。注意图1和图2是一模一样的,所以最后一步是用图1替换了图2。记住图片的高度必须比屏幕高度高,不然在图2走到(0,0)的时候会有黑边出现。。。


bool GameLayer::init()
{
	bool bRet=false;
	do 
	{
		CC_BREAK_IF(!CCLayer::init());

		//png加入全局cache中
		CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("shoot_background.plist");
		
		//加载background1,background1和background2是CCSprite*型成员变量
		background1=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("background.png"));
		background1->setAnchorPoint(ccp(0,0));
		background1->setPosition(ccp(0,0));
		this->addChild(background1);

		//加载background2
		background2=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("background.png"));
		background2->setAnchorPoint(ccp(0,0));
		background2->setPosition(ccp(0,background2->getContentSize().height-2));//这里减2的目的是为了防止图片交界的黑线

		this->addChild(background2);

		//执行任务计划,实现背景滚动
		this->schedule(schedule_selector(GameLayer::backgroundMove),0.01f);

		bRet=true;
	} while (0);
	return bRet;
}

//背景滚动
void GameLayer::backgroundMove(float dt)
{
	background1->setPositionY(background1->getPositionY()-2);
	background2->setPositionY(background1->getPositionY()+background1->getContentSize().height-2);
	if (background2->getPositionY()==0)//要注意因为背景图高度是842,所以每次减去2最后可以到达0,假如背景高度是841,那么这个条件永远达不到,滚动失败
	{
		background1->setPositionY(0);
	}
}
把GameLayer层加入GameScene场景中,调试运行,背景滚动的还不错,比较流畅。

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 46
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值