gpt4 book ai didi

Java-Tile map 图像闪烁-我该怎么做才能阻止这种情况?

转载 作者:行者123 更新时间:2023-12-02 05:23:27 27 4
gpt4 key购买 nike

我正在制作一个吃 bean 人游戏,并且我在数组中有一个 map ,我在 map 中分配不同的值来绘制不同的图像,以便创建一个吃 bean 人 map ......但它一直在整个地方闪烁

任何有助于识别问题的帮助都会很棒

我意识到这是大量的阅读,但我已经看了几个小时但没有弄清楚......我是编程新手,所以我认为更有经验的眼睛确实可以使我受益

绘制 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;
}
}
}

map 数组

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用背景颜色绘制 Canvas ,然后放入图形指令,所以,如果你需要更改图像,你可以在“隐藏图像”中完成,当它准备好时将其打印在 Canvas 区域中,用新渲染的图像替换该图像。更多信息请点击 Double Buffer in java 。编辑:差点忘了,其实很容易做到,这里有一个例子double buffer example

关于Java-Tile map 图像闪烁-我该怎么做才能阻止这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26304924/

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