制作一个简单的RPG-创建一个新的JFrame

时间:2015-06-11 14:53:49

标签: java swing user-interface jframe window

我正在制作一个4级RPG。它有Player类,允许我们移动玩家。它有Board类,用于游戏中的地图。战斗阶段有战斗阶段。 RPG是负责运行游戏的主要类。 我想要的是玩家何时进入坐标(500x500)我希望程序打开一个新窗口,它将有战斗的JPanel。

编辑:更新了display()和actionPerformed()方法

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Player {

    private int dx,dy,x,y;
    private Image image;
    private ImageIcon front = new ImageIcon("player_front.png");
    private ImageIcon left = new ImageIcon("player_left.png");
    private ImageIcon right = new ImageIcon("player_right.png");
    private ImageIcon back = new ImageIcon("player_back.png");

    public Player() {

        initplayer();
    }

    private void initplayer() {

        image = front.getImage();
        x = 0;
        y = 0;        
    }


    public void move() {
        x += dx;
        y += dy;

    }

    public int getX() {
        return x;
    }

    public void setX(int x){
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public Image getImage() {
        return image;
    }


    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();
        dx = 0;
        dy = 0;

        if (key == KeyEvent.VK_LEFT && x >= 0) {
            image = left.getImage();
            dx = -1;
        }


        if (key == KeyEvent.VK_RIGHT && x <= 850) {
            image = right.getImage();
            dx = 1;
        }

        if (key == KeyEvent.VK_UP && y >= 0) {
            image = back.getImage();                
            dy = -1;

        }
            if (key == KeyEvent.VK_DOWN && y <= 850) {
                image = front.getImage();
                dy = 1;

        }
    }

    public void keyReleased(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_UP) {
            dy = 0;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 0;
        }
    }
}


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel implements ActionListener {

    private Battle battle;
    private Timer timer;
    private Player player;
    private final int DELAY = 10;
    private Image image;
    private JLabel label;

    public Board() {

        initBoard();

    }

    private void initBoard() {

        image = Toolkit.getDefaultToolkit().createImage("map.png");

        addKeyListener(new TAdapter());
        setFocusable(true);

        player = new Player();

        timer = new Timer(DELAY, this);
        timer.start();           
    }

    public Image getImage(){
        return image;
    }


    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(image,0,0,null);

        doDrawing(g);

    }

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;   
        g2d.drawImage(player.getImage(), player.getX(), player.getY(), this);

    }

    public boolean checkBattle(){
        if(player.getX() == 500 && player.getY() == 500){
            return true;
        }
        return false;
    }

    public void actionPerformed(ActionEvent e) {//UPDATED

        player.move();

        if(checkBattle()){
              battle.display();
        }            

        repaint();       
    }


    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            player.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            player.keyPressed(e);
        }
    }
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 
import java.util.*;


public class Battle extends JPanel{

    private JFrame frame;
    private JPanel panel1, panel2;
    private JLabel label1, label2, label3, label4;
    private JButton button1, button2, button3, button4;
    private int playerHealth = 100;
    private int opponentHealth = 50;
    private int maxOpponentHealth = 50;
    private int level = 0;
    private int playerDamage, opponentDamage, chance, levelDamage;
    private ImageIcon image;

    public Battle(){
        setPreferredSize(new Dimension(500,500));
        setLayout(new BorderLayout());
        panel1 = new JPanel();
        panel1.setLayout(new FlowLayout());

        label1 = new JLabel("You : " + Integer.toString(playerHealth) + " / 100");
        label2 = new JLabel("Opponent : " + Integer.toString(opponentHealth) + " / 50");
        button1 = new JButton("Power Attack!(%50 hit chance)");
        button2 = new JButton("Normal Attack!(%70 hit chance)");
        button3 = new JButton("Quick Attack!(%90 hit chance)");
        button4 = new JButton("NEXT LEVEL!");   
        panel2 = new JPanel();

        ImageIcon image = new ImageIcon("player_vs_rival.png");
        label4 = new JLabel(image);

        ButtonListener listener = new ButtonListener();

        button1.addActionListener(listener);
        button2.addActionListener(listener);
        button3.addActionListener(listener);
        button4.addActionListener(listener);
        panel1.add(button1);
        panel1.add(button2);
        panel1.add(button3);
        panel1.add(button4);
        panel2.add(label4);
        label3 = new JLabel("");

        add(label1, BorderLayout.WEST);
        add(label2, BorderLayout.EAST);
        add(label3, BorderLayout.SOUTH);
        add(panel1, BorderLayout.CENTER);
        add(panel2, BorderLayout.NORTH);

    }

    public void powerAttack(){
        Random random = new Random();
        playerDamage = random.nextInt(5) + 10;
    }

    public void normalAttack(){
        Random random = new Random();
        playerDamage = random.nextInt(10) + 5;
    }

