簡體   English   中英

我應該為該項目使用什么布局(Java)

[英]What Layout Should I Use for This Project (Java)

我正在為一個上課的項目制作平台游戲,需要在某些平台上跳雞角色。 我有一個開始屏幕和一個按鈕,單擊該按鈕時,它將把框架更改為第一級。 當我將雞角色以及背景圖像添加到框架時,我只能看到背景圖像。 我應該使用其他布局還是可以做些其他事情? 這是我的代碼:

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);
          }
        }

注意:自從我使用Graphics API以來已經有一段時間了

快速回答:

您需要在paintComponent方法中繪制所有內容。 您的繪制例程應檢查所有游戲對象的狀態並相應地繪制它們。 現在,面板正在繪制背景圖像-就是這樣。 添加雞肉圖像的方式與添加bgImage相同。

還有一些需要考慮的事情:

如果您遇到屏幕閃爍現象,請查看Double Buffering。

並不是讓您不知所措,而是您可能需要對游戲編碼進行一些輕松的閱讀。 大致了解如何編寫游戲循環以及每次執行循環時會發生什么。

由於您使用的是OO語言,因此您可能還應該做一個Chicken類。

public class Chicken {

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

   //add get / set for access

}

甚至是一般的超級類-具有int x,int y的Sprite。 甚至是“可繪制”界面,用於強制所有可繪制游戲對象具有通用方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM