在瓷砖地图libgdx上显示精灵

时间:2017-06-14 19:25:50

标签: java libgdx

我在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;
    }
}

1 个答案:

答案 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调整到相机投影。