我在LibGDX中创建游戏。我已经使用Pixel Dungeon中使用的图块并使用Tiled创建了图块地图。
主角的类是Actor
的子类,因为角色是动画的,我使用这段代码来绘制精灵:
if (direction.isEastwards() || direction.isNorthwards()) {
Vector3 projectedPosition = getLocation().getCamera().project(
new Vector3(16 * getX() + 1, Gdx.graphics.getHeight()
- (16 * getY()) - 15, 0));
batch.draw(current.getKeyFrame(
animTime += Gdx.graphics.getDeltaTime(), true),
projectedPosition.x, projectedPosition.y);
} else {
Vector3 projectedPosition = getLocation().getCamera().project(
new Vector3(16 * getX() + 13, Gdx.graphics.getHeight()
- (16 * getY()) - 15, 0));
batch.draw(current.getKeyFrame(
animTime += Gdx.graphics.getDeltaTime(), true),
projectedPosition.x, projectedPosition.y);
}
当我在Eclipse中启动游戏时,精灵最初出现在正确的位置。但是,如果我调整屏幕大小,精灵将停在正确的位置,最终会从地图上消失。
在我开始使用投影之前发生了同样的事情,我发现问题与投影有关。因为这是一个我没有探索过的领域,所以我决定在一小时后能够解决这个问题寻求帮助。
动画会根据角色面向的方向翻转,这就是if / else子句在那里的原因。
附录:使用new Stage(new ExtendViewport(800,600),batch);
创建舞台,调整大小方法更新相机,批处理设置为投影矩阵。
以下是更相关的代码:
相机和地图初始化:
camera=new OrthographicCamera();
camera.setToOrtho(false,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
mapRenderer=new OrthogonalTiledMapRenderer(map,batch);
渲染方法:
camera.update();
batch.setProjectionMatrix(camera.combined);
mapRenderer.setView(camera);
mapRenderer.render();
stage.act();
stage.draw();
调整方法:
camera.viewportWidth=width;
camera.viewportHeight=height;
camera.update();
演员绘制方法:
@Override
public void draw(Batch batch, float parentAlpha) {
Color color = getColor();
batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
if (direction.isEastwards() || direction.isNorthwards()) {
Vector3 projectedPosition = getLocation().getCamera().project(
new Vector3(16 * getX() + 1, Gdx.graphics.getHeight()
- (16 * getY()) - 15, 0));
batch.draw(current.getKeyFrame(
animTime += Gdx.graphics.getDeltaTime(), true),
projectedPosition.x, projectedPosition.y);
} else {
Vector3 projectedPosition = getLocation().getCamera().project(
new Vector3(16 * getX() + 13, Gdx.graphics.getHeight()
- (16 * getY()) - 15, 0));
batch.draw(current.getKeyFrame(
animTime += Gdx.graphics.getDeltaTime(), true),
projectedPosition.x, projectedPosition.y);
}
// Walk animation displays for 0.2 seconds
if (current == walk && animTime >= 0.2) {
current = idle;
animTime = 0;
}
}
答案 0 :(得分:1)
我认为它引起的问题是因为你没有将精灵与相机投影结合起来。像这样设置你的spriteBatch:
import { Component, OnInit, NgZone } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import * as html2canvas from "html2canvas";
@Component({
selector: 'test',
templateUrl: 'app/components/view/view.component.html',
styleUrls: ['app/components/view/view.component.css']
})
export class ViewComponent {
constructor(
private sanitizer: DomSanitizer,
private window: WindowRef) {
}
ngOnInit() {
this.pdfDownload();
}
pdfDownload() {
html2canvas(document.body).then(function (canvas) {
var imgData = canvas.toDataURL("image/png");
});
}
}
并且不要错过调整大小方法中的更新视口:
spriteBatch.setProjectionMatrix(camera.combined);
有了这个,你可以调整缩放比例,将它调整的spriteBatch调整到相机投影。