gpt4 book ai didi

java - 场景 2D 与视口(viewport)坐标和游戏坐标的分离

转载 作者:行者123 更新时间:2023-12-01 09:53:47 26 4
gpt4 key购买 nike

为了练习我的 Java 技能,我一直在开发一个基本的贪吃蛇游戏。对于 java,我使用 LibGDX 和 Scene2d 来处理我的所有对象。

现在,贪吃蛇游戏的边界设置为视口(viewport)尺寸。每当蛇到达视口(viewport)外部时就会检查碰撞。我使用的屏幕视口(viewport)已合并到舞台中,如下所示。

private AudioSnake gameCore;
private Stage gameStage;
private Image background;
private Image snakeTip;
private Image food;
private ArrayList<Image> snakeTail = new ArrayList <Image>(); // all the snake tail bits
private ScreenViewport viewport;

public GameScreen(AudioSnake audioSnake) {
gameCore = audioSnake;
viewport = new ScreenViewport();
gameStage = new Stage(viewport);
Gdx.input.setInputProcessor(gameStage);
uiSkin = new Skin(Gdx.files.internal("Ui/uiskin.json"));
scoreLabel = new Label(String.format("%.0f",score),uiSkin);
generateUi();
generateFood();
}

碰撞检查代码:

    public void collisionCheck(){ // method that checks rather the snake head is touching outside the border, or inside it's own body
if(snakeTip.getX() >= gameStage.getWidth() || snakeTip.getY() >= gameStage.getHeight() || snakeTip.getX() <= 0 || snakeTip.getY() <= 0){
System.out.println("death activated");
activateDeath();
}
else{
for(int i = 0; i < snakeTail.size(); i++){
if(snakeTip.getX() == snakeTail.get(i).getX() && snakeTip.getY() == snakeTail.get(i).getY()){
System.out.println("death activated");
activateDeath();
}
}
}
}

这样做的一个大问题是游戏机制很大程度上受到屏幕尺寸的影响。我想要的是蛇在其中移动的虚拟区域(几乎就像它自己的坐标系),该区域与视口(viewport)分开。至于视口(viewport),如果可能的话,我宁愿它保留为屏幕视口(viewport)。最好的方法是什么?

最佳答案

ScreenViewport在这里并不好,因为你的游戏在智能手机屏幕上看起来会很好看,而平板电脑屏幕的中心会是一个小多边形。您应该考虑使用 FitViewport这将在您的屏幕上添加一个栏,但可以为每个设备保持相同的区域大小。

要定义虚拟屏幕的分辨率,只需将其传递到视口(viewport)的构造函数

    private FitViewport viewport;

public GameScreen(AudioSnake audioSnake) {
gameCore = audioSnake;
viewport = new ScreenViewport(SCREEN_WIDTH_IN_PX, SCREEN_HEIGHT_IN_PX);
gameStage = new Stage(viewport);

那么您还需要覆盖resize()方法以使您的视口(viewport)可更新

    @Override
public void resize(int width, int height) {
viewport.update(width, height);
}

此外,在您的 render() 方法中,您需要在渲染舞台之前应用视口(viewport)

    viewport.apply();
stage.act(delta);
stage.draw();
<小时/>

完成所有这些之后,您可以只使用自定义的SCREEN_WIDTH_IN_PX,而不是gameStage.getWidth()

关于java - 场景 2D 与视口(viewport)坐标和游戏坐标的分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37397344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com