无尽重复滚动背景

2024-03-30

我遇到了 AS3 和 AIR 的问题。我正在为带有飞机的智能手机开发一款横向卷轴游戏,我使用不同的背景作为图层。

首先:我使用 GPU 并且仅使用位图,质量设置为低。因此,性能设置均适合智能手机使用。

我使用绘图 API 将它们放入一个矩形中,并使用矩阵移动背景:

protected var scrollingBitmap:BitmapData;
protected var canvas:Graphics;
protected var matrix:Matrix;

public function move(dx:Number, dy:Number):void {
    matrix.translate(dx, dy);
    if(dx != 0) matrix.tx %= scrollingBitmap.width;
    if(dy != 0) matrix.ty %= scrollingBitmap.height;
    drawCanvas();
}

protected function drawCanvas():void {
    canvas.clear();
    canvas.beginBitmapFill(scrollingBitmap, matrix, true, true);
    canvas.drawRect(0, -scrollingBitmap.height, 1404, scrollingBitmap.height);
}

更新2(

看看这个:http:// Plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/ http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/

我用它来创建我的背景。

有了这个,我可以模拟我的飞机向右飞行,而不移动整个背景,并且我可以使用每次重复的小单个图形(对于前景层)。

对于背景层,我也使用这种方法,但是对于更大的图形,我仅以较小的飞机速度移动它来模拟远背景。

我的移动方法是在 Enterframe 事件上。所以我可以用飞机的“运动”来更新每一帧的背景。

)

该平面可以超过位图的高度。每次位图返回到窗口/屏幕时,都会出现很长的延迟。当飞机飞得非常快时,游戏也会开始滞后。

我的第一个方法是使用 .PNG 文件(但它们非常大:1-3MB 大小)。 我的下一个方法是使用 .GIF 文件(大小要小得多)。

两者都是一样的。所以不可能是这样的。

我读到了有关 draw() 和 copyPixels() 的内容,但我不知道如何使用它们来重复图像。

UPDATE1:

protected var scrollingBitmap:BitmapData;
protected var canvas:Bitmap;

protected function init(e:Event):void {
    removeEventListener(Event.ADDED_TO_STAGE, init);
    canvas = new Bitmap(new BitmapData(1404, scrollingBitmap.height, true), "auto", true);
    this.addChild(canvas);
    drawCanvas();
}

public function move(dx:Number, dy:Number):void {
    if(dx != 0) dx %= scrollingBitmap.width;
    if(dy != 0) dy %= scrollingBitmap.height;
    drawCanvas(dx, dy);
}

protected function drawCanvas(xPos:Number = 0, yPos:Number =  0):void {
    canvas.bitmapData.copyPixels(scrollingBitmap, new Rectangle(0, 0, 1404, scrollingBitmap.height), new Point(xPos, yPos), scrollingBitmap);
}

我认为你最好使用位图而不是使用带有填充的图形对象。 copyPixels 速度非常快。因此,您要做的就是简单地将像素复制到之前存在的任何内容之上,假设所有内容都是不透明的。如果一切都不是不透明的,您需要使用源位图作为其自己的 Alpha 数据,这样以前绘制的像素就不会显示出来。

让我们重新构建画布,使其成为位图而不是 MC。你的新代码将如下所示:

protected function drawCanvas():void {
   canvas.bitmapData.copyPixels(scrollingBitmap, new Rectangle(0, 0, scrollingBitmap.width, scrollingBitmap.height), new Point(0,0), scrollingBitmap);
}

哦,看看那个!这段代码不仅速度更快,而且只有一行代码!

编辑:添加工作代码

