1

私は Java でゲームを開発しており、さまざまなクラス ファイルからさまざまなレベルをロードしようとしています。各レベル クラス ファイルは jpanel です。level1 が完了すると、jpanel level1 を削除して jpanel level2 を追加するメソッドをロードするという考えでした。しかし、level1 から level2 をロードしようとすると、java.lang.OutOfMemoryError: Cannot to create new native thread が発生します。エラー

私は3つのクラスファイルを持っています:

  • main: jframe と jpanels を追加するメソッドをロードします。
  • level1: level1 をロードしてから、main のメソッドを介して level2 をロードします。
  • level2: level2 をロードします

これは、メイン クラスのメソッドです。

public static void levelChanger(int currentMap){
    map1 map1 = new map1(null);
    map2 map2 = new map2(null);

    if(currentMap == 1){
        frame.add(map1);
        frame.validate();
    }else if(currentMap == 2){
        frame.remove(map1);
        frame.add(map2);
        frame.validate();
    }
}

そして、これは私がレベル1からそれを呼び出す方法です:

mainScreen.levelChanger(2);

十分な情報を提供したことを願っています。ありがとう!


これはメインクラス全体です:

import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class mainScreen{

    static JFrame frame = new JFrame("Tile System");

    //Key variables
    public static int keyUp = KeyEvent.VK_UP;
    public static int keyDown = KeyEvent.VK_DOWN;

    public static void main(String[] args) {
        levelChanger(1);
        frame.setSize ( 800, 600 );
        frame.setResizable ( false );
        frame.setLocationRelativeTo ( null );
        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
        frame.setVisible ( true );
        frame.setBackground(new Color(135, 206, 250));//RGB color code
        frame.setFocusable(true);

        new map1(null);
    }
    public static void exit(){
        WindowEvent wev = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
    }

    public static void levelChanger(int currentMap){
        public static map1 map1 = new map1(null);
            public static map2 map2 = new map2(null);
        if(currentMap == 1){
            frame.add(map1);
            frame.validate();
        }else if(currentMap == 2){
            frame.remove(map1);
            frame.add(map2);
            frame.validate();
        }
    }
}
4

2 に答える 2

3

First, the OutOfMemoryError doesn't really have anything with this code, probably map1 and map2 are allocating lots of memory, maybe this answer will help you relasing some of that memory.

  1. Each time you are calling levelChanger you are allocating a new map1 and map2 object. Even though you will only use one of these objects

  2. You are not removing the same map1 object when changing to level 2.

  3. (You could let levelChanger take a map parameter instead)


An improved levelChanger method could look like this:

// allocate maps once
static map1 map1 = new map1(null);
static map2 map2 = new map2(null);

public static void levelChanger(int currentMap){

    if (currentMap == 1){
        frame.add(map1);
        frame.validate();
    } else if (currentMap == 2) {
        frame.remove(map1);
        frame.add(map2);
        frame.validate();
    }
}

A better way would be create an interface Map and let map1 and map2 implement Map, also creating an own panel (mapPanel) for the map. Something like this:

public static void levelChanger(Map map){
    mapPanel.removeAll();
    mapPanel.add(map);
}
于 2012-06-18T06:56:36.510 に答える
0

あなたが提供するコードについては確信が持てませんが、あなたのエラーはOutOfMemoryErrorです、あなたはデフォルトのJavaメモリを増やしましたか?コマンドラインオプションを試してください-Xms512m -Xmx1024m(または、必要なメモリサイズをそこに入れてください)。

于 2012-06-18T06:59:20.587 に答える