http://blog.chukong-inc.com/index.php/2012/02/08/iphone连轴画的实现/
本文只讨论横屏连轴画的实现,竖屏连轴画的原理相同不做讨论
本文不会直接给出结论,而是还原作者当初的思路,把问题解决的过程再现。
本文作者系初学者,水平有限,请多多请教!
问题的背景是:游戏背景从右往左按一定速度无限移动,只有一张480*320的背景图。
背景图命名为background.png
首先想到的是声明一CCSprite *bg;
bg = [CCSprite spriteWithFile:@" background.png"];
把bg加入场景中来,然后在update函数中改变bg的位置
比如[bg setPosition:CGPointMake((int)( bg. position .x-shudu *dt), bg.position.y)];
shudu是移动的速度 int型
这时运行程序就可以看到背景图background.png徐徐向左移动,不要开心太早因为在右边出现了黑色的背景,这种效果显然不是我们想要的。
这时我们想到再声明一CCSprite *bg2;
bg2 = [CCSprite spriteWithFile:@" background.png"];
把bg2的位置设为(480,320)
[bg addchild:bg2]
再运行程序这时看到背景徐徐向左移动 并且右边出现了重复的背景,向目标迈进了一步。但是没过几秒,右边又出现了黑色的背景,并逐步变大。
这时我们想到背景bg已经向左移动了480个单位 位置是(-480,0),应该把bg的位置设为(0, 0)
于是我们在update中加了一个判断,
if((bg position].x < -480)
{bg的位置设为(0,0)
}
再次运行程序就可以看到背景图background.png不断的向左移动好像没有尽头。大功告成,不免要玩赏一下,看着看着高兴的心凉了下来,因为屏幕幕的右边有规律的会出现一条竖着的黑线,然后向右闪动一下。百思不得其解之下改变了一下速度shudu的值,发现shudu越大时闪动越明显。
只能再次好好冷静下来分析一下原因所在,检查一下思路,问题锁定在if((bg position].x < -480)
{bg的位置设为(0,0)
}
拿出纸笔画了一下示意图会发现(bg position].x < -480)条件有问题,不能等bg position].x < -480的时候再设置bg的位置,而是if(([bg position].x+480) < shudu*dt)即bg到-480的距离小于bg一帧移动的距离的时候就应该设置它的位置了,于是把判断条件改掉,运行发现还是有一点点的闪动,没有出现黑线。
再次画一画示意图我们发现if(([bg position].x+480) < shudu*dt)条件成立时我们设置bg的位置(0,0)是不对的,通过计算发现 应该是bg setPosition:CGPointMake((int)(([bg position].x+480)-shudu*dt ) , 0)];
if(([bg position].x+480) < shudu*dt)
{
[bg setPosition:CGPointMake((int)(([bg position].x+480)-shudu*dt ) , 0)];
}else{
[bg setPosition:CGPointMake((int)([bg position].x-shudu*dt*20), 0)];
}
再次运行,一切正常,功能实现了。这是一个很简单的功能,但是实现过程却不像想象中的简单,分析原因如下,和新手共勉:
1、想当然,想问题过于主观。
2、没有分析问题,在全面了解问题之前就下手去做,边做边想走了弯路