package  {
    import flash.display.MovieClip;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.geom.Point;


    public class EndlessBG extends MovieClip{
        //this one stays stationary, we're getting the pixels for the right side of the pic from here
        private var _source:BitmapData;
        //this is the one moving to the left (the pixels for the right side are not visible except for once a cycle);
        private var _movingPixels:BitmapData;
        private var _canvas:Bitmap;
        private var _xOffset:int = 0;
        private var _rect:Rectangle = new Rectangle();;
        private var _point:Point = new Point();

        public function EndlessBG() {
            super();
            _source = new BathroomStillLife();
            _canvas = new Bitmap(new BitmapData(_source.width, _source.height));
            _canvas.bitmapData.draw(_source);
            _canvas.x = stage.stageWidth/2 - _canvas.width/2;
            _canvas.y = 5;
            addChild(_canvas);
            addEventListener(Event.ENTER_FRAME, gameLoop);
            setGeometryDefaults();
            _movingPixels = new BitmapData(_source.width, _source.height);
            _movingPixels.copyPixels(_source, _rect, _point);
            //turn this on to watch red pixels be drawn where the source pixels are coming in
            //_source = new BitmapData(_source.width, _source.height, false, 0xFF0000);
        }

        private function gameLoop(e:Event):void {
            _xOffset--;//where the background is moving to
            if (_xOffset < -_source.width) {
                _xOffset = 0;
                //this doesn't seem to work correctly:
                //_movingPixels.scroll(_source.width, 0);
                _movingPixels = new BitmapData(_source.width, _source.height);
                _movingPixels.copyPixels(_source, _rect, _point);
            }
            trace(_xOffset);
            setGeometryDefaults();
            _movingPixels.scroll(-1, 0);
            //draw the moved part of the canvas
            _canvas.bitmapData.copyPixels(_movingPixels, _rect, _point);
            //If we stop here, we get a smear to the right
            //so, get the remaining pixels directly from the source
            //1) reset our rect and point to be to the right side
            _rect.x = 0;
            _rect.width = -_xOffset;
            _point.x = _source.width + _xOffset;
            //2) copy from the source
            _canvas.bitmapData.copyPixels(_source, _rect, _point);
        }
        private function setGeometryDefaults():void {
            _rect.x=0;
            _rect.y=0;
            _rect.width = _source.width;
            _rect.height = _source.height;
            _point.x = 0;
            _point.y = 0;
        }

    }

}

不太理想,对于博客文章来说还不够完善,但应该可以帮助您入门。

Edit:最终我确实写了博客文章 http://flexdiary.blogspot.com/2012/06/endless-scrolling-bathroom.html.

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

