如何使用 ActionScript 拖动图像以使其在屏幕上平滑移动?

2023-12-07

我以为这是一个简单的任务,但我错了。

我使用精灵来显示图像,当用户拖动它(MOUSE_DOWN和MOUSE_MOVE)时,我得到了位置MOUSE_MOVE并计算偏移量:

 var current: Point = new Point(event.localX, event.localY);
 sprite.x = current.x - start.x;
 sprite.y = current.y - start.y;

它可以工作但不顺利。有更好的解决方案吗?


UPDATE

经过一天的调试,终于找到了原因。

Bigger fps可以让它更流畅,但这不是这个问题的关键。

关键是我应该用stageMOUSE_MOVE,而不是图像本身。当获取鼠标位置时,我应该使用event.stageX/Y(or stage.mouseX/Y), not event.localX/Y. The event.localX/Y从移动图像来看,既不稳定也不流畅,这导致了我的问题。

以下是我的工作代码,享受它:)

package {
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.net.URLRequest;
    import flash.text.TextField;

    public class DragIssue extends Sprite {

        private static const URL: String = "assets/m1.jpg";

        private var self: DragIssue;

        private var sprite: Sprite;

        private var startPoint: Point;

        private var offsetX: Number = 0;
        private var offsetY: Number = 0;

        public function DragIssue() {
            self = this;
            init();
            loadImage();
        }

        protected function init(): void {
            if (stage == null) {
                this.addEventListener(Event.ADDED_TO_STAGE, on_addedToStage);
            } else {
                stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            }

            function on_addedToStage(event: Event): void {
                self.removeEventListener(Event.ADDED_TO_STAGE, on_addedToStage);
                stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            }
        }

        public function loadImage(): void {
            var loader: Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
            loader.load(new URLRequest(URL));

            function imageLoaded(event: Event): void {
                var bitmap: Bitmap = event.target.content as Bitmap;

                self.sprite = new Sprite();
                sprite.addChild(bitmap);

                self.addChild(sprite);

                sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            }
        }

        private function onMouseMove(event: MouseEvent): void {
            if (startPoint) {
                sprite.x = offsetX + event.stageX - startPoint.x;
                sprite.y = offsetY + event.stageY - startPoint.y;
            }
        }

        private function onMouseUp(event: MouseEvent): void {
            startPoint = null;
            offsetX = sprite.x;
            offsetY = sprite.y;
        }

        private function onMouseDown(event: MouseEvent): void {
            startPoint = new Point(event.stageX, event.stageY);
        }

    }
}

来,试试这个。它只是一个简单的黑色方块,但看起来很好,直到你really开始拖动它。如前所述,将帧速率设置为更高是理想的。在这种情况下,出于内存原因,我决定将 MOUSE_DOWN 中的帧速率提高到 60fps,并在 MOUSE_UP 中将其降至 24。显然你可以随心所欲地改变它。

import flash.display.*;
import flash.events.*;


var startX:Number;
var startY:Number;
var shape:Sprite = new Sprite();
shape.graphics.beginFill(0x000000);
shape.graphics.drawRect(0,0,50,50);
shape.graphics.endFill();
this.addChild(shape);

shape.addEventListener(MouseEvent.MOUSE_DOWN,this.mouseDown);

function mouseDown(e:MouseEvent = null):void{
    stage.frameRate = 60;
    startX = stage.mouseX - shape.x;
    startY = stage.mouseY - shape.y;
    stage.addEventListener(MouseEvent.MOUSE_MOVE,this.mouseMove);
    shape.addEventListener(MouseEvent.MOUSE_UP,this.mouseUp);
}

function mouseMove(e:MouseEvent = null):void{
    shape.x = stage.mouseX - startX;
    shape.y = stage.mouseY - startY;
}

function mouseUp(e:MouseEvent = null):void{
    shape.removeEventListener(MouseEvent.MOUSE_UP,this.mouseUp);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE,this.mouseMove);
    stage.frameRate = 24;
}

