移动时切比雪夫距离 x 坐标错误

2024-01-05

所以我正在复制移相器切比雪夫距离示例,并在解决方案之后here https://stackoverflow.com/questions/75478712/this-gamestate-variable-not-recognized-phaser-js我遇到错误Cannot read properties of null (reading 'x') for origin.x,

奇怪的是,这种情况发生在我从x=0

code

import Phaser from "../lib/phaser.js";

export default class Game extends Phaser.Scene {
  constructor() {
    super("game1");
  }

  preload() {
    this.load.image(
      "Tileset",
      "https://cdn.glitch.global/cc90578e-c3d0-47c5-bb0d-f5a81263b5b6/pixil-frame-0%20(17).png?v=1675985219390"
    );
    this.load.tilemapTiledJSON(
      "map",
      "https://cdn.glitch.global/cc90578e-c3d0-47c5-bb0d-f5a81263b5b6/Map.tmj?v=1675985261369"
    );
    this.load.spritesheet(
      "player",
      "https://cdn.glitch.global/cc90578e-c3d0-47c5-bb0d-f5a81263b5b6/pixil-frame-0%20(13).png?v=1675904194091",
      { frameWidth: 32, frameHeight: 32 }
    );
  }

  create() {
    this.gameState = {
      map: "",
      cursors: "",
    };

    this.gameState.map = this.make.tilemap({ key: "map" });
    this.tiles = this.gameState.map.addTilesetImage("tileSet", "Tileset");
    this.worldLayer = this.gameState.map.createLayer(
      "Block Layer",
      this.tiles,
      0,
      0
    );

    this.player = this.physics.add.sprite(0, 1600, "player", 1);

    this.cameras.main.setBounds(
      0,
      0,
      this.gameState.map.widthInPixels,
      this.gameState.map.heightInPixels
    );
    this.cameras.main.startFollow(this.player);

    this.gameState.cursors = this.input.keyboard.createCursorKeys();
    this.physics.add.collider(this.player, this.worldLayer);
  }

  update() {
    if (this.gameState.cursors.left.isDown) {
      this.player.setVelocityX(-50);
    } else if (this.gameState.cursors.right.isDown) {
      this.player.setVelocityX(50);
    } else if (this.gameState.cursors.up.isDown) {
      this.player.setVelocityY(-50);
    } else if (this.gameState.cursors.down.isDown) {
      this.player.setVelocityY(-50);
    } else {
      this.player.setVelocityX(0);
    }

    this.updateMap();
  }
  
  updateMap() {
  console.log(this.gameState);
  var origin = this.gameState.map.getTileAtWorldXY(
    this.player.x,
    this.player.y
  );
  this.gameState.map.forEachTile(function (tile) {
    var dist = Phaser.Math.Distance.Chebyshev(
      origin.x,
      origin.y,
      tile.x,
      tile.y
    );

    tile.setAlpha(1 - 0.1 * dist);
  }, this);
}
}


由于您以物理速度移动玩家,因此玩家可能位于地图之外,或者在没有瓷砖的位置.

