实体在到达屏幕边缘时减速
Entity slowing down when reaching the edge of the screen
这是我的核心项目:
public class GameClass extends Game {
public static int screenWidth, screenHeight;
public static CustomScreen currentScreen;
public static PlayScreen playScreen;
@Override
public void create () {
screenWidth = Gdx.graphics.getWidth();
screenHeight = Gdx.graphics.getHeight();
CustomScreen.initialize();
playScreen = new PlayScreen(this);
SetScreen(playScreen);
}
public void SetScreen(CustomScreen screen) {
currentScreen = screen;
setScreen(currentScreen);
}
}
public abstract class CustomScreen implements Screen {
GameClass game;
static BitmapFont font;
static SpriteBatch batcher;
static OrthographicCamera cam;
public CustomScreen(GameClass game) {
this.game = game;
}
public static void initialize() {
cam = new OrthographicCamera();
cam.setToOrtho(true, GameClass.screenWidth, GameClass.screenHeight);
batcher = new SpriteBatch();
batcher.setProjectionMatrix(cam.combined);
font = new BitmapFont();
font.setScale(4f, -4f);
}
public void Clear() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
}
@Override
public abstract void render(float delta);
}
public class PlayScreen extends CustomScreen {
public static final int speed = 300;
public ArrayList<Entity> entityList;
Random rand = new Random();
float timer = rand.nextInt(2) + rand.nextFloat();
public PlayScreen(GameClass game) {
super(game);
entityList = new ArrayList<Entity>();
}
void update(float delta) {
timer -= delta;
if (timer <= 0) {
entityList.add(new Enemy(GameClass.screenWidth, rand.nextInt(GameClass.screenHeight - Enemy.Height)));
timer += rand.nextInt(2) + rand.nextFloat() + 1/2;
}
for (int i = entityList.size(); i > 0; --i)
entityList.get(i-1).update(delta);
}
@Override
public void render(float delta) {
Clear();
update(delta);
batcher.begin();
for (int i = 0; i < entityList.size(); ++i) {
entityList.get(i).Display(batcher);
}
if (entityList.size() > 1)
System.out.println(entityList.get(1).posX - entityList.get(0).posX);
batcher.end();
}
}
public abstract class Entity {
protected Sprite sprite;
public int posX, posY, width, height;
public Entity(int posX, int posY, int width, int height) {
this.posX = posX;
this.posY = posY;
this.width = width;
this.height = height;
}
public abstract void update(float delta);
public void Display(SpriteBatch batcher) {
batcher.draw(sprite, posX, posY, width, height);
}
}
public class Enemy extends Entity {
static Sprite texture = new Sprite(new Texture(Gdx.files.internal("enemy.png")));
public static int Width = 300, Height = 200;
public Enemy(int posX, int posY) {
super(posX, posY, Width, Height);
this.sprite = Enemy.texture;
}
@Override
public void update(float delta, int i) {
posX -= delta * PlayScreen.speed;
if (posX + width < 0) {
GameClass.playScreen.entityList.remove(this);
}
}
}
在 PlayScreen 中,敌人不断随机生成,并以恒定速度(最终整数 300)从屏幕右侧移动到左侧。但是当它们到达屏幕的左边缘时(当 posX <= 0 时),它们会减速,原因不明。问题是,当敌人到达屏幕边缘时,我没有编写任何程序。(我编写了当他们完全在屏幕之外时消失的程序,当 posX + width <= 0,但这与我的问题无关,因为即使我删除它,它们在到达屏幕边缘时也会继续减速)。
它发生在桌面和 android 项目中,所以这肯定来自核心项目。
我不知道为什么会这样,这真的非常尴尬。
这里有几张图片向您展示了发生的事情。
http://i.stack.imgur.com/DrOSH.png
http://i.stack.imgur.com/Zjtju.png
我们可以看到第二张图上的两个敌人比第一张图更近
你可以把PlayScreen.speed设置成100而不是300,会更明显。
如果你把它设置得足够低,比如20,敌人不仅会减速,他们基本上会停止移动。
我迷路了,不知道如何解决这个问题。如果你有,欢迎分享。
我不太确定,但我猜你在 Enemy class 中涉及 delta
的计算会四舍五入(因为 PlayScreen.Speed
是整数)。
具有足够低的 PlayScreen.Speed
或足够低的 delta
将导致 delta * PlayScreen.Speed
成为 0.something,在转换为整数时将截断为 0,导致 posX
永远不会改变。
我通常在所有涉及位置的计算中使用浮点数(例如 posX
和 posY
等等...),以便在屏幕上绘制某些内容之前不会发生这种切断(因为像素总是整数)。这会产生更准确的结果,并解决了屏幕上移动的许多问题。
我修好了。问题是 Enemy.posX 是一个整数而不是一个浮点数。
这是我的核心项目:
public class GameClass extends Game {
public static int screenWidth, screenHeight;
public static CustomScreen currentScreen;
public static PlayScreen playScreen;
@Override
public void create () {
screenWidth = Gdx.graphics.getWidth();
screenHeight = Gdx.graphics.getHeight();
CustomScreen.initialize();
playScreen = new PlayScreen(this);
SetScreen(playScreen);
}
public void SetScreen(CustomScreen screen) {
currentScreen = screen;
setScreen(currentScreen);
}
}
public abstract class CustomScreen implements Screen {
GameClass game;
static BitmapFont font;
static SpriteBatch batcher;
static OrthographicCamera cam;
public CustomScreen(GameClass game) {
this.game = game;
}
public static void initialize() {
cam = new OrthographicCamera();
cam.setToOrtho(true, GameClass.screenWidth, GameClass.screenHeight);
batcher = new SpriteBatch();
batcher.setProjectionMatrix(cam.combined);
font = new BitmapFont();
font.setScale(4f, -4f);
}
public void Clear() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
}
@Override
public abstract void render(float delta);
}
public class PlayScreen extends CustomScreen {
public static final int speed = 300;
public ArrayList<Entity> entityList;
Random rand = new Random();
float timer = rand.nextInt(2) + rand.nextFloat();
public PlayScreen(GameClass game) {
super(game);
entityList = new ArrayList<Entity>();
}
void update(float delta) {
timer -= delta;
if (timer <= 0) {
entityList.add(new Enemy(GameClass.screenWidth, rand.nextInt(GameClass.screenHeight - Enemy.Height)));
timer += rand.nextInt(2) + rand.nextFloat() + 1/2;
}
for (int i = entityList.size(); i > 0; --i)
entityList.get(i-1).update(delta);
}
@Override
public void render(float delta) {
Clear();
update(delta);
batcher.begin();
for (int i = 0; i < entityList.size(); ++i) {
entityList.get(i).Display(batcher);
}
if (entityList.size() > 1)
System.out.println(entityList.get(1).posX - entityList.get(0).posX);
batcher.end();
}
}
public abstract class Entity {
protected Sprite sprite;
public int posX, posY, width, height;
public Entity(int posX, int posY, int width, int height) {
this.posX = posX;
this.posY = posY;
this.width = width;
this.height = height;
}
public abstract void update(float delta);
public void Display(SpriteBatch batcher) {
batcher.draw(sprite, posX, posY, width, height);
}
}
public class Enemy extends Entity {
static Sprite texture = new Sprite(new Texture(Gdx.files.internal("enemy.png")));
public static int Width = 300, Height = 200;
public Enemy(int posX, int posY) {
super(posX, posY, Width, Height);
this.sprite = Enemy.texture;
}
@Override
public void update(float delta, int i) {
posX -= delta * PlayScreen.speed;
if (posX + width < 0) {
GameClass.playScreen.entityList.remove(this);
}
}
}
在 PlayScreen 中,敌人不断随机生成,并以恒定速度(最终整数 300)从屏幕右侧移动到左侧。但是当它们到达屏幕的左边缘时(当 posX <= 0 时),它们会减速,原因不明。问题是,当敌人到达屏幕边缘时,我没有编写任何程序。(我编写了当他们完全在屏幕之外时消失的程序,当 posX + width <= 0,但这与我的问题无关,因为即使我删除它,它们在到达屏幕边缘时也会继续减速)。
它发生在桌面和 android 项目中,所以这肯定来自核心项目。
我不知道为什么会这样,这真的非常尴尬。
这里有几张图片向您展示了发生的事情。
http://i.stack.imgur.com/DrOSH.png
http://i.stack.imgur.com/Zjtju.png
我们可以看到第二张图上的两个敌人比第一张图更近
你可以把PlayScreen.speed设置成100而不是300,会更明显。 如果你把它设置得足够低,比如20,敌人不仅会减速,他们基本上会停止移动。
我迷路了,不知道如何解决这个问题。如果你有,欢迎分享。
我不太确定,但我猜你在 Enemy class 中涉及 delta
的计算会四舍五入(因为 PlayScreen.Speed
是整数)。
具有足够低的 PlayScreen.Speed
或足够低的 delta
将导致 delta * PlayScreen.Speed
成为 0.something,在转换为整数时将截断为 0,导致 posX
永远不会改变。
我通常在所有涉及位置的计算中使用浮点数(例如 posX
和 posY
等等...),以便在屏幕上绘制某些内容之前不会发生这种切断(因为像素总是整数)。这会产生更准确的结果,并解决了屏幕上移动的许多问题。
我修好了。问题是 Enemy.posX 是一个整数而不是一个浮点数。