【问题标题】:What Layout Should I Use for This Project (Java)我应该为这个项目使用什么布局(Java)
【发布时间】:2015-05-04 16:38:10
【问题描述】:

我正在为一个班级项目制作平台游戏,并且需要在某些平台上实现小鸡角色跳跃。我有一个开始屏幕和一个按钮,当单击该按钮时,它会将框架更改为第一级。当我将鸡角色以及背景图像添加到框架中时,我能看到的只是背景图像。我应该使用不同的布局还是可以做其他事情。这是我的代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Main extends JFrame {
        public Main(){

            //Creates Chicken Character
            final JLabel chicken = new JLabel(" ");
            ImageIcon chick1 = new ImageIcon("chicken.gif");
            ImageIcon chick2 = new ImageIcon("chicken2.gif");
            chicken.setIcon(chick1);

            //Sets Chicken Location
            chicken.setLocation(1, 1);

            //Creates Title Image 
            JLabel title = new JLabel(" ");
            ImageIcon tl = new ImageIcon("title.gif");
            title.setIcon(tl);

            //Creates Start Image
            final JButton start = new JButton("");
            ImageIcon st = new ImageIcon("start.gif");
            start.setIcon(st);

            //Creates Options Image
            JButton options = new JButton("");
            ImageIcon opt = new ImageIcon("options.gif");
            options.setIcon(opt);
            options.setBackground(Color.BLACK);

            //Creates label for level 0 background image
            JLabel background = new JLabel(" ");
            ImageIcon back = new ImageIcon("level0.gif");
            background.setIcon(back);



            //Creates a panel for level 0
            final JPanel p5 = new JPanel();
            chicken.setLocation(1, 1);
            p5.add(background);

            //Create first frame for "Start" button
            final JPanel p1 = new JPanel();
            p1.setLayout(new GridLayout(1, 1));
            p1.add(start, BorderLayout.CENTER);

            //Create second panel for title label
            final JPanel p2 = new JPanel(new BorderLayout());
            p2.setLayout(new GridLayout(1, 3));
            p2.add(title, BorderLayout.WEST);

            //Create third panel for "Options" button
            final JPanel p3 = new JPanel(new BorderLayout());
            p3.setLayout(new GridLayout(1, 1));
            p3.add(options, BorderLayout.SOUTH);

            //Creates fourth panel to organize all other primary
            final JPanel p4 = new JPanel(new BorderLayout());
            p4.setLayout(new GridLayout(1, 3));
            p4.add(p1, BorderLayout.WEST);
            p4.add(p2, BorderLayout.CENTER);
            p4.add(p3, BorderLayout.EAST);


            //When button is clicked, it changes the level
            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(start.isEnabled()) {
                        remove(p4);
                        add(new ContentPanel());
                        add(chicken);
                        chicken.setLocation(100, 100);
                        setSize(1440, 500);
                        setLocale(null);
                        chicken.isOpaque();
                        validate();
                    }
                    else {
                        return;
                    }
                }
            });

            //Adds fourth panel to frame
            add(p4, BorderLayout.CENTER);
        }

        public static void main(String arg[]) {
            Main frame = new Main();

            //Finds screen size of monitor
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

            //Creates the frame
            frame.setTitle("Cockadoodle Duty: Awakening");
            frame.setSize(screenSize);
            frame.setLocale(null); 
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            String background = "#000000";
            frame.setBackground(Color.decode(background));
        }
    }

    class ContentPanel extends JPanel{
          Image bgimage = null;

          ContentPanel() {
            MediaTracker mt = new MediaTracker(this);
            bgimage = Toolkit.getDefaultToolkit().getImage("level0.gif");
            mt.addImage(bgimage, 0);
            try {
              mt.waitForAll();
            } catch (InterruptedException e){
              e.printStackTrace();
            }
          }

          protected void paintComponent(Graphics g){
            super.paintComponent(g);
            int imwidth = bgimage.getWidth(null);
            int imheight = bgimage.getHeight(null);
            g.drawImage(bgimage, 1, 1, null);
          }
        }

【问题讨论】:

  • “我应该使用不同的布局还是我可以做其他事情。” 我认为custom painting 的整个游戏区域都在@ 987654324@ 或 BufferedImage.
  • 我认为JavaFx对于这个开发来说是非常方便的。见this

标签: java swing jframe jpanel layout-manager


【解决方案1】:

注意:我已经有一段时间没有使用图形 API了

快速回答:

您需要在您的paintComponent 方法中绘制所有内容。您的绘图例程应该检查所有游戏对象的状态并相应地绘制它们。现在面板正在绘制背景图像 - 就是这样。以与添加 bgImage 相同的方式添加鸡图像。

需要考虑的其他事项:

如果您遇到屏幕闪烁,请查看双缓冲。

不要让您不知所措,但您可能想对游戏编码做一些简单的阅读。大致了解如何编写游戏循环以及每次执行循环时会发生什么。

由于您使用的是 OO 语言,因此您还应该创建一个 Chicken 类。

public class Chicken {

   private int x;
   private int y;
   private Image chickenSprtie;

   //add get / set for access

}

甚至是一个通用的超类 - 具有 int x, int y 的 Sprite。甚至是一个“Drawable”接口来强制所有可绘制的游戏对象具有通用方法....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2015-12-02
    • 2022-11-24
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多