我有一个使用图层作为组织深度的方法的游戏。它工作正常,但我偶然发现了一个愚蠢的问题...尽管很简单但我不能让它完全按照我的需要工作。 这个想法是,一旦图形完全脱离游戏区域(因为它的右侧已经完全穿过该区域的左侧,所以它不再可见),它应该被运送到该区域的另一侧。
这是罪魁祸首代码,检查每个周期以查看对象是否在边界内,并且在“无限”图层的特殊情况下,执行此代码:
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是图层中使用的恒定速度(保持滚动,就像在摩登原始文件及其重复背景中一样)。
另外,在搬家时我应该考虑速度吗?
答案 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值,因为模数技巧对你不利; ^)