C 无限滚动
我有一个游戏,使用层作为组织深度的方式。它工作得很好,但我遇到了一个愚蠢的问题…尽管很简单,但我无法让它完全按照我的需要工作。 其想法是,一旦图形完全离开游戏区域(因为它的右侧完全穿过区域的左侧,因此不再可见),它应该被传输到区域的另一侧 这是罪魁祸首代码,每个周期检查对象是否在边界内,在“无限”层的特殊情况下,执行此代码:C 无限滚动,c,C,我有一个游戏,使用层作为组织深度的方式。它工作得很好,但我遇到了一个愚蠢的问题…尽管很简单,但我无法让它完全按照我的需要工作。 其想法是,一旦图形完全离开游戏区域(因为它的右侧完全穿过区域的左侧,因此不再可见),它应该被传输到区域的另一侧 这是罪魁祸首代码,每个周期检查对象是否在边界内,在“无限”层的特殊情况下,执行此代码: if(world.layer[object[i].layer].infinite){ sw = object[i].rect.w * 0.5; sh = o
if(world.layer[object[i].layer].infinite){
sw = object[i].rect.w * 0.5;
sh = object[i].rect.h * 0.5;
if(object[i].rect.x + sw < world.fieldw[0] && world.layer[object[i].layer].speedX < 0){
dif = world.fieldw[0] - (object[i].rect.x + sw);
object[i].rect.x = ((world.fieldw[1]+sw) + dif);
}
else if(object[i].rect.x - sw > world.fieldw[1] && world.layer[object[i].layer].speedX > 0){
dif = (object[i].rect.x - sw) - world.fieldw[1];
object[i].rect.x = ((world.fieldw[0]-sw) - dif);
}
if(object[i].rect.y + sh < world.fieldh[0] && world.layer[object[i].layer].speedY < 0){
dif = world.fieldh[0] - (object[i].rect.y + sh);
object[i].rect.y = ((world.fieldh[1]+sh) + dif);
}
else if(object[i].rect.y - sh > world.fieldh[1] && world.layer[object[i].layer].speedY > 0){
dif = (object[i].rect.y - sh) - world.fieldh[1];
object[i].rect.y = ((world.fieldh[0]-sh) - dif);
}
if(world.layer[object[i].layer].infinite){
sw=object[i].rect.w*0.5;
sh=object[i].rect.h*0.5;
if(对象[i].rect.x+swworld.fieldw[1]&&world.layer[object[i].layer].speedX>0){
dif=(object[i].rect.x-sw)-world.fieldw[1];
对象[i].rect.x=((world.fieldw[0]-sw)-dif);
}
if(对象[i].rect.y+shworld.fieldh[1]&&world.layer[object[i].layer].speedY>0){
dif=(object[i].rect.y-sh)-world.fieldh[1];
对象[i].rect.y=((world.fieldh[0]-sh)-dif);
}
这是可行的,但当物体循环时,它们失去了原来的形状,是什么扭曲了背景。我在这里做错了什么?
我知道这不是一个复杂的问题,但我已经尝试过了,但找不到确切的结果。编辑:fieldw[0]是区域的左边界,fieldw[1]是区域的右边界。与垂直空间中的h[0/1]相同。层速度X/Y是层中使用的恒定速度(以保持其滚动,如在燧石及其重复背景中)。
另外,在移动时是否应该考虑速度?我认为这是因为在当前代码中,循环周期(在空间中)取决于对象大小 如果要将对象保持在相同的相对位置,则在跨越字段边界时,应将其移动到确切的字段witdh:world.fieldw[1]-world.fieldw[0] 此外,根据字段大小与显示大小,可能需要多次显示对象(当字段大小小于显示大小时)
将其视为一种纹理。所有对象都应在视野外的同一点上反弹 这样做的方法是确定最大的物体并取这个宽度,这是视图外的点,物体被捕捉回屏幕的右侧 如果你不能确定最大的物体,你也可以选择屏幕的宽度(因为物体永远不会比屏幕宽) 因此,您的代码如下所示(伪代码): 这样,您就不需要自己捕捉对象了……它们将自动完成。
但是要注意负的object.x值,因为比模技巧更有效;^)换句话说:较小的对象比较大的对象更快地通过世界极限。虽然另一个回答更深入,但这也是非常有用的。感谢您提供的示例和信息,我终于解决了它。无论我如何移动它,位置会得到完美的尊重。我做了很多事情,当我需要计算屏幕宽度/高度时,正如另一个答案所指出的。再次非常感谢!
int biggestObjectWidth = 200;
loop:
if(object.x < (layer.x-biggestObjectWidht))
{
object.x += biggestObjectWidth + layer.width;
}
drawObject((object.x % (biggestObjectWidth+layer.width)) - biggestObjectWidth, object.y)