When map.getTileAtWorldXY被调用时位置在地图之外(或其他一些无效位置),或者图层上该位置没有放置图块,该函数将返回null,这可能就是您收到此特定错误的原因。
(文档链接 https://newdocs.phaser.io/docs/3.54.0/focus/Phaser.Tilemaps.Tilemap-getTileAtWorldXY)

简单的解决方案就是退出该函数,当origin equals null。像这样:

 updateMap() {
      
    var origin = this.gameState.map.getTileAtWorldXY(
        this.player.x,
        this.player.y
    );

   if(!origin){
       return;
   }
   ...
}

或者你可以有一个像这样的变量:this.gameState.lastValidPosition,当玩家具有有效位置时设置,并使用此变量,以防出现错误

 updateMap() {
      
    var origin = this.gameState.map.getTileAtWorldXY(
        this.player.x,
        this.player.y
    );

   if(!origin && !this.gameState.lastValidPosition ){
       // origin is invalid and we have no valid last position
       return;
   } else if( !origin ) { // origin is null, w use the last valid position
       origin = this.gameState.lastValidPosition;
   } else { // origin is not null, so we save this position
      this.gameState.lastValidPosition = origin;
   }
   ...
}

两种解决方案都会产生exact相同的结果(对于大多数用例)。哪个操作系统将光源保持在最后一个已知/有效的位置。

Update:
更简单的解决方案可能是使用第三个参数nonnull,函数的map.getTileAtWorldXY (如果问题是缺少瓷砖),这将返回一个带有索引的图块-1代替null.

like:

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

移动时切比雪夫距离 x 坐标错误 的相关文章

  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • 如何用js获取一个月的4个星期一?

    我正在构建一个图表 其中 x 轴应该是一个月的四个星期 我只想显示该月的四个星期一 我已经有了currentMonth和currentYear变量 而且我知道如何获取该月的第一天 我所需要的只是将一个月的四个星期一放入数组中 所有这些都在同
  • 使用javascript在谷歌地图中绘制多边形

    我想在谷歌地图中绘制多边形 我正在使用示例代码http jsfiddle net rvsMH 1 http jsfiddle net rvsMH 1 但它不起作用并且没有获取数组或纬度 经度值 我不知道出了什么问题
  • 如何检测不渲染 .png 透明的浏览器

    我有这段代码可以根据一周中的某一天渲染图像 但在 IE6 及更低版本以及可能其他一些浏览器中 它不会呈现 png 不透明度 所以我想稍微改变一下 这样它就会检测到不渲染 alpha 透明度的浏览器 并告诉他们加载这个图像 img horar
  • ExitFullScreen 不起作用 + 无论如何要按键盘单击按钮?

    我的浏览器 Google Chrome 版本 33 0 1750 154 m Script function exitFullscreen var element document documentElement if element mo
  • 如何延迟 NavLink 的反应?

    Delay e gt e preventDefault setTimeout gt e unpreventDefault make this work 500 render
  • 有什么方法可以在不重新加载的情况下更改标头 URL? [复制]

    这个问题在这里已经有答案了 可能的重复 修改URL而不重新加载页面 https stackoverflow com questions 824349 modify the url without reloading the page 使用新
  • Angular - Safari 无法正确显示 DOM

    我是 Angular 的新手 使用 Angular 4 我尝试通过在关联的组件类文件中设置属性来更新特定元素 但是 除非我尝试强制重新绘制网页 通过调整窗口大小等 否则页面不会更新 我打开检查器 看到 DOM 已更改 但显示与元素检查器中的
  • 如何在WebBrowser控件中注入Javascript?

    我试过这个 string newScript textBox1 Text HtmlElement head browserCtrl Document GetElementsByTagName head 0 HtmlElement scrip
  • 无法从 Twin.macro 中的 Prop 获取值

    您可以在这里查看我正在尝试执行的操作的示例 https codesandbox io s vibrant leaf qj8vz https codesandbox io s vibrant leaf qj8vz 注意 这个特定的例子使用双宏
  • 从 url 角度加载模板并在 div 内编译

    由于我是 Angular JS 的新手 我想知道如何加载外部模板并将其与一些数据一起编译到目标中div 例如我有这个模板
  • apollo 客户端从存储中删除而不发生突变

    我需要通过 id 从本地存储中删除一条 记录 而不使用突变 因为服务器不支持突变 我尝试像这样手动访问商店 delete this apolloClient store getState apollo data 1112 这会删除记录 但是
  • 我将 X Y Z 坐标转换为屏幕 X Y 坐标有什么问题吗?

    我正在制作 3D 空间中弹跳的球体的 HTML5 Canvas 演示 这非常简单 每个球都有 X Y 和 Z 坐标 然后 这些坐标将转换为我在此处阅读的屏幕 X 和 Y 坐标 http answers google com answers
  • 未处理的承诺拒绝:Zone.js 检测到 ZoneAwarePromise `(window|global).Promise` 已被覆盖

    我尝试将 Angular2 快速入门代码合并到我当前的 webpack 构建中 似乎有些东西正在覆盖zone js抛出此错误的承诺 根据我见过的大多数 stackoverflow 帖子 zone js文件需要在任何可能包含承诺的文件之后加载
  • React TypeError:x 不是函数

    我在子组件中从父组件调用函数 booksRefresh 但出现错误 类型错误 booksRefresh 不是函数 我不知道为什么 因为 booksRefresh 是一个函数 有人可以帮我解释为什么会出现这个错误吗 这是我的代码 import
  • 在 Javascript 中创建数组

    我对 javascript 不太熟悉 并且在用 javascript 制作 2d 或者也许我可能需要 3d 数组时遇到了一些麻烦 我目前需要收集 2 条信息 一个 ID 和一个值 因此我创建了以下内容 var myArray var id
  • 右列固定的 Div 表

    我最近接手了一个非营利网站作为一个项目 我正在使用一个现有的网站 所以我必须使用很多已经编程的东西 所以我所要做的就是创建设计 I made a diagram of basically what I can t figure out ho
  • 如何设置javascript对象数组中所有对象的特定属性值(lodash)

    我有以下对象数组 var arr id a1 guid sdfsfd value abc status active id a2 guid sdfsfd value def status inactive id a2 guid sdfsfd
  • 允许 iframe 跨域链接到目标父框架

    我有 2 个域 域 1 上的一个页面使用 iframe 加载域 2 中的内容 如何允许来自domain2 iframe 内 的链接在domain1 的完整父框架中打开 我一直在关注IE和w3c的新沙箱属性 http www w3 org T
  • 将一维数组转换为二维数组[重复]

    这个问题在这里已经有答案了 我正在开发一个程序 我必须将文本文件中的值读入一维数组 我已经成功获取该一维数组中的数字 m1 1 2 3 4 5 6 7 8 9 但我希望数组是 m1 1 2 3 4 5 6 7 8 9 您可以使用此代码 co

随机推荐

  • xsl:使用多个元素对 XML 文件进行排序

    我正在尝试对 XML 文件中的一堆记录进行排序 诀窍是我需要对不同的节点使用不同的元素进行排序 举一个最简单的例子 我想这样做 给定一个 xml 文件
  • JSON 打印从根到叶的所有路径

    name Basic id home childrens name Dashboard viewtype custom view dashboard html childrens name DeviceInfo
  • 根据 Woocommerce 中的产品数量替换特定的购物车商品

    我正在尝试根据购物车中产品的数量更改购物车内容 我店里只有 5 种产品 产品 1 gt 1 个面板 Product 2 gt 12 个面板 Product 3 gt 18 个面板 Product 4 gt 30 个面板 Product 5
  • DAX 条件运行总计

    我有一个包含 2 列的表 ID and Numbers 我想创建一个新专栏Result与数字列的运行总计 但每次运行总计超过 20 时 应重新启动运行总计 此外 如果运行总计低于 20 则不应显示结果 这必须仅使用 DAX 来完成 谢谢指教
  • 为什么 Chrome 会向我的网站发送大量 GET 请求?

    我的 IIS 托管网站定期出现问题 其中一个客户端浏览器 Google Chrome 77 78 或更高版本 突然开始每秒向我的网站提交数十个针对同一页面的请求 对于我的应用程序 该用户始终是有效的 经过身份验证的用户 这些请求似乎也不遵循
  • 在 Rails 6 中测试 jquery

    我对编程和测试相当陌生 看看 jquery 是否适用于我的 Rails 6 设置 为了做到这一点 我有 创建了一个新的 Rails 应用程序 生成了一个脚手架 将以下代码插入到新创建的脚手架的index html erb视图中 div st
  • 如何使用 Mojolicious 上传多个文件?

    我是 Mojolicious 的新手 正在尝试学习它 我正在尝试使用表单上传多个文件 但一次仅上传一个文件 有什么建议吗 perl w use Mojolicious Lite use Mojo Upload use v5 14 get g
  • 如何显示使用“withdraw”方法隐藏的窗口?

    我想在打电话后显示一个窗口withdraw 以下是我当前的代码 from Tkinter import def callback global root root withdraw win2 Tk root Tk Label root te
  • 在画布中绘制矩形区域的弹出工具提示

    我有一个在 HTML5 中使用 JavaScript 填充的矩形区域 并且我需要添加一个工具提示弹出窗口 以便当用户在手持设备上触摸 单击它或在浏览器中将鼠标悬停在它上面时显示文本 我已经查看了 StackOverflow 上已有的示例 但
  • Spring Boot 4 不渲染 JSP 抛出 404

    我有以下项目结构 src main java com test Application java controllers MyController java webapp WEB INF jsp main jsp 我想做类似的事情this
  • JDBC Spring 中的错误 Sql 语法异常

    我是得到 org springframework jdbc BadSqlGrammarException 准备语句回调 错误的 SQL 语法 select cid 来自临床医生的临床医生代码 密码 名字 姓氏 临床医生代码 嵌套异常是 co
  • 如何使用 CloudFormation 为特定 Lambda 设置 Lambda 警报?

    这是CloudFormation的结构Alarm from AWS文档 https docs aws amazon com AWSCloudFormation latest UserGuide aws properties cw alarm
  • 如何使用 Google Guava 中的 Throwables.propagateIfInstanceOf()?

    javadoc 示例 http guava libraries googlecode com svn tags release08 javadoc com google common base Throwables html propaga
  • 如何成为一名优秀的Python程序员? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • macOS:向 Cocoa 绑定公开 Swift 属性的正确方法

    我正在 Mac 上开发一个现有的 Swift Objective C 项目 并在代码中创建一些 UI 我根据我管理的 NSTableView 中的选择启用一个按钮without使用 NSArrayController 出于原因 我有一处房产
  • 为什么 as.data.frame 忽略 col.names = vector

    我顽固地尝试在一行中创建一个具有命名行和列的数据框 我意识到我可以通过使用 colnames forecast 轻松地做到这一点 但想简化一下 如果只是为了证明我可以做到这一点 以下不起作用 没有错误 但未设置列名 forecast lt
  • 如何在 iPad 中调整网页大小/重新缩放

    我有一个网站 其移动版本使用 jquery mobile 当我将其从纵向更改为横向时 它会正确放大 但当我翻转到纵向时 它会保持相同的缩放级别 并且比视图更宽 这会破坏用户体验 我使用常规 从我所做的所有搜索来看 这应该可以 不幸的是它不适
  • 处理“超规范化”数据

    我的雇主是一家小型办公用品公司 正在更换供应商 我正在浏览他们的电子内容 以得出一个强大的数据库模式 我们之前的模式几乎是在没有任何思考的情况下拼凑在一起的 这几乎导致了一个令人难以忍受的数据模型 其中包含损坏的 不一致的信息 新供应商的数
  • Laravel 控制器/模型/视图的命名约定是什么?

    我记得听说你应该以特殊的方式命名你的控制器 模型和视图 可以是单数 也可以是复数 我不记得要命名哪些内容 而且我在文档中找不到任何有关它的信息 我猜是这样的 控制器是复数 视图是复数的 模型是单一的 我走在正确的轨道上吗 我知道这只是一个惯
  • 移动时切比雪夫距离 x 坐标错误

    所以我正在复制移相器切比雪夫距离示例 并在解决方案之后here https stackoverflow com questions 75478712 this gamestate variable not recognized phaser