数组第n个元素移至n+1位置后矩形位置异常,求解决
问题分析与修正方案
你的数组操作如果是将old_index元素移到new_index,首先要确认数组操作逻辑是否正确:当前你用insert(new_index, test_array[old_index])再remove_at(old_index+1)的方式,仅当new_index > old_index时会导致错误(会删除原old_index+1的元素而非原old_index元素)。正确的数组移动逻辑应该是先删除再插入:
var element = test_array[old_index] test_array.remove_at(old_index) test_array.insert(new_index, element)
同时,visualization数组也需要同步做相同的元素移动,才能保证矩形和数组元素一一对应:
var moved_rect = visualization[old_index] visualization.remove_at(old_index) visualization.insert(new_index, moved_rect)
接下来是矩形位置的修正,你的位置偏移逻辑存在循环方向和目标值错误,以下是两种修正方式:
方式1:直接同步到索引对应位置(无动画)
如果不需要过渡动画,直接让每个索引的矩形回到对应位置是最稳妥的,避免逻辑错误:
func insert_rect(new_index:int, old_index:int): # 同步更新数组和可视化数组 var element = test_array[old_index] test_array.remove_at(old_index) test_array.insert(new_index, element) var moved_rect = visualization[old_index] visualization.remove_at(old_index) visualization.insert(new_index, moved_rect) print("putting " + str(old_index) + "th number in " + str(new_index) + "th index") # 定义基础位置和间距(根据你的场景调整数值) var base_x:float = 100.0 var rect_spacing:float = 50.0 # 逐个设置矩形到对应索引的位置 for i in range(visualization.size()): visualization[i].position.x = base_x + i * rect_spacing
方式2:过渡动画效果
如果需要逐个移位的动画效果,修正你的位置逻辑:
func insert_rect(new_index:int, old_index:int): # 同步更新数组和可视化数组 var element = test_array[old_index] test_array.remove_at(old_index) test_array.insert(new_index, element) var moved_rect = visualization[old_index] visualization.remove_at(old_index) visualization.insert(new_index, moved_rect) print("putting " + str(old_index) + "th number in " + str(new_index) + "th index") # 定义基础位置和间距(根据你的场景调整数值) var base_x:float = 100.0 var rect_spacing:float = 50.0 # 目标位置:要移动的矩形最终的x坐标 var target_pos:float = base_x + new_index * rect_spacing if new_index < old_index: # 元素向前移:从old_index-1倒序到new_index,逐个往后挪位置 for i in range(old_index - 1, new_index - 1, -1): visualization[i].position.x = base_x + (i + 1) * rect_spacing elif new_index > old_index: # 元素向后移:从old_index+1顺序到new_index,逐个往前挪位置 for i in range(old_index + 1, new_index + 1): visualization[i].position.x = base_x + (i - 1) * rect_spacing # 最后移动目标矩形到新位置 moved_rect.position.x = target_pos
错误原因说明
- 你之前保存的是
visualization[new_index].position.x,但实际上应该保存要移动的矩形的目标位置(或原始位置),而非目标索引原有的矩形位置。 - 向前移动时,循环方向错误:应该从后往前遍历,避免覆盖还未处理的位置值;向后移动时,循环范围和方向也需要对应调整,保证每个中间矩形都能正确移位。
内容的提问来源于stack exchange,提问作者Sushiaaa
相关产品推荐
相关产品推荐

