Java platformer游戏没有';t运行最初的几行代码。。。?

Java platformer游戏没有';t运行最初的几行代码。。。?,java,Java,我正在为Java中的2d platformer游戏做一个基本的大纲。。。我最近开始有一个问题!有时候,当我运行我的程序时,我的框架出现了,所有的东西都被设置好了,你可以看到那个家伙,但是由于某种原因,地面没有被“添加”(我有一个addGround()方法,我在运行的第一段中调用了它)。随着我对游戏的深入,这种情况开始越来越多地发生,直到现在,大多数时候它都失败了,并且不会显示/添加地面!但有时,它做得很完美 这是它工作时的外观: 这就是它在大多数情况下不起作用时的外观: 这是我的主要课程代码

我正在为Java中的2d platformer游戏做一个基本的大纲。。。我最近开始有一个问题!有时候,当我运行我的程序时,我的框架出现了,所有的东西都被设置好了,你可以看到那个家伙,但是由于某种原因,地面没有被“添加”(我有一个addGround()方法,我在运行的第一段中调用了它)。随着我对游戏的深入,这种情况开始越来越多地发生,直到现在,大多数时候它都失败了,并且不会显示/添加地面!但有时,它做得很完美

这是它工作时的外观:

这就是它在大多数情况下不起作用时的外观:

这是我的主要课程代码: (我没有包括所有的进口商品和东西,只是核心商品)

这是地面等级代码:

public class Ground extends JFrame
{
    private Image groundImg = Toolkit.getDefaultToolkit().getImage("ground.png");
    private ArrayList<Point> groundLocs = new ArrayList<Point>();
    public Ground()
    {

    }
    public void addGround(int xCoord, int yCoord, int howManyWide, int howManyTall)
    {
    for(int i = 0; i < howManyWide; i++)
    {
        for(int j = 0; j < howManyTall; j++)
        {
            groundLocs.add(new Point(xCoord+i*groundImg.getWidth(null), yCoord+j*groundImg.getHeight(null)));
        }
    }
    }
    public void drawGround(Graphics g)
    {
        for(Point p: groundLocs)
        {
            g.drawImage(groundImg, p.x, p.y, this);
        }
    }
    public int groundArraySize()
    {
        return groundLocs.size();
    }
    public Point getGroundArray(int index)
    {
        return groundLocs.get(index);
    }
}
公共类地面扩展JFrame
{
私有图像groundImg=Toolkit.getDefaultToolkit().getImage(“ground.png”);
private ArrayList groundLocs=new ArrayList();
公共场所
{
}
公共无效添加区(int xCoord、int yCoord、int howManyWide、int howManyTall)
{
for(int i=0;i
这是Swing的
JFrame
?例如,当您调用
repaint()
时,我看不到
invokeLater()
。在Swing应用程序中不正确地管理线程会导致各种各样的问题。考虑到您发布的代码数量,我建议您首先处理线程问题,然后如果问题仍然存在,您可以缩小问题的范围

这是一个例子

编辑:
基本上,任何修改或导致任何图形发生的操作都必须在Swing组件初始化之前或在事件分派线程上发生。事件侦听器中的代码或通过invokeLater()invokeAndWait()调用的代码在事件调度线程上运行。
计时器中的代码不会在事件调度线程上调用,但会与Swing组件交互,因此可能会导致各种错误(例如删除一半的图形)。

这是Swing中的
JFrame
?例如,当您调用
repaint()
时,我看不到
invokeLater()
。在Swing应用程序中不正确地管理线程会导致各种各样的问题。考虑到您发布的代码数量,我建议您首先处理线程问题,然后如果问题仍然存在,您可以缩小问题的范围

这是一个例子

编辑:
基本上,任何修改或导致任何图形发生的操作都必须在Swing组件初始化之前或在事件分派线程上发生。事件侦听器中的代码或通过invokeLater()invokeAndWait()调用的代码在事件调度线程上运行。
计时器中的代码不会在事件调度线程上调用,但会与Swing组件交互,因此可能会导致各种错误(例如删除一半的绘图)。

不要发布如此大的代码部分!然后放在pastebin上,而不是放在类似的服务上,在这里只放一个链接。@trejder:文章中必须内联包含代码的相关部分。只能将pastebin用于其他物品。(但我同意这需要阅读大量代码,Ashok应该缩小问题的范围。)@Mat:我同意。我只是觉得把整个班级都公布出来与一个问题无关!:)Ashok你得把范围缩小些。你能在你认为被跳过的代码行中打印一些东西吗?很明显,一些意想不到的事情正在发生,但我通常发现问题不在我认为是的方向盘上。我已经将代码缩小到我认为混乱的部分。谢谢大家!不要发布如此大量的代码!然后放在pastebin上,而不是放在类似的服务上,在这里只放一个链接。@trejder:文章中必须内联包含代码的相关部分。只能将pastebin用于其他物品。(但我同意这需要阅读大量代码,Ashok应该缩小问题的范围。)@Mat:我同意。我只是觉得把整个班级都公布出来与一个问题无关!:)Ashok你得把范围缩小些。你能在你认为被跳过的代码行中打印一些东西吗?很明显,一些意想不到的事情正在发生,但我通常发现问题不在我认为是的方向盘上。我已经将代码缩小到我认为混乱的部分。谢谢大家!谢谢,我有点了解教程,但是你能帮我确定什么时候使用invokeLater()方法吗?我有点了解它是什么…谢谢,我有点了解教程,但是你能帮我确定我什么时候使用invokeLater()方法吗?我有点明白这是什么。。。
public class Ground extends JFrame
{
    private Image groundImg = Toolkit.getDefaultToolkit().getImage("ground.png");
    private ArrayList<Point> groundLocs = new ArrayList<Point>();
    public Ground()
    {

    }
    public void addGround(int xCoord, int yCoord, int howManyWide, int howManyTall)
    {
    for(int i = 0; i < howManyWide; i++)
    {
        for(int j = 0; j < howManyTall; j++)
        {
            groundLocs.add(new Point(xCoord+i*groundImg.getWidth(null), yCoord+j*groundImg.getHeight(null)));
        }
    }
    }
    public void drawGround(Graphics g)
    {
        for(Point p: groundLocs)
        {
            g.drawImage(groundImg, p.x, p.y, this);
        }
    }
    public int groundArraySize()
    {
        return groundLocs.size();
    }
    public Point getGroundArray(int index)
    {
        return groundLocs.get(index);
    }
}