- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好我是一个没有经验的程序员,这是我关于堆栈溢出的第一个问题!
我正在尝试在Java游戏中实现“战争迷雾”。这意味着我的大部分地图都从黑色开始,然后随着我的角色之一在地图各部分之间移动而被显示出来。我搜索了包括此处在内的内容,发现了一些建议,并尝试自己进行调整。我的每种方法都有效,但是每种方法都遇到了严重的运行时问题。作为比较,在我进行任何战争迷雾之前,我都获得了250-300 FPS。
这是我的基本方法:
private BufferedImage blackBI = loader.loadImage("/map_black_2160x1620.png");
private BufferedImage fogofwarBI = new BufferedImage(blackBI.getWidth(), blackBI.getHeight(), BufferedImage.TYPE_INT_ARGB);
public FogOfWar() {
fogofwarBI.getGraphics().drawImage(blackBI,0,0,null);
}
Set<List<Integer>> transparentPoints = new HashSet<List<Integer>>();
public void editFog(int x, int y) {
if (transparentPoints.contains(Arrays.asList(x,y)) == false){
fogofwarBI.setRGB(x,y,0); // 0 is transparent in ARGB
transparentPoints.add(Arrays.asList(x,y));
}
}
public void render(Graphics g, Camera camera) {
g.drawImage(fogofwarBI, 0, 0, Game.v_WIDTH, Game.v_HEIGHT,
camera.getX()-Game.v_WIDTH/2, camera.getY()-Game.v_HEIGHT/2,
camera.getX()+Game.v_WIDTH/2, camera.getY()+Game.v_HEIGHT/2, null);
}
private BufferedImage blackBI = loader.loadImage("/map_black_2160x1620.png");
private BufferedImage fogofwarBI = new BufferedImage(blackBI.getWidth(), blackBI.getHeight(), BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = fogofwarBI.getRaster();
DataBufferInt dataBuffer = (DataBufferInt)raster.getDataBuffer();
int[] pixels = dataBuffer.getData();
public FogOfWar() {
fogofwarBI.getGraphics().drawImage(blackBI,0,0,null);
}
public void editFog(int x, int y) {
if (transparentPoints.contains(Arrays.asList(x,y)) == false){
pixels[(x)+((y)*Game.m_WIDTH)] = 0; // 0 is transparent in ARGB
transparentPoints.add(Arrays.asList(x,y));
}
}
public void render(Graphics g, Camera camera) {
int xOffset = camera.getX() - Game.v_WIDTH/2;
int yOffset = camera.getY() - Game.v_HEIGHT/2;
for (int i = 0; i<Game.v_WIDTH; i++) {
for (int j = 0; j<Game.v_HEIGHT; j++) {
if ( transparentPoints.contains(Arrays.asList(i+xOffset,j+yOffset)) ) {
pixels[i+j*Game.v_WIDTH] = 0;
} else {
pixels[i+j*Game.v_WIDTH] = myBlackARGB;
}
}
}
g.drawImage(fogofwarBI, 0, 0, null);
}
最佳答案
这是一个很好的问题。我不熟悉awt / swing类型渲染,因此我只能尝试解释该问题的可能解决方案。
从性能的角度来看,我认为在地图的较大部分中对FOW进行块化/栅格化是一个更好的选择,而不是使用基于像素的系统。这将减少每个刻度的检查量,并且更新它还将占用更少的资源,因为仅一小部分窗口/地图需要更新。网格越大,检查越少,但是视觉损失越大。
那样做会使FOW看起来很块状/像素化,但这不是您无法解决的问题。
对于玩家的直接周围环境,您可以添加一个以玩家为中心的圆形纹理。然后可以使用混合(我相信awt / swing中的术语是composite
)来“覆盖”圆与FOW纹理重叠的alpha。这样,基于像素的更新由renderAPI完成,该API通常使用硬件增强方法来实现这些目的。 (对于自定义的基于像素的渲染,如果渲染API支持,通常会使用“着色器脚本”之类的东西)
如果您仅需要在FOW中进行临时查看(如果您不需要“记住”地图),甚至不需要FOW的纹理网格,就足够了,但是我怀疑您确实想“记住” ' 地图。因此,在这种情况下:
可以像使用基于网格的地形一样固定块状/像素化外观。基本上根据周围环境添加一些小的其他纹理/形状,以使外观看起来不错。下面的链接提供了很好的示例,以及有关如何进行“地形转换”的详细说明。
https://www.gamedev.net/articles/programming/general-and-gameplay-programming/tilemap-based-game-techniques-handling-terrai-r934/
我希望这能带来更好的结果。如果您无法获得更好的结果,我建议您切换到类似OpenGL之类的渲染引擎,因为这是用于游戏的,而awt / swing API主要用于UI /应用程序渲染。
关于java - 如何最好地用Java实现 war 迷雾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62377856/
我是一名优秀的程序员,十分优秀!