使用null时我的游戏对象不显示

时间:2019-06-24 18:41:16

标签: javascript java

当我使用绝对布局时,出现了我的对象,但是我无法移动它们,因此我将布局更改为null,现在我的对象甚至都没有出现。请帮忙。

Havent尝试了很多,不确定要尝试什么。

    try {
        enemies = new LinkedList<>();

        frame = new JFrame();
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.getContentPane().setBackground(Color.black);
        frame.setPreferredSize(new Dimension(800, 800));

        ActionListener spawnEnemies = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                spawnEnemies();
            }
        };
        ActionListener moveEnemies = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                moveEnemies();
            }
        };

        spawner = new Timer(50000, spawnEnemies);
        spawner.start();
        mover = new Timer(10, moveEnemies);
        mover.start();
        addKeyListener(new KeyInput(this));

        player = new PlayerObj("white", 399, 399, frame);
        player.setPreferredSize(new Dimension(50, 50));
        //AddActionEvent, Keylogging, OnbuttonPress, Autogenerating enemies, timers.
        frame.getContentPane().add(player);

        spawnEnemies();

        frame.revalidate();
        frame.repaint();
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    } catch (IOException ex) {
        Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
    }

1 个答案:

答案 0 :(得分:0)

我不确定您想要什么代码,但是我假设您想在屏幕上的指定位置显示敌人/玩家。我个人不建议使用添加到JFrame的组件来显示它。这意味着没有布局,JFrame将不知道如何放置这些对象。

这是解决问题的另一种方法,但是完全是另一种方法。

您必须创建一个JFrame,并将其内容窗格设置为新的JPanel(建议从JPanel扩展您的类并将其自身添加到JFrame,这样可以使事情变得更加容易)。 然后,通过创建以下内容来重写repaint方法:

export type NonMatchingPropNames<T, X> = { [K in keyof T]: T[K] extends X ? never : K }[keyof T];

export type NonMatchingProps<T, X> = Pick<T, NonMatchingPropNames<T, X>>;

type PrimitiveValuesOf<T> = NonMatchingProps<T, object>;

type A = PrimitiveValuesOf<Workflow & WorkflowVersion>;

const a: A = {
  name: '',
  ID: 0,
  versionID: 1,
  lastPublished: '',
  environmentID: 2
}; // OK

调用repaint()方法时,它将运行此代码。因此,在此处内部,您可以在任何地方(JPanel内部)绘制任何东西。而且您不必弄乱版式,只需将其保留为默认值即可。

绘画示例:

protected void paintComponent(Graphics g){
}