确保删除 MOUSE_UP 上的 MOUSE_MOVE 事件。这是关键。否则,您会在每次 MOUSE_DOWN 上重新添加事件,并最终同时重复运行相同的代码。抱歉,我的语法不是 100% 正确;我在 CS5.5 中很快地将这些组合在一起,而不是在 Flash Builder 中进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ActionScript 拖动图像以使其在屏幕上平滑移动? 的相关文章

  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • 将标题和图像添加到导航栏

    我需要将 UIViewController 的名称和图像设置为导航栏 到目前为止 我可以显示图像 但标题当然丢失了 show image UIImage image UIImage imageNamed bar icon png UIIma
  • Python Flask 不更新图像[重复]

    这个问题在这里已经有答案了 这里有一些关于图像的 Flask 问题 但没有一个能解决我的问题 我有一个应用程序可以创建图像 保存它 然后显示它 一次 它应该多次执行此操作 每次更改图像时 它应该加载新图像 它不是 它只显示与其显示的文件名关
  • 使用 JavaScript 获取图像的一部分

    是否可以显示图像的任何部分img通过 JavaScript 标记 带有像素 我将准备一个大图像 例如 32x320 像素 并定义起始位置 X Y 例如 0 32 和宽度 高度 例如 32 32 并且希望脚本显示第二个 32x32 像素 部分
  • 如何选择图像插值方法? (Emgu/OpenCV)

    Emgu OpenCV的 net包装器 提供的图像调整大小功能可以使用四种插值方法中的任意一种 http www emgu com wiki files 1 4 0 0 html 596dd03d 301e d3c6 4c53 c42855
  • getElementById 无法在 的 Google Chrome 扩展中工作

    在我的 Google Chrome 扩展内容脚本中 我有以下内容 jQuery document ready function var player document getElementById player console log pl
  • Google AJAX API - 如何获得 4 个以上结果?

    我使用下面的 google API ajax 来获取特定搜索词的图像 这是在一个WinForms app 下面的链接似乎有效 但它只返回 4 个结果 通过 JSON 有谁知道如何哄得更多吗 显然必须有另一个参数来请求更多或分页结果 但我似乎
  • Caffe 多输入图像

    我正在考虑实现一个 Caffe CNN 它接受两个输入图像和一个标签 后来可能是其他数据 并且想知道是否有人知道 prototxt 文件中执行此操作的正确语法 它只是一个带有额外顶部的 IMAGE DATA 层吗 或者我应该为每个层使用单独
  • 我自己的而不是从其他网站借用的图像的正确 img src 是什么?

    在我的计算机上 保存 css 和 html 文件的文件夹还包含一些我想要插入到 html 中的图像 如果我从其他网站借用图像 我知道如何获取图像的 URL 如何获取文件夹中但尚未出现在互联网上的图像的 URL 我是否必须将图像上传到其他网站
  • 在 ActionScript 2 中处理无限/巨大的世界

    在 ActionScript 2 中 如何以最小的延迟实现无限 巨大的程序生成世界 例如 在像 泰拉瑞亚 或 我的世界 这样的游戏中 处理这样一个巨大的世界的最佳方法是什么 显然 循环遍历每个块并以这种方式移动它们是行不通的 我尝试将块放入
  • 如何打开/关闭 iPhone 相机闪光灯 swift 2?

    我正在寻找如何打开 关闭 iPhone 的相机闪光灯 我发现了这个 IBAction func didTouchFlashButton sender AnyObject let avDevice AVCaptureDevice defaul
  • 为什么我不应该使用 Flash?

    我多次听说我的网站应该避免使用 Flash 但没有人告诉我这样做的充分理由 我搜索了原因 发现很多不真实的情况 例如 Flash 中的文本无法被搜索引擎索引 或者不一定是真实的或足够重要的 占用更多带宽 JS 等效项会更大还是更小 我的网站
  • 如何在C#中使用saveFileDialog保存图像? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 savefiledialog 保存图像时出现问题 https stackoverflow com questions 11053398 issue while saving image usin
  • 是否可以在通过表单上传本地图像之前预览它们?

    更具体地说 我想使用一种带有一个或多个用于图像的文件输入字段的表单 当这些字段发生更改时 我想在将数据发送到服务器之前显示关联图像的预览 我尝试过多种 JavaScript 方法 但总是遇到安全错误 我不介意使用 java 或 flash
  • 使用 Javascript/jQuery 和 CSS 更改 PNG 颜色

    我有一个黑色的心 PNG http 1 bp blogspot com yq ZSKg39Tk TOvzVx9sC5I AAAAAAAAAb0 GcN4O Ciq3s s1600 black heart png我想用不同的颜色显示 如何使用
  • 在数组/对象中查找项目的最快方法

    在 Javascript AS3 中查找列表或对象中项目的索引的最快方法是什么 我对这两种语言都提出这个要求 因为这两种语言的语法相似 假设 myArray one two three myObject one 1 two 2 three
  • 使用 flash/flex 在客户端硬盘上下载/保存/写入文件

    我想知道如何下载 保存 写入文件我的服务器 to a 客户的计算机使用闪光灯或柔性 我正在寻找的示例可以在http www flexdownloads com http www flexdownloads com Sign up Sign
  • 设置缩略图内容类型

    我需要设置Content Type对于缩略图 我已经尝试如下所示 但它不起作用 仍然 它存储为流 天青功能 索引 json var Jimp require jimp module exports context myBlob gt Rea
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 为什么 swfloader 不工作?

    我正在尝试使用 mxml swfloader 组件从以下 url 加载外部 Flash 但它不加载任何内容 我正在使用 FlashBuilder 4 5 http somesite com en interface swf token 12