无尽重复滚动背景 的相关文章

  • 如何调整外部 SWF 的大小以适合容器?

    我想要完成的是调整外部 SWF 的大小 使其适合在舞台上作为容器呈现的显示对象 现在它显示在容器外部 重要提示 我不希望外部 SWF 占据整个舞台 我在舞台上为它准备了一个特殊的地方 那个容器 public function loaderC
  • jquery 移动列表视图样式

    我正在尝试设置列表视图控件的样式 但遇到问题 当我将图像宽度设置为 40px 如标记中所示 时 我似乎无法让内容正确地向左对齐 IE 我不想要图像和文本之间的间隙 这是我的标记 ul class ui listview li class u
  • 当给定闪光角度和速度时,计算物体的轨迹

    我正在尝试从大炮中发射炮弹并使其遵循现实的路径 射击角度根据大炮的方向而变化 自动定向到鼠标指针 所以我想弄清楚的是 当给定角度和设定速度时 如何沿着抛物线路径移动炮弹 我读到 这可以在没有复杂的三角学的情况下完成 在高中时从未听过 并且可
  • Google 字体无法在移动设备中加载

    我读过类似的帖子 但这个问题有点不同 我有 rest of the code 在 css 样式文件中我有 body font family Source Sans Pro sans serif rest of the code 它在浏览器中
  • Jquery 移动弹出窗口在页面调整大小或滚动时在错误位置重新打开

    在 PC 浏览器中 存在弹出窗口在调整窗口大小时改变其位置的问题 我用谷歌搜索了一下 发现 JMF 有一个错误 将positionTo从origin codeSource更改为window 在移动浏览器中 我在页面滚动上遇到同样的问题 弹出
  • JQuery-UI 水平拖动和垂直滚动

    我有一个页面 其中充满了仅在水平方向 在 X 轴上 的可拖动 div 当我使用触摸设备时 由于滚动和拖动之间的冲突 我无法向下滚动页面 这是一个jsfiddle 示例 http jsfiddle net 742cX 10 在触摸设备中进行测
  • ActionScript 3 中的圆形滑块

    我希望在 ActionScript 中添加一个圆形滑块 非常类似于这一页 http interface eyecon ro demos drag vr html shows 它最终会改变对象的色调 返回 CMY 值 但如果它只是吐出程度 我
  • AS3 无法从 Java 发送的套接字解​​码 AMF3 对象

    我有一个 java 套接字服务器 它在连接时将 Animal 对象发送到 Flash 客户端 对象的发送方式如下 Amf3Output amf3Output new Amf3Output SerializationContext getSe
  • 在 Adob​​e Air 中访问 iframe 的内容

    我在弄清楚如何访问 Air 中 iframe 中的内容时遇到了很多麻烦 这是我一直在测试的一些示例 jquery 代码 document ready function frame ready function air trace frame
  • 针对较小屏幕的拆分表行

    我有一个固定宽度为 960px 有 5 列的表格 当我在移动设备中查看时 我想制作第 3 4 5 列 看起来就像在下一行 有什么方法可以让 CSS 打断一行 使其看起来像这样 但是 还保留原来的HTML代码吗 您可以使用 FlexBox f
  • 在 Mac OS X (Mavericks) 上的 Adob​​e AIR 中的两台显示器上显示两个全屏窗口

    我使用的是 Mac OS X Mavericks 使用 Adob e AIR 我想在两个显示器 内置笔记本电脑视网膜显示器和外部 HDMI 显示器 上分别显示单独的全屏窗口 我可以在主显示器上获得全屏窗口 在辅助显示器上获得几乎全屏的窗口
  • Flex Slider 无法在手机上运行

    我在这个页面上使用 flexslider 的网站上工作 http www intensetomatoes co nz story timeline http www intensetomatoes co nz story timeline
  • SQLite 参数 - 不允许表名作为参数

    我正在通过 Flex 在 AIR 中开发一个应用程序 但我没有发现 SQLite 出了什么问题 我习惯了 MySQL 参数有效 但仅在某些情况下有效 这是内置的针对sql注入的卫生系统的一部分吗 谢谢你的帮助 Works sqlite IN
  • 用圆形减去(遮盖掉?)路径

    我正在使用 Spark Path 在 Flex 中绘制一条路径 我想从这条路径中减去一个圆形 如下图所示 道路又黑又宽 有任何想法吗 我尝试使用 Shape 对象创建蒙版 但无法完全创建其中有圆孔的蒙版 找到了 不涉及口罩 我拿了Path并
  • 更改 AS3 中的 TextField 选择颜色

    如何更改 ActionScript 3 中 TextField 的选择 突出显示 颜色 我有一个输入文本字段 黑色背景上有白色文本 因此 选择是不可见的 这对于可用性来说非常糟糕 谢谢 另一种方法是使用文本布局框架 特别是使用 Select
  • Actionscript 对象的属性数量

    如何获取通用 Actionscript 对象中的属性数量 如数组长度 您必须循环所有元素才能对它们进行计数 function objectLength myObject Object int var cnt int 0 for var s
  • 位置:固定在 iPad 和 iPhone 上不起作用

    I have been struggling with fixed positioning in iPad for a while I know iScroll http cubiq org iscroll and it does not
  • 通过移动地址栏时,视差背景图像在移动设备上改变大小

    一周以来 我的视差元素一直在碰壁 寻求帮助对我来说是最后的手段 我已经在各种论坛上寻找这些问题的解决方案 但我尝试过的都没有效果 only在移动设备上 chrome 如果您按住触摸屏并继续向下滚动 则在初始屏幕图像之后 会出现一个白条 屏幕
  • 如何在动作脚本 3 中设置/访问外部 swf 文件的动态文本字段?

    我正在处理一个 fla 文件 其中添加了一个 swf 文件 我如何在该 swf 文件的动态文本上设置文本 有没有直接设置文本的方法 我不想在 url 中作为参数传递 我试过这样 var rq URLRequest new URLReques
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch

