java - 使用 camera.unproject 重新渲染纹理会在相机移动时设置错误的位置
问题描述
问题
当我移动相机时,每个正在渲染的纹理都会在 2 个不同的位置上围绕屏幕闪烁。
我想要的是
示例:当我将相机向左移动时,我希望所有纹理向右移动 32 个像素。每按一次按钮,相机移动 32 个像素。
当前代码
我在评论中添加了一些额外的解释。
主程序入口点
/**
* DefaultCamera: Setting up OrthographicCamera
* CameraMovement: Using camera.translate on keypresses to move the screen.
* TestMoveable: Creating a texture for testing rendering.
*/
public class WorldSimGame extends ApplicationAdapter {
private DefaultCamera defaultCamera;
private CameraMovement cameraMovement;
private TestMoveable testMoveable;
// Setting up the camera and texture.
public void create () {
defaultCamera = new DefaultCamera();
cameraMovement = new CameraMovement(defaultCamera.getCamera());
testMoveable = new TestMoveable();
testMoveable.create(defaultCamera);
}
// The testMoveable.render(defaultCamera) should keep track of the testMoveable position
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
defaultCamera.render();
testMoveable.render(defaultCamera);
}
}
测试可移动
public class TestMoveable {
private Texture tex;
private SpriteBatch batch;
private Vector3 position;
public void create(DefaultCamera defaultCamera) {
tex = new Texture(("wall.png"));
batch = new SpriteBatch();
position = new Vector3(100, 100, 0);
defaultCamera.getCamera().unproject(position);
}
我无法想象在世界坐标上设置 x 和 y 坐标是行不通的。
public void render(DefaultCamera defaultCamera) {
batch.begin();
batch.draw(tex, position.x, position.y);
batch.end();
}
}
我在这里做错了什么?有没有更好的方法来实现渲染器的位置检查?
解决方案
您无需检查渲染器的位置。您必须做的就是设置camera
. 然后和batch.setProjectionMatrix(camera.combined)
你说批处理来画相机看到的东西。
因此,当您创建尺寸 = 50x50 且位置 = 100,100 的相机时,
现在创建Texture
尺寸 = 50x50 且位置 = 75,75
的相机时,纹理将完全适合孔屏。
摄像头的位置在中心。所以位置Texture
是 75,75 而不是 100,100
当你现在要移动你的相机时,你可以使用方法:translate()
你的相机。
呼叫:camera.translate(25,0)
将您的相机向右移动 25 个单位,现在您只能Texture
在屏幕左侧看到一半。
这是可移动相机的一个简单示例。您可以使用箭头键四处移动:
public class WorldSimGame extends ApplicationAdapter {
private OrthographicCamera camera;
private SpriteBatch batch;
private Texture texture;
public WorldSimGame() { }
@Override
public void create(){
//Create texture, batch and camera
texture = new Texture(Gdx.files.internal("badlogic.jpg"));
batch = new SpriteBatch();
camera = new OrthographicCamera(60,60);
}
@Override
public void render(){
//clear screen
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
moveCamera();
//update camera that he recalculate his position and Matrix
camera.update();
batch.setProjectionMatrix(camera.combined); //set batch to draw what the camera sees
batch.begin();
batch.draw(texture,0,0); //draw texture
batch.end();
}
private void moveCamera(){
//move camera
if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)){
camera.translate(4,0);
}
if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
camera.translate(-4,0);
}
if(Gdx.input.isKeyPressed(Input.Keys.UP)){
camera.translate(0,4);
}
if(Gdx.input.isKeyPressed(Input.Keys.DOWN)){
camera.translate(0,-4);
}
}
}
推荐阅读
- javascript - 通过javascript AWS sdk将图像上传到S3会导致“[object object]”字符串
- openid-connect - OpenIdDict(代码流) - 处理访问令牌过期
- php - 如何使我的登录页面易受 SQL 注入攻击?
- javascript - chart.js 从数据集标签修改样式
- mysql - mysql触发信息从一对多关系插入和更新触发器
- javascript - 根据属性值从对象数组中获取值
- actionscript-3 - AS3计时器在游戏中工作
- python - 通过字段连接两个表时,Python不返回数据
- java - 如何正确返回基于用户 ID 显示数据的数组列表?
- python - TypeError:“str”对象不能解释为整数。创建一个新的 .csv 文件。键错误:'Id'