我对基本的拖放滚动算法有一些问题。这是我的算法:
当鼠标按下时,我设置 boolean dragging = true 并将当前鼠标 x 和 y 位置存储在 stored_position 变量中。
当鼠标向上时,我设置布尔拖动 = false。
在每一帧上,我检查拖动 == true,如果是,我计算 dx = current_mouse.x - stored_position.x 和 dy = current_mouse.x - stored_position.y。然后我将当前鼠标位置存储为新的 stored_position 并通过这个 dx dy 滚动我的视图(它是 2d 相机对象),因为 Camera.x -= dx,Camera.y -= dy (我需要反转一个,因为相机具体的)。
该算法的问题在于,当我拖动相机时,它开始闪烁并四处移动/摇晃。我认为这是因为当我将鼠标从左向右移动时,它会像这样跟踪 dx:
71
-67
69
-68
69
-68
8
-5
所以我认为这是鼠标抽搐(我的意思是当我们尝试画一条线时鼠标有时会跳回来)。任何改变算法的想法,也许我错过了什么?这里是这个问题的例子:https ://dl.dropbox.com/u/78904724/as_host/buld_build_other.rar (你需要运行 index.html 选择关卡并尝试拖动屏幕)。
更新 这里是示例完整源链接(这是随机图片,我发誓):https://dl.dropbox.com/u/78904724/as_host/scroll_test.rar 这是我使用的代码(在示例中我使用本机 flash 事件而不是使用 axgl 检查来不混淆某人,我有两个示例,它会导致相同的问题):
//variables with comments
private var dragging:Boolean = false; //dragging flag
private var current_mouse:Array; //stored mouse position array [0] - x, [1] - y
private var d:Array; //dx dy array [0] - x, [1] - y
[Embed(source = "test.jpg")] public static const _sprite:Class; //sprite graphics
private var view_sprite:AxSprite; //some image on the stage to drag it
//this is the class constructor code
view_sprite = new AxSprite(0, 0, _sprite);
add(view_sprite);
current_mouse = new Array();
d = new Array();
Ax.stage2D.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void {
current_mouse[0] = Ax.mouse.x;
current_mouse[1] = Ax.mouse.y;
dragging = true;
});
Ax.stage2D.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent):void {
dragging = false;
});
Ax.stage2D.addEventListener(MouseEvent.MOUSE_MOVE, function(e:MouseEvent):void {
if (dragging) {
d[0] = Ax.mouse.x - current_mouse[0];
d[1] = Ax.mouse.y - current_mouse[1];
Ax.camera.x -= d[0];
Ax.camera.y -= d[1];
current_mouse[0] = Ax.mouse.x;
current_mouse[1] = Ax.mouse.y;
}
});