gpt4 book ai didi

java - 2D Java 游戏。在平铺图像上方移动 Sprite

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:08 25 4
gpt4 key购买 nike

->简短的介绍,你可以跳过这部分

我很高兴终于能够在这个平台上发帖,因为我自己通过这个社区获得了很多知识;只是通过阅读。所以我想说“大家好,谢谢!

实际内容(序言):

虽然我在公司用Objective-C开发,但是我对JAVA开发非常感兴趣。我对语法很满意,但在使用 awt/swing/Graphics2D 时遇到一些主要问题。

概念:

具有 800*600 帧的 JAVA 应用程序。在此框架上,您可以看到大小为 50px² 的 16*12 block (即 gras.jpg 或 tree.jpg)。在此框架上方,一个 .png“玩家”正在移动。该字段由一个二维 int 数组 [16][12] 生成,其中 0 表示“草”,1 表示“树”。

-> 这实际上是“工作”。

第一次尝试:

添加 (frame.add(...)) 16*12 JLabels with imageIcon "gras"or "tree"to a JLayeredPane
添加 (frame.add(...)) 类“entityLayer”,使用 paint(Graphics g) 在 5 毫秒时更新
{
g.drawImage(imageIcon.getImage());

如果我添加 带有方 block 的字段 实体层,此版本“有效”。在其他任何情况下,要么 entityLayer 用灰色背景覆盖字段,要么“玩家”在字段下不可见;

第二次尝试:

在entityLayer paint(Graphics g) 方法中绘制所有图形。但这不是我想要的。我希望该字段被绘制一次,并且“播放器”像半透明背景一样绘制在该字段的上方

问题:

我怎样才能让自己真正拥有两个独立的层,它们都同样独立,并且不会让一个层与另一个层重叠?我几乎 99% 确信我的尝试在某些方面是错误的。

马上谢谢你。

最佳答案

不是添加/绘制 16*12 JLabel,而是绘制 tile 图像 16*12 次?

对于这样的事情,我通常将单个 JPanel 添加到 JFrame,并覆盖 JPanel 的 paint() 方法。实际上,我没有添加 JPanel,我添加了我创建的 JPanel 的子类,您也应该这样做,因为我将向您展示您需要向 JPanel 添加一个字段并覆盖绘制方法

您的背景图 block 绘制代码可能类似于:

int tileWidth = 50;
int tileHeight = 50;
for ( int x = 0; x < 16; x++ )
{
for ( int y = 0; y < 12; y++ )
{
Image tileImage;
int tileType = fieldArray[x][y];

switch ( tileType )
{
case 0:
{
tileImage = myGrassImage;
break;
}
case 2:
{
tileImage = myTreeImage;
break;
}
}

Graphics2D g;
g.drawImage(tileImage, x * tileWidth, y * tileHeight, null);
}
}

一种对我很有效的技术是将每一层的绘图逻辑分离到一个单独的类中,该类实现了 Painter 接口(interface)(或您定义的类似接口(interface))。

public class TilePainter implements Painter
{

@Override
public void paint( Graphics2D g, Object thePanel, int width, int height )
{
//The tile painting code I posted above would go here
//Note you may need to add a constructor to this class
//that provides references to the needed resources
//Eg: images/arrays/etc
//Or provides a reference to a object where those resources can be accessed
}

}

然后对于玩家画家:

public class EntityPainter implements Painter
{

@Override
public void paint( Graphics2D g, Object thePanel, int width, int height )
{
g.drawImage(player.getImage(), player.getX(), player.getY(), null);
}

}

如果您想知道为什么我将 NULL 传递给 g.drawImage() 函数,那是因为对于那个重载函数调用,最后一个参数是一个 ImageObserver,我们不需要为此目的使用它。

好的,一旦您将画家分成不同的类,我们就需要让 JPanel 能够使用它们!

这是您需要添加到 JPanel 的字段:

List<Painter> layerPainters;

你的构造函数应该看起来像这样:

public MyExtendedJPanel()
{
//I use an ArrayList because it will keep the Painters in order
List<Painter> layerPainters = new ArrayList<Painter>();

TilePainter tilePainter = new TilePainter(Does,This,Need,Args);
EntityPainter entityPainter = new EntityPainter(Does,This,Need,Args);

//Layers will be painted IN THE ORDER THEY ARE ADDED
layerPainters.add(tilePainter);
layerPainters.add(entityPainter);

}

现在是最后但也是最重要的部分:

@Override
public void paint( Graphics g )
{
int width = getWidth();
int height = getHeight();
//Loops through all the layers in the order they were added
//And tells them to paint onto this panels graphic context
for(Painter painter : layerPainters)
{
painter.paint(g,this,width,height);
}
}

关于java - 2D Java 游戏。在平铺图像上方移动 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189267/

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