画布渐变表现

2023-11-30

我目前正在使用画布编写一个小游戏。对于游戏,我需要某种雾来隐藏地图的大部分,并且只有玩家周围的一小部分区域应该可见。为此,我使用第二个画布覆盖游戏发生的画布,并用渐变填充它(从透明到黑色):

function drawFog(){
fogc.clearRect(0,0,700,600);
// Create gradient
var grd=fogc.createRadialGradient(player.getPosX(),player.getPosY(),0,player.getPosX(),player.getPosY(),100);
grd.addColorStop(0,"rgba(50,50,50,0)");
grd.addColorStop(1,"black");

// Fill with gradient
fogc.fillStyle=grd;
fogc.fillRect(0,0,700,600);
}

不幸的是,这会导致巨大的性能问题,因为它将为每一帧重新绘制。

我想问是否有更好的解决方案可以以更好的性能达到相同的效果。


将渐变缓存到离屏画布,然后使用 drawImage() 在画布上进行绘制:

  • 创建雾大小的离屏画布
  • 绘制渐变
  • 当需要雾时,使用屏幕外画布作为图像。

这样就消除了创建和计算梯度的处理。绘制图像基本上就是复制操作(稍微多了一点,但性能很好)。

function createFog(player) {

    // Create off-screen canvas and gradient
    var fogCanvas = document.createElement('canvas'),
        ctx = fogCanvas.getContext('2d'),
        grd = fogc.createRadialGradient(player.getPosX(),
                                        player.getPosY(),
                                        0,player.getPosX(),
                                        player.getPosY(),100);

    fogCanvas.width = 700;
    fogCanvas.height = 700;

    grd.addColorStop(0,"rgba(50,50,50,0)");
    grd.addColorStop(1,"black");

    // Fill with gradient
    ctx.fillStyle = grd;
    ctx.fillRect(0,0,700,600);

    return fogCanvas;
}

现在您可以简单地在从上述函数返回的画布上绘制,而不是每次都创建渐变:

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

画布渐变表现 的相关文章

  • HTML 和 JavaScript - 将滚动操作从一个元素传递到另一个元素

    假设我有两个 div div div div A scrollable list div 我想让它当光标停在里面时 control并且鼠标滚轮滚动 view将会滚动 无论如何要实现这一目标 好的 快速修复对我有用 即使固定 div 不可滚动
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • 如何修复 getImageData() 错误画布已被跨源数据污染?

    我的代码在本地主机上运行得很好 但在网站上却不起作用 我从控制台收到此错误 对于这一行 getImageData x y 1 1 data Uncaught SecurityError Failed to execute getImageD
  • 响应式导航栏隐藏其下方的元素

    我创建了一个响应式导航栏 但它使下面的元素 Flexslider 插件 消失 在我制作导航栏之前 下面的 Flexslider 可以正常显示 但现在不行 导航栏的 z index 为 2 所以我不知道问题是什么 我应该如何 更改什么才能允许
  • 两个 Div 之间的固定宽度间隙

    有谁知道如何修复两个 div 之间的间隙 我有一个主要内容 Div 里面有两个带有图片的 Div 视图的宽度为 768 像素 当我开始拉伸视图时 两张图片开始相互远离 但理想情况下 主要内容 Div 应该在周围有空白的情况下拉伸 并且图片之
  • 到 ToList() 还是不到 ToList()?

    给定一个在记忆中 不是 LINQ to SQL 类列表 List
  • 如何检测浏览器是否支持自定义元素

    我正在查看 Modernizr 它应该有助于功能检测 这应该可以帮助确定您的网站是否与给定的 Web 浏览器兼容 但我没有看到任何表明我可以使用它来检测自定义 HTML 的内容我们在内容中创建和定义的元素 如果不是 Modernizr 我如
  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • CSS 中的像素与像素密度

    我对 HTML 和 CSS 非常陌生 我突然想到 当决定某个东西是 5px 时 比如说 由于像素的物理尺寸取决于密度 所以 5px 在 100 ppi 的屏幕上看起来肯定比在 300 ppi 的屏幕上看起来更大ppi 这是正确的吗 如果是
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 如何将背景图像仅应用于一个反应页面而不是整个应用程序?

    注册页面示例 register background image linear gradient to right ff5722 0 ff9800 100 margin top 150px important div div div div
  • jquery从变量中删除html元素

    我将 html 保存在变量中 var itinerary events today html 我有很多 html 和一个按钮我想删除 它的 ID 为 myButton 如何从变量中保存的 html 中删除它 我建议这种方法 var itin
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 更改文本输入标签中文本的大小?

    我有一个很大的文本输入框 但我无法更改字体大小
  • CSS 是否有不等于选择器?

    CSS中有类似 不等于 的东西吗 例如 我有以下代码 input 但对于某些输入 我需要将其作废 我想通过将类 reset 添加到输入标签来做到这一点 例如
  • FireFox 中的“contenteditable = true”高度问题

    当有空的时候div with contenteditable true CSS contenteditable true border 1px dashed dedede padding 3px HTML div div 在 IE 和 Ch

