Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无限滚动_C - Fatal编程技术网

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)