随机推荐

  • 实现 INotifyPropertyChanged 的​​模式?

    我已经看到以下用于实现 INotifyPropertyChanged 的 模式 private void NotifyPropertyChanged string propertyName PropertyChangedEventHandl
  • 我可以在 .NET Windows 窗体中创建多列上下文菜单吗?

    我想创建一个包含多个列的上下文菜单 基本上它会是这样的 First item common option All Options gt Second item common option All Options gt Third item
  • 将 Facenet 模型 .pb 文件转换为 TFLITE 格式时出错

    我正在尝试根据我从 Inception ResNet 获得的预训练冻结 pb大卫 桑德伯格的 Github https github com davidsandberg facenet使用以下命令在 Ubuntu 上使用 Tensorflo
  • 使用 git rebase 定期将分支同步到 master

    我有一个 Git 存储库 其中的分支几乎从不更改 没有其他人对其做出贡献 它基本上是主分支 删除了一些代码和文件 有了这个分支 我可以轻松打包项目的精简版本 而不必每次都手动删除代码和文件 我一直在使用git rebase以使该分支与主分支
  • 如何在scrapy中发出请求之前更改请求url?

    我需要在下载响应之前修改我的请求网址 但我无法改变它 即使使用修改请求网址后request replace url new url the process response打印未修改的 url 这是中间件的代码 def process re
  • extras 文件夹、sdk 管理器中缺少 android 支持库

    为什么我在 extras 文件夹中找不到 android 支持库 我应该怎么办 我正在使用 Eclipse Juno The Android Support LibrarySDK 管理器中的条目已被弃用 它的最后一个版本是支持库的版本 23
  • 滑动删除 ListView 项目

    我在里面看到了滑动删除的demo谷歌安卓 i o 2013 under 一次感动的经历 https developers google com events io sessions 326431311 https developers go
  • 无法从 PocketPC (Windows Mobile 6) 打开到 SQL Server 2005 的连接

    我正在尝试从袖珍电脑应用程序 Windows Mobile 6 连接到 SQL Server 2005 但无论我如何努力 它都不起作用 我检查了在 SQL Server 上启用 tcp 的所有可能的配置 我测试了许多连接字符串 但当我尝试打
  • 使用 Azure 缓存(.NET MVC3 应用程序)时,为什么无法组合 [Authorize] 和 [OutputCache] 属性?

    使用 Windows Azure 的Microsoft Web DistributedCache DistributedCacheOutputCacheProvider作为 MVC3 应用程序的 outputCache 提供程序 下面是相关
  • 如何在自定义 Telegram 机器人内部循环?

    我们正在尝试制作一个电报价格机器人 但遇到了一个可以使用第三方代码解决的问题 但是我们无法将机器人设置为每 5 分钟 或更长时间 向我们发送更新的价格 而不使用第三方解决方案安全原因 如何在不使用其他第三方 Telegram 机器人的情况下
  • 安卓谷歌地图。按地址添加标记

    我在 Android 应用程序中添加了地图 并想按地址在地图上添加标记 有可能的 我已经尝试过做长和拉Geocoder 但是我收到错误Service not Available my code Geocoder geocoder new G
  • JQuery 问题....焦点不起作用

    这是我的 jquery 代码 我想验证文本字段的数值 如果无效 则再次聚焦相同的文本字段并再次 price blur function if this val Pre o em USD isNaN this val alert Enter
  • 如何在.NET中创建HTTP请求侦听器Windows服务

    我想创建充当 HTTP 侦听器并可以处理大约 500 个客户端的 Windows 服务 这种服务有什么特别的考虑吗 我对 HTTPListener 类和 TCPListener 类有点困惑 将哪一个用于 Windows 服务将 接受客户端连
  • TextView 选框不起作用

    我已经尝试了所有我能想到的方法来使这种字幕效果发挥作用 这是我的 xml
  • 在Python 3.x中继承Python的对象是否有必要或者有用? [复制]

    这个问题在这里已经有答案了 在较旧的 Python 版本中 当您创建类时 它可以继承自object据我所知 这是一个特殊的内置Python元素 它允许你的类成为一个新样式的类 新版本 gt 3 0 和 2 6 怎么样 我用谷歌搜索了obje
  • Angular2 + webpack 不显示图像

    我已遵循Angular2 webpack 教程 https angular io docs ts latest guide webpack html 但似乎该应用程序无法加载任何图像 这是我的应用程序的目录结构 dist src asset
  • 根据放大/缩小时的可见区域在框的表面显示文本

    I have a sample 3D application built by taking reference from the Javafx sample 3DViewer which has a table created by la
  • RPostgreSQL - 将数据帧导入表中

    我想将完整的数据帧导出到已在数据库 postgresql 中创建并包含类似数据的表中 我发现一些关于 dbwrite 表的问题 overwrite TRUE 我不想覆盖表中已经存在的数据 我只想使用 r 控制台中的数据框更新我的表 有人可以
  • Angular 2 ngFor - 使用索引逆序输出

    尝试学习一些有关 Angular 2 中的过滤和排序的知识 我似乎找不到任何像样的资源 并且我陷入了如何使用索引以相反的顺序排序 ngFor 输出的问题 我写了下面的管道 它一直给我错误 数组切片不是函数 Pipe name reverse
  • 无尽重复滚动背景

    我遇到了 AS3 和 AIR 的问题 我正在为带有飞机的智能手机开发一款横向卷轴游戏 我使用不同的背景作为图层 首先 我使用 GPU 并且仅使用位图 质量设置为低 因此 性能设置均适合智能手机使用 我使用绘图 API 将它们放入一个矩形中