gpt4 book ai didi

android - Box2d坐标系

转载 作者:行者123 更新时间:2023-11-30 01:57:05 26 4
gpt4 key购买 nike

在我尝试编写代码的游戏中,我必须有两个 body 。一个 StaticBody 和一个 DynamicBody。我想在 StaticBody 之上放置 DynamicBody。不知何故,我得到的是:

Bug

是否有可能视口(viewport)左下角不在 0,0 处?为什么 DynamicBody 不能超越 StaticBody?

Gamescreen.java

package com.joelbrun.jetskirider.screens;

import com.badlogic.gdx.Gdx;
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.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.utils.Scaling;
import com.badlogic.gdx.utils.viewport.ScalingViewport;
import com.badlogic.gdx.utils.viewport.Viewport;


public class Gamescreen implements Screen {

private static final float TIMESTEP = 1 / 60;
private static final int VELOCITY_ITERATIONS = 8;
private static final int POSITION_ITERATIONS = 3;
public static final int GAMESCREEN_WIDTH = 1920;
public static final int GAMESCREEN_HEIGHT = 720;
public static final int OBSTACLE_TYPES = 5;
private static final int WATER_HEIGHT = 200;
private static final float JETSKI_BOX_X = 200;
private static final float JETSKI_BOX_Y = 100;
private World world;
private Box2DDebugRenderer debugRenderer;
public Texture jetski, wave;
public Sprite background;
public SpriteBatch batch;
public OrthographicCamera camera;
public Label score;
Viewport viewport;

@Override
public void show() {
world = new World(new Vector2(0, -9.81f), true);
debugRenderer = new Box2DDebugRenderer();
Texture[] texture = new Texture[OBSTACLE_TYPES];

//Textures
for (int i=0; i<OBSTACLE_TYPES; i++){
texture[i] = new Texture(Gdx.files.internal("game/obstacles/obstacle" + Integer.toString(i+1)+".png"));
}
background = new Sprite(new Texture("game/background.png"));
jetski = new Texture("game/jetski.png");
wave = new Texture("game/water1.png");
batch = new SpriteBatch();

//Camera & Viewport
camera = new OrthographicCamera();

viewport = new ScalingViewport(Scaling.fillY, GAMESCREEN_WIDTH, GAMESCREEN_HEIGHT, camera);
viewport.apply();
camera.position.set(GAMESCREEN_WIDTH / 2, GAMESCREEN_HEIGHT / 2, 0);


//body definition Water
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.StaticBody;
bodyDef.position.set(0, 0);
Body body = world.createBody(bodyDef);


//shape
PolygonShape box = new PolygonShape();
box.setAsBox(2560, WATER_HEIGHT);

//fixture definition
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = box;
fixtureDef.density = 1000;
fixtureDef.friction = .25f;
fixtureDef.restitution = .1f;

Fixture fixture = body.createFixture(fixtureDef);

box.dispose();

//Jetski
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(1280,WATER_HEIGHT + 100);

Body jetskiObject = world.createBody(bodyDef);

PolygonShape jetskiBox = new PolygonShape();
jetskiBox.setAsBox(JETSKI_BOX_X, JETSKI_BOX_Y);

fixtureDef.shape = jetskiBox;
fixtureDef.density = 100;
fixtureDef.friction = 0;

Fixture jetskiFixture = body.createFixture(fixtureDef);

jetskiBox.dispose();
}

@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

debugRenderer.render(world, camera.combined);

batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.end();
camera.update();

world.step(TIMESTEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
}

@Override
public void resize(int width, int height) {
int SCREEN_WIDTH = width;
int SCREEN_HEIGHT = height;

viewport.setWorldSize(GAMESCREEN_WIDTH, GAMESCREEN_HEIGHT);
viewport.update(SCREEN_WIDTH, SCREEN_HEIGHT,true);
camera.update();
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {
dispose();
}

@Override
public void dispose() {
batch.dispose();
background.getTexture().dispose();
jetski.dispose();
wave.dispose();
world.dispose();
debugRenderer.dispose();
}


}

最佳答案

是的,对于 Box2D,原点是视口(viewport)的左下角。

您可以在设置 BodyDef 时设置 body 的位置:

bodyDef.position.set(x, y);

并且不要忘记,在 Box2D 中,您 body 的位置是 Body 的中心。因此,当您将 PolygonShape 设置为这样的框时:

polygonShape.setAsBox(width, height);

您的实际盒子宽度将是 width*2,您的实际盒子高度将是 height*2

关于android - Box2d坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32057986/

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