当前位置: 首页 > 知识库问答 >
问题:

libGDX纹理被“拉伸”

耿志义
2023-03-14
import java.util.Iterator;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.Array;
import com.data.Manager;

public class GameScreen implements Screen{

private Texture backgroundTexture = Manager.manager.get(("Ressources/Hintergrund_Skizze.png"), Texture.class);
private Texture farmerBackTexture = Manager.manager.get(("Ressources/Farmer_Back_Skizze.png"), Texture.class);
private Texture farmerRightTexture = Manager.manager.get(("Ressources/Farmer_Right_Skizze.png"), Texture.class);
private Texture farmerLeftTexture = Manager.manager.get(("Ressources/Farmer_Left_Skizze.png"), Texture.class);
private Texture ufoTexture = Manager.manager.get(("Ressources/Ufo_Skizze.png"), Texture.class);
private Texture laserTexture = Manager.manager.get(("Ressources/Magic_Ball.png"), Texture.class);

private Image backgroundImage = new Image(backgroundTexture);
private Image farmerBackImage = new Image(farmerBackTexture);

private Stage levelStage = new Stage(), menuStage = new Stage();

private Table menuTable = new Table();

private Skin menuSkin = Manager.menuSkin;

private OrthographicCamera camera;

private SpriteBatch batch;

private Rectangle farmer, ufo;
private Array<Rectangle> lasers;

private boolean ufoMovementLeft = true;
private boolean leftArrow = false;
private boolean rightArrow = false;

private float laserMovement = 0;
private int ufoLife = 15;

@Override
public void show() {

    levelStage.addActor(backgroundImage);
    levelStage.addActor(farmerBackImage);
    Gdx.input.setInputProcessor(levelStage);
    camera = new OrthographicCamera();
    camera.setToOrtho(false, 800, 480);
    batch = new SpriteBatch();

    farmer = new Rectangle();
    farmer.x = 800 / 2 - 80 / 2; farmer.y = 80;
    farmer.width = 80; farmer.height = 270;

    ufo = new Rectangle();
    ufo.x = 800 / 2; ufo.y = 375;
    ufo.width = 185; ufo.height = 94;

    lasers = new Array<Rectangle>();
}

public void movement() {

    if(Gdx.input.isKeyPressed(Keys.LEFT)) leftArrow = true;
    if(!Gdx.input.isKeyPressed(Keys.LEFT)) leftArrow = false;
    if(Gdx.input.isKeyPressed(Keys.RIGHT)) rightArrow = true;
    if(!Gdx.input.isKeyPressed(Keys.RIGHT)) rightArrow = false;

}

@Override
public void render(float delta) {

     Gdx.gl.glClearColor(0, 0, 0, 1);
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
     camera.update();
     levelStage.act();
     levelStage.draw();

     batch.setProjectionMatrix(camera.combined);
     batch.begin();
     movement();
     if(leftArrow) {if(farmer.x >= 60) farmer.x -= 2; batch.draw(farmerLeftTexture, farmer.x, farmer.y);}
     else if(rightArrow) {if(farmer.x <= 590) farmer.x += 2; batch.draw(farmerRightTexture, farmer.x, farmer.y);}
     else batch.draw(farmerBackTexture, farmer.x, farmer.y);

     batch.end();
}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public void hide() {
}

@Override
public void dispose() {
    levelStage.dispose(); menuStage.dispose();
    menuSkin.dispose();
    ufoTexture.dispose();
    laserTexture.dispose();
    farmerBackTexture.dispose();
    farmerRightTexture.dispose();
    farmerLeftTexture.dispose();
}}

我希望你能帮我找到错误。干杯,Joshflux

编辑:我很确定,它必须做一些事情与窗口的大小。如果我将窗口的高度从800调整为200,那么左角的人看起来是一样的,但是中间的人要小得多。但还是不知道怎么解决...

共有1个答案

杭涵映
2023-03-14

问题是您的levelStage使用了不同的相机。

new Stage();

创建一个具有自己的摄像机和缩放视区的舞台。在这里创建另一个相机:

camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);

注意,这并不设置窗口大小!

batch.setProjectionMatrix(levelStage.getCamera().combined);
 类似资料:
  • 如果我创建一个.png 1024 x 1024的纹理,并在中间画一个124 x 124的圆,它的周围将是空的,它使用的RAM是否与我在124x124空间上画一个124 x 124的圆相同?

  • 再详细一点。我不使用Block2D。瓦片大小由8x8缩放为20x20。使用没有填充的texturepacker(无论如何填充都会出现问题)。我不知道该发布哪段代码,因为我不知道问题可能出在哪里,所以这里只是简单的块类。如果有任何帮助,我将不胜感激,谢谢。

  • 我用libgdx和box2d做卡车游戏。在我的游戏中,1米=100像素。我的2D地形是由我生成的,是由点制作的。 我所做的,是为整个多边形创建一个polygonregion并使用texturewrap.repeat。问题是,我的游戏大小被缩小了100倍,以适应box2d单位。 所以我的相机宽度是800/100,高度是480/100。(8x4.8像素)

  • 我试图旋转纹理时,我画他们。我认为这样做比在Paint.NET中旋转图像90度并将它们保存在不同的文件中更有意义。我查看了api文档中spritebatch绘图参数,但我就是不明白。有一堆参数,比如srcX、srcY、originX等等。我也想知道如何做同样的纹理区域。以下是api文档页面的链接:http://libgdx.badlogicgames.com/nightlies/docs/api/

  • 我刚刚决定将Slick2D改为libgdx。然而,为了能够将我的游戏移植到LibGDX,我需要帮助理解如何从我的游戏数据文件在LibGDX中创建纹理。 我的游戏数据文件是加密的,图像是用base64编码的,所以我可以把它们都保存在一个txt文件中。如何从ByteArrayInputStream创建LibGDX纹理。 编辑:我刚刚想通了,有点。我是这样做的: 然而,现在图像是垂直翻转的...我是不是

  • 我正在尝试同时渲染背景和我的角色动画和我的角色工具。这件事看起来很琐碎,但我还是搞不懂。这里是我现在为我的呈现所提供的代码。 现在,当我运行以下代码时(将切换到底部): 这是结果 我就是找不到一个模式,总是一个凌驾于另一个之上。我会非常感激我的失落。谢谢!!