无限滚动

时间:2009-09-25 09:11:13

标签: c

我有一个使用图层作为组织深度的方法的游戏。它工作正常,但我偶然发现了一个愚蠢的问题...尽管很简单但我不能让它完全按照我的需要工作。 这个想法是,一旦图形完全脱离游戏区域(因为它的右侧已经完全穿过该区域的左侧,所以它不再可见),它应该被运送到该区域的另一侧。

这是罪魁祸首代码,检查每个周期以查看对象是否在边界内,并且在“无限”图层的特殊情况下,执行此代码:

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);
    }

它有效,但随着物体的循环,它们会失去原有的形态,扭曲背景。我在这做错了什么? 我知道这是一个复杂的问题,但我已经尝试过,但无法找到完全的结果。
编辑:fieldw [0]是区域的左边界,fieldw [1]是右边。垂直空间中的h [0/1]也相同。图层速度X / Y是图层中使用的恒定速度(保持滚动,就像在摩登原始文件及其重复背景中一样)。 另外,在搬家时我应该考虑速度吗?

2 个答案:

答案 0 :(得分:0)

我认为这是因为在当前代码中,循环周期(在空间中)取决于对象大小。

如果你想让对象保持在相同的相对位置,当穿过场边界时,它们应该被确切的字段witdh:world.fieldw [1] - world.fieldw [0]移动。

另外,根据字段大小与显示大小的不同,您可能需要多次显示对象(当字段大小小于显示大小时)。

将其视为纹理。

答案 1 :(得分:0)

所有物体应在视野之外的同一点处快速反射。

所以这样做的方法是确定最大的物体并取这个宽度。这是视图之外的对象被捕捉回屏幕右侧的点。

如果无法确定最大的物体,也可以采用屏幕的宽度(假设物体的宽度从不宽于屏幕)。

所以你的代码看起来像这样(伪代码):

 int biggestObjectWidth = 200;

 loop:
      if(object.x < (layer.x-biggestObjectWidht)) 
      {
           object.x += biggestObjectWidth + layer.width;
      }

所以所有对象都以相同的数量快照回来

你还可以做的只是模数对象的位置。

 drawObject((object.x % (biggestObjectWidth+layer.width)) - biggestObjectWidth, object.y)

这样你就不需要自己拍摄对象......它们会自动完成。 但要注意负面的object.x值,因为模数技巧对你不利; ^)