    public void quickAttack(){
        Random random = new Random();
        playerDamage = random.nextInt(5) + 5;
    }

    public void opponentAttack(){
        Random random = new Random();
        opponentDamage = random.nextInt(5) + 5;
    }

    public boolean checkPowerAttack(){
        Random random = new Random();
        chance = random.nextInt(100);
        if(chance >= 50){
            return true;
        }
        return false;   
    }

    public boolean checkNormalAttack(){
        Random random = new Random();
        chance = random.nextInt(100);
        if(chance >= 30){
            return true;
        }
        return false;
    }

    public boolean checkQuickAttack(){
        Random random = new Random();
        chance = random.nextInt(100);
        if(chance >= 10){
            return true;
        }
        return false;
    }

    public boolean checkOpponentAttack(){
        Random random = new Random();
        chance = random.nextInt(100);
        if(chance >= 25){
            return true;
        }
        return false;
    }

    public void levelDamage(){
        Random random = new Random();
        levelDamage = random.nextInt(5);
        levelDamage = levelDamage * level;
    }

    public void display(){//UPDATED

        JFrame newFrame = new JFrame("New Window"); 
        Battle battle = new Battle();
        newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        newFrame.setVisible(true);
        newFrame.pack();
        newFrame.getContentPane().add(battle);

    }
}

    private class ButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent e){

            Object source = e.getSource();

            if(source == button1){
                if(checkPowerAttack() == true){
                    powerAttack();
                }
                else
                playerDamage = 0;           

                opponentHealth = opponentHealth - playerDamage; 
            }

            if(source == button2){
                if(checkNormalAttack() == true){

                    normalAttack();
                }
                else
                playerDamage = 0;           

                opponentHealth = opponentHealth - playerDamage; 
            }

            if(source == button3){
                if(checkQuickAttack() == true){
                    quickAttack();
                }
                else
                playerDamage = 0;           

                opponentHealth = opponentHealth - playerDamage; 
            }

            if((source == button1 || source == button2) || source == button3){
                if(checkOpponentAttack() == true){
                    opponentAttack();
                }
                else
                opponentDamage = 0;

                playerHealth = playerHealth - opponentDamage - levelDamage; 
            }

            if(source == button4){
                level++;
                opponentHealth = opponentHealth + 25;
                maxOpponentHealth = opponentHealth;
            }

            if(playerHealth <= 0 && opponentHealth > 0){
                JOptionPane.showMessageDialog(null,"YOU LOSE");
            }

            if(opponentHealth <= 0 && playerHealth > 0){
                JOptionPane.showMessageDialog(null,"YOU WIN");
            }

            label1.setText("You : " + Integer.toString(playerHealth) + " / 100");
            label2.setText("Opponent : " + Integer.toString(opponentHealth) + " / " + Integer.toString(maxOpponentHealth));
            if(playerDamage != 0 && opponentDamage != 0){
                label3.setText("You made " + Integer.toString(playerDamage) + " damage to your opponent. " + http://stackoverflow.com/editing-help
                        "Your opponent give " + Integer.toString(opponentDamage + levelDamage) + " damage to you.");
            }
            else if(playerDamage == 0 && opponentDamage != 0){
                label3.setText("YOU MISSED YOUR ATTACK! " + 
                        "Your opponent give " + Integer.toString(opponentDamage + levelDamage) + " damage to you.");
            }
            else if(playerDamage != 0 && opponentDamage == 0){
                label3.setText("You made " + Integer.toString(playerDamage) + " damage to your opponent. " + 
                        "YOUR OPPONENT MISSED HIS ATTACK!");
            }
            else if(playerDamage == 0 && opponentDamage == 0){
                label3.setText("YOU MISSED YOUR ATTACK! " + 
                        "YOUR OPPONENT ALSO MISSED HIS ATTACK!");
            }
        }
    }
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RPG extends JFrame {

    private Board board = new Board();
    private Battle battle = new Battle();

    public RPG() {

        initUI();
    }

    private void initUI() {

        add(board);

        setSize(900, 900);
        setResizable(false);

        setTitle("RPG");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {

                RPG ex = new RPG();
                ex.setVisible(false);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

打开一个新窗口就像创建一个像你在display()函数中已经完成的新框架一样简单。例如,这个:

    JFrame newFrame = new JFrame("New Window"); 
    newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    newFrame.setVisible(true);

应该足以打开一个没有任何内容的新窗口(你可能想要在display()方法中添加一些东西)。由于你想在玩家到达某个位置时这样做,只需检查移动时的玩家坐标并调用类似的代码来打开一个新的框架。

编辑: 再看一遍,看起来你可以在checkBattle()函数中调用display()?看起来你已经拥有了大部分逻辑。如果你想知道从哪里调用checkBattle(),我将它放在Player.move()函数中。