[英]Making a Simple RPG- Creating a new JFrame
我正在制作4類RPG。 它具有Player類,該類允許我們移動播放器。 它具有用於游戲中地圖的Board類。 有一個戰斗階段,用於戰斗階段。 RPG是負責運行游戲的主要課程。 我想要的是玩家進入坐標(500x500)時,我希望程序打開一個新窗口,並在其上顯示JPanel of Battle。
編輯:更新了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);
}
});
}
}
打開一個新窗口就像創建一個新框架一樣簡單,就像在display()函數中已經完成的那樣。 例如,這:
JFrame newFrame = new JFrame("New Window");
newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
newFrame.setVisible(true);
應該足以打開一個沒有任何內容的新窗口(您可能想要向其添加在display()方法中執行的操作)。 由於要在播放器到達某個位置時執行此操作,因此只需檢查播放器在移動時的坐標並調用類似的代碼即可打開一個新幀。
編輯:再次查看時,您似乎可以只在checkBattle()函數中調用display()了? 看來您已經掌握了大部分邏輯。 如果您想知道從哪里調用checkBattle(),請將其放在Player.move()函數中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.