随机推荐

  • 将 Firebase Admin SDK 添加到 Unity 项目

    我是 Unity 和 C 的新手 对 C 和所有 NET 东西来说真是菜鸟 我想在我的 Unity 项目中使用 Firebase 实时数据库 我按照以下说明进行操作Firebase 文档进行设置 但在我创建了一个新的 p12 文件并添加后这
  • 使用 Pandas 将列转换为行

    所以我的数据集包含 n 个日期的一些位置信息 问题是每个日期实际上是不同的列标题 例如 CSV 看起来像 location name Jan 2010 Feb 2010 March 2010 A test 12 20 30 B foo 18
  • 私有成员函数,它采用指向同一类中私有成员的指针

    我怎样才能做到这一点 以下代码不起作用 但我希望它能解释这个想法 class MyClass private int ToBeCalled int a char b typedef MyClass FuncSig int a char b
  • Android中EditText的InputType

    我想要以下内容 应首先显示数字键盘 但应该可以更改为文本键盘并输入一些字母 我问了几乎同样的问题并接受了答案 Android中EditText的InputType 但现在我发现一些奇怪的行为 设置输入类型 to Number 可以将键盘更改
  • 设置axes.linewidth而不更改rcParams全局字典

    因此 似乎无法执行以下操作 它会引发错误 因为axes没有set linewidth方法 axes style linewidth 5 axes rect 0 1 0 1 0 9 0 9 axes axes rect axes style
  • 如何使用 Dapper 执行插入和返回插入的身份?

    如何使用 Dapper 执行数据库插入并返回插入的身份 我尝试过这样的事情 string sql DECLARE ID int INSERT INTO MyTable Stuff VALUES Stuff SELECT ID SCOPE I
  • .Net 如何允许可空值设置为 Null

    The Nullable
  • 将字典附加到字典[重复]

    这个问题在这里已经有答案了 我有两本现有词典 我希望将其中一本 附加 到另一本 我的意思是 另一个字典的键 值应该放入第一个字典中 例如 orig A 1 B 2 C 3 extra D 4 E 5 dest Something here
  • “Vary: Accept”HTTP 标头的作用是什么?

    我使用 PHP 生成动态网页 正如以下教程中所述 请参阅下面的链接 当 SERVER HTTP ACCEPT 允许时 XHTML 文档的 MIME 类型应为 application xhtml xml 由于您可以使用 2 个不同的 MIME
  • Java按引用传递问题[重复]

    这个问题在这里已经有答案了 可能的重复 Java是按引用传递吗 我这里有这门课 public class Cat private String catNum private static Cat cat1 private static Ca
  • 使用 SAX 解析器解析自关闭 XML 标签时遇到问题

    我在使用 SAX 解析自关闭 XML 标签时遇到问题 我正在尝试从 Google Base API 中提取链接标签 我在解析常规标签方面取得了一定的成功 这是 xml 的一个片段
  • 如何通过连接和基于行的限制(分页)在休眠中获得不同的结果?

    我正在尝试使用基于行的限制来实现分页 例如 setFirstResult 5 and setMaxResults 10 在具有与其他表的联接的 Hibernate Criteria 查询上 可以理解的是 数据被随机切断 并解释了原因here
  • 如何让div居中?

    我在 HTML 中居中 div 时遇到问题 垂直和水平 我的代码看起来像这样 div SOME HTML div container width 366px height 274px margin 50 top 137px left 188
  • hive 中的 regexp_extract 给出错误

    我的表中有一些数据 例如 id params 123 utm content doit utm source direct 234 utm content polo utm source AndroidNew 使用 regexp extra
  • Visual Studio 新项目“确定”按钮呈灰色

    我认为这只是意味着我缺少依赖项 但我无法创建任何类型的项目 控制台应用程序 Web 应用程序 Windows 窗体等 我运行的是 VS 2012 premium 您可能正在尝试将项目保存到您没有写入权限的目录位置 它可能是某处的网络驱动器
  • MATLAB - 编译 jpeg_read.c 创建 mexmaci64 文件时出错[重复]

    这个问题在这里已经有答案了 最近 我将 Matlab 项目从 Windows 操作系统转移到了 Mac 操作系统 所以我的 jpeg read mexw64 文件不再工作 我需要创建一个与 Mac OS 兼容的新 mexmaci64 文件
  • 显示应用程序端点的照片

    这是我的问题 我在一个大型 UCMA 项目上工作了 3 个月 现在我想添加一个小功能 我有很多可以动态添加 修改或删除的 ApplicationEndpoint 我希望每次创建 ApplicationEndpoint 时都指定将在 Micr
  • 位图、Bitmap.recycle()、弱引用和垃圾回收

    据我所知 在 Android 上 建议将 Bitmap 对象作为 WeakReferences 引用 以避免内存泄漏 当位图对象不再保留硬引用时 垃圾收集器将自动收集它 现在 如果我理解正确的话 必须始终调用 Bitmap recycle
  • C++ SDL 的作用是什么?做?

    screen SDL SetVideoMode 1000 1000 32 SDL HWSURFACE SDL FULLSCREEN 什么是 do in SDL HWSURFACE SDL FULLSCREEN 我尝试谷歌搜索 但谷歌不接受特
  • 画布渐变表现

    我目前正在使用画布编写一个小游戏 对于游戏 我需要某种雾来隐藏地图的大部分 并且只有玩家周围的一小部分区域应该可见 为此 我使用第二个画布覆盖游戏发生的画布 并用渐变填充它 从透明到黑色 function drawFog fogc clea