随机推荐

  • 使用正则表达式根据用户名的最后一个字母更改文本

    我希望根据用例更改用户名的结尾 在将运行的语言系统中 名称结尾取决于其使用方式 因此需要定义名称的所有结尾并定义它们的替换 建议使用 gsub 正则表达式在字符串中搜索和替换 根据用户名的最后一个字母更改文本 name surname gs
  • 在 python 中加载 DLL 时出错,不是有效的 win32 应用程序 [重复]

    这个问题在这里已经有答案了 我正在尝试在 python 中加载 DLL 来调用函数 import ctypes from ctypes import dsusb ctypes WinDLL c python27 dsusb dll 我的堆栈
  • Windows 上 R 中的 UTF-8 支持

    由于Windows10添加了新功能 Beta 使用Unicode UTF 8支持全球语言 我认为R可以将语言环境转换为UTF 8 但是 当我尝试将系统区域设置更改为 UTF 8 时 Sys setlocale locale Japanese
  • 我可以使用什么 SQL 从我的付款数据中检索计数?

    计数标准 按学校服务类型按月 年对每所学校的学生人数 通过唯一的学生 ID 进行索引 进行 真实 计数 我目前正在使用 MS Access 我需要能够提取具有与下面的示例数据类似的数据的数据库的计数 每一行都是一个付款观察 样本数据 Stu
  • 用于文件上传的 javascript/flash 库,具有文件大小限制和进度条

    有没有用于此目的的 主流 库 普遍传播 维护良好 有记录等 我发现了这些 使用闪光灯 上传 版本不多 最新为 12 2010 没有文档 SWF上传 最新版本 03 2010 文档 奇特上传 看起来有问题 php文件上传器 看起来很重量级 而
  • 在 Teradata 中满足阈值后,将一列数字分为 30 个组

    考虑代表 事件之间的时间 的列 5 40 3 6 0 9 0 4 5 18 2 4 3 2 我想将它们分成 30 个桶 但桶会重置 期望的结果 0 1 1 1 1 1 1 1 1 2 2 2 2 2 这是因为 当我们累计到 30 时 我们会
  • 3D 应用程序中的 JavaFx 2D 部分

    我编写的应用程序有一个小问题 我想要有一个 3D 字段 并在右侧有一个包含 2D 组件 如按钮 的工具栏 我尝试简单地将这些组件添加到我的根组中 但是无法读取文本 并且它们与所有其他组件一起移动 那么 如何区分这两个区域呢 可能有两个场景
  • 如何更新项目中的 sbt?

    我正在 Coursera 上学习关于 scala 的课程 他们给我布置了作业 我下载了项目 有build sbt在里面 我尝试过sbt终端 Eclipse 和 Idea 中的命令没有任何作用 终端中的消息显示 info Compiling
  • 使用 Flask 使路由只能在调试模式下访问

    我有很多只希望在调试模式下访问的路由 是否有装饰器或其他东西允许我执行此操作 或者我必须完全注释 删除代码吗 例子 debug only app route send data
  • 在 Visual Studio 中向编辑器添加指南

    介绍 我一直在寻找一种方法让 Visual Studio 在一定数量的字符后画一条线 以下是启用这些所谓的指南指导方针适用于各种版本的 Visual Studio Visual Studio 2013 或更高版本 安装保罗 哈林顿的编辑指南
  • 无法弄清楚如何恢复 Android 中应用内购买的交易

    我对 Android 应用内计费的恢复交易感到非常困惑 我有这个片段用于在我的应用程序中进行捐赠 BillingHelper requestPurchase mContext donation 它工作得很好 没有任何问题 问题就在这里 当购
  • MIDL 更改接口名称

    我有一个 COM dll 它由使用 COM Inter op 的 NET 应用程序使用 在其中一个 CoClass 中 有一个名为 IT6TrackData 的接口 它有一个名为 TrackData 的 get 属性 来自 IDL 文件 I
  • sql server - 将不带引号的常量传递给 DATEPART 等函数

    我想创建一个接受常量的函数 例如 datepart 函数接受yy mm dd hh like 选择日期部分 dd getdate 我想创建我自己的函数来接受dd不像字符 dd i want 选择 MyFunc dd getdate and
  • 如何使用 springboot 和 hibernate 传递 jdbc 参数?

    我有一个用 spring boot 编写的应用程序 我是新手 所以如果问题很愚蠢 请原谅我 它使用 hibernate 4 和 postgresql 作为数据库后端 我注意到数据库上有一堆属于连接池的连接 声明 SET extra floa
  • 在 qwidget 中运行外部应用程序

    我们如何将外部应用程序嵌入到 QWidget 中 我已经尝试使用 QX11EmbedContainer 进行相同的操作 但收到错误 XEvent 尚未声明 我尝试过下面提到的代码 this 代表 qwidget 类引用 QX11EmbedC
  • 如何在 PySpark 2.1.0 中的事件时间窗口上定义 UDAF

    我正在编写一个Python应用程序 它在一系列值上滑动一个窗口 每个值都有一个时间戳 我想对滑动窗口中的值应用一个函数 以便根据 N 个最新值计算分数 如图所示 我们已经使用 Python 库来利用 GPU 来实现该功能 我发现 Apach
  • 如何使用 node、express 和 ejs 包含 css 文件?

    我正在尝试按照说明进行操作https stackoverflow com a 18633827 2063561 但我仍然无法加载 styles css 来自 app js app use express static path join d
  • Angular js 指令中的后链接与预链接

    正如这里所概述的 http docs angularjs org guide directive Angular js 指令采用两种不同类型的链接函数 预链接功能 在链接子元素之前执行 进行 DOM 转换并不安全 因为编译器链接函数将无法找
  • Deepcopy pandas DataFrame 包含 python 对象(例如列表)

    需要帮助理解变量赋值 指针 以下是可重现的 import pandas as pd df pd DataFrame listData c f d a e b 5 2 1 4 3 df listDataSort df listData giv
  • 如何使用 ActionScript 拖动图像以使其在屏幕上平滑移动?

    我以为这是一个简单的任务 但我错了 我使用精灵来显示图像 当用户拖动它 MOUSE DOWN和MOUSE MOVE 时 我得到了位置MOUSE MOVE并计算偏移量 var current Point new Point event loc