You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏空间坐标转GUI屏幕坐标计算问题求助

游戏空间到屏幕空间坐标转换问题求助

我用JavaScript开发自制游戏引擎,多数功能运行正常,但遇到了游戏空间(game space)坐标转换为屏幕空间(screen space)坐标的问题。

相机类中计算实体屏幕位置的现有代码

draw(Engine, Entity, FollowEntity){
    var x = Entity.render_position.x - (FollowEntity.render_position.x - Engine.rendersize.x / 2) - (Entity._get_render_size().x / 2);
    var y = Entity.render_position.y - (FollowEntity.render_position.y - Engine.rendersize.y / 2) - (Entity._get_render_size().y / 2);
    var _x = Entity.render_position.x - (FollowEntity.render_position.x - Engine.rendersize.x / 2);
    var _y = Entity.render_position.y - (FollowEntity.render_position.y - Engine.rendersize.y / 2);

    Engine.ctx.save();  
    Engine.ctx.translate(_x, _y);
    Engine.ctx.rotate(Entity.rotation * Math.PI / 180);
    Engine.ctx.translate(-_x, -_y);
    Engine.ctx.drawImage(Engine.rasterizer.get_cached_img(Entity), x, y); /**/
    Engine.ctx.restore();       
}

我尝试过的转换代码

尝试1

// 计算实体在游戏世界中的位置
var gameX = this.ContextEntity.position.x;
var gameY = this.ContextEntity.position.y;

// 计算相机在游戏世界中的位置
var cameraX = this.Engine.follow_entity.position.x;
var cameraY = this.Engine.follow_entity.position.y;

// 计算实体在屏幕上的位置,考虑游戏实体与GUI元素的像素尺寸差异
var screenX = (gameX - cameraX) * this.GUI.rasterizer.pixel_size / this.Engine.rasterizer.pixel_size;
var screenY = (gameY - cameraY) * this.GUI.rasterizer.pixel_size / this.Engine.rasterizer.pixel_size;

// 调整实体屏幕位置以适配实体尺寸
screenX -= this.ContextEntity._get_render_size().x / 2;
screenY -= this.ContextEntity._get_render_size().y / 2;

尝试2

gameToScreen(game) {
    var game1 = (typeof game.x !== 'undefined') ? game.x : game[0];
    var game2 = (typeof game.y !== 'undefined') ? game.y : game[1];
    var x = game1 - (this.control_entity._get_render_midpoint().x - (this.rendersize.x / 2)) / this.rasterizer.pixel_size;
    var y = game2 - (this.control_entity._get_render_midpoint().y - (this.rendersize.y / 2)) / this.rasterizer.pixel_size;
    return new Vec2(Math.floor(x), Math.floor(y));
}

另外,之前有一个尝试方法仅在引擎实体的像素乘数为0时有效。

内容的提问来源于stack exchange,提问作者Nik Hendricks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:15:44