libGdx 数组移除导致纹理闪烁
libGdx Array removal causes texture to flicker
我让我的相机沿 x 轴滚动,当我的地板对象离开屏幕时,我在屏幕边界之外添加了一个新的地板对象,并删除了离开视图的旧对象。
当且仅当我删除该对象时,它会导致该数组中的其他对象闪烁
这里是删除注释掉的代码。
batch.begin()
for(GameObject pillar: pillars) {
pillar.draw(batch);
if(pillar.getBounds().getX() + 64 < camera.position.x - SCREEN_WIDTH/2) {
//pillars.removeValue(pillar, false);
}
}
batch.end()
这是另一个我也添加到数组的例子
for(GameObject ceiling: ceilings) {
ceiling.draw(batch, SCREEN_WIDTH, CEILING_HEIGHT);
if((ceiling.getBounds().getX() + ceiling.getBounds().getWidth()) < (camera.position.x - SCREEN_WIDTH/2)) {
ceilings.add(new GameObject(boundsTexture, ceiling.getBounds().getX() + (ceiling.getBounds().getWidth()*2),SCREEN_HEIGHT - CEILING_HEIGHT, false));
//ceilings.removeValue(ceiling, false);
}
}
这是游戏对象class
public class GameObject {
protected Vector2 location;
private Rectangle bounds;
protected Texture frame;
protected TextureRegion currentFrame;
GameObject(Texture texture, float xLocation, float yLocation, boolean flippedV) {
frame = texture;
location = new Vector2(xLocation, yLocation);
bounds = new Rectangle( location.x, location.y,
frame.getWidth(),
frame.getHeight());
currentFrame = new TextureRegion(frame, 0, 0, 64, 64);
if(flippedV) {
currentFrame.flip(false, true);
}
}
public void draw(SpriteBatch batch) {
batch.draw(currentFrame, location.x, location.y);
}
public void draw(SpriteBatch batch, float width, float height) {
batch.draw(currentFrame, location.x, location.y, width, height);
}
public Rectangle getBounds() {
return bounds;
}
}
我应该提到我正在使用 deltaTime 移动相机,没有其他移动,
相机是正交的。
camera.translate(300*delta,0);
我也试过了
camera.translate((int)300*delta,0);
从 SpriteBatch 中删除添加和删除代码
batch.begin()
//remove the code that adds and removes from the Array
batch.end();
//put that code here
在循环访问 List 时,不应从 List 中删除值。尝试将要删除的对象保存在另一个列表中,并在 for 循环完成后将它们从支柱列表中删除。
您也可以尝试使用 Iterator。
我让我的相机沿 x 轴滚动,当我的地板对象离开屏幕时,我在屏幕边界之外添加了一个新的地板对象,并删除了离开视图的旧对象。
当且仅当我删除该对象时,它会导致该数组中的其他对象闪烁
这里是删除注释掉的代码。
batch.begin()
for(GameObject pillar: pillars) {
pillar.draw(batch);
if(pillar.getBounds().getX() + 64 < camera.position.x - SCREEN_WIDTH/2) {
//pillars.removeValue(pillar, false);
}
}
batch.end()
这是另一个我也添加到数组的例子
for(GameObject ceiling: ceilings) {
ceiling.draw(batch, SCREEN_WIDTH, CEILING_HEIGHT);
if((ceiling.getBounds().getX() + ceiling.getBounds().getWidth()) < (camera.position.x - SCREEN_WIDTH/2)) {
ceilings.add(new GameObject(boundsTexture, ceiling.getBounds().getX() + (ceiling.getBounds().getWidth()*2),SCREEN_HEIGHT - CEILING_HEIGHT, false));
//ceilings.removeValue(ceiling, false);
}
}
这是游戏对象class
public class GameObject {
protected Vector2 location;
private Rectangle bounds;
protected Texture frame;
protected TextureRegion currentFrame;
GameObject(Texture texture, float xLocation, float yLocation, boolean flippedV) {
frame = texture;
location = new Vector2(xLocation, yLocation);
bounds = new Rectangle( location.x, location.y,
frame.getWidth(),
frame.getHeight());
currentFrame = new TextureRegion(frame, 0, 0, 64, 64);
if(flippedV) {
currentFrame.flip(false, true);
}
}
public void draw(SpriteBatch batch) {
batch.draw(currentFrame, location.x, location.y);
}
public void draw(SpriteBatch batch, float width, float height) {
batch.draw(currentFrame, location.x, location.y, width, height);
}
public Rectangle getBounds() {
return bounds;
}
}
我应该提到我正在使用 deltaTime 移动相机,没有其他移动, 相机是正交的。
camera.translate(300*delta,0);
我也试过了
camera.translate((int)300*delta,0);
从 SpriteBatch 中删除添加和删除代码
batch.begin()
//remove the code that adds and removes from the Array
batch.end();
//put that code here
在循环访问 List 时,不应从 List 中删除值。尝试将要删除的对象保存在另一个列表中,并在 for 循环完成后将它们从支柱列表中删除。
您也可以尝试使用 Iterator。