[英]Java-Tile Map Image Flickering-What can i do to stop this?
我正在制作一個吃豆子游戲,我在一個數組中有一個 MAP,我在地圖中分配了不同的值來繪制不同的圖像,以創建一個吃豆子地圖……但它到處都在閃爍
任何確定問題的幫助都會很棒
我意識到這是大量閱讀,但我已經看了幾個小時並沒有弄清楚......我是編程新手,所以我認為更有經驗的眼睛真的可以讓我受益
public void drawMap() {
BufferStrategy bs = this.getBufferStrategy();
do {
do {
Graphics g = null;
g = getGraphics();
try {
for (int x = 0; x < graphics.map.width; x++) {
for (int y = 0; y < graphics.map.height; y++) {
tile = graphics.map.level1[y][x];
//System.out.println(y + ", " + x);
int tileX = x * 21; //(int) (x * 21.42857142857143);
int tileY = y * 26; //(int) (y * 25.80645161290323);
if (tile == 0) {
g.drawImage(wall, tileX, tileY, 21, 26, null);
//System.out.println(x + ", " + y);
}
if (tile == 1) {
//g.drawImage(space,tileX, tileY, (int)21.42857142857143, (int) 25.80645161290323,null);
}
}
}
} finally {
g.dispose();
}
} while (bs.contentsRestored());
bs.show();
} while (bs.contentsLost());
}
public void render() {
BufferStrategy bs = this.getBufferStrategy();
do {
do {
drawn = false;
Graphics g = null;
try {
g = bs.getDrawGraphics();
if (MAIN_MENU == false && GAME == true) {
if (level1test) {
if (!drawn) {
drawMap();
drawn = true;
}
//g.drawImage(level1,0,0,getWidth(),getHeight(),null);
}
if (level2test == true) {
g.drawImage(level2, 0, 0, getWidth(), getHeight(), null);
}
g.drawImage(point, playerX, playerY, playerHeight, playerWidth, null);
} else if (MAIN_MENU == false && GAME == false) {
g.drawImage(settingsBackground, 0, 0, getWidth(), getHeight(), null);
} else {
g.drawImage(background, 0, 0, getWidth(), getHeight(), null);
}
} finally {
g.dispose();
}
} while (bs.contentsRestored());
bs.show();
} while (bs.contentsLost());
}
public void run()
{
long lastTime = System.nanoTime();
double nsPerTick = 1000000000 / 60D;
long lastTimer = System.currentTimeMillis();
double delta = 0;
int frames = 0;
int ticks = 0;
while (running == true) {
long now = System.nanoTime();
delta += (now - lastTime) / nsPerTick;
lastTime = now;
boolean render = false;
while (delta >= 1) {
ticks++;
tick();
delta -= 1;
render = true;
}
try {
Thread.sleep(3); //keep the Frames from going to high
} catch (InterruptedException e) {
e.printStackTrace();
}
if(render == true){
frames++;
render();
}
if (System.currentTimeMillis() - lastTimer >= 1000) {
lastTimer +=1000;
//System.out.println("Frames: " + frames + " Ticks: " + ticks);
frames = 0;
ticks = 0;
}
}
}
public static int width = 28;
public static int height = 31;
public static int[][] level1 = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
{0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,},
{0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,},
{0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,},
{0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,},
{0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,},
{0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,},
{0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,},
{0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,},
{1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,},
{0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,},
{0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,},
{0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,},
{0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,},
{0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,},
{0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,},
{0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,},
{0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,},
{0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,},
{0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}
};
你需要雙緩沖區,問題是java用背景顏色繪制畫布,然后放置grahpics指令,所以,如果你需要更改圖像,你可以在“隱藏圖像”中進行,當它准備好打印時用新渲染的圖像替換圖像的畫布區域。 更多信息請參見 Java 中的雙緩沖區。 編輯:差點忘了,真的很容易做到,這里是一個雙緩沖示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.