我如何让我的玩家跳入Java游戏

时间:2020-04-23 14:56:45

标签: java swing

早上好,当我发现我不知道如何使播放机跳跃的问题时,我正在构建。 我的课程有: 游戏面板

package src;

import javax.swing.*;

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

public class GamePanel extends JPanel implements Runnable{

    public static final int WIDTH=300, HEIGHT=300, MIN_X_COORD=0, MIN_Y_COORD=0, MAX_X_COORD=19, MAX_Y_COORD=19;

    private Thread thread;

    private boolean playing, key=false;

    private Random r;

    int xCoord = 0, yCoord = 16, size = 15;

    char direction;

    private Player p;

    private Victory v;

    private ArrayList<Ground> grounds;

    private ArrayList<Grass> grasses;

    private ArrayList<Sky> sky;

    Action jump=new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            yCoord--;
            yCoord--;
            yCoord++;
            yCoord++;
        }
    };
    Action right=new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(xCoord!=MAX_X_COORD)xCoord++;
            direction='l';
        }
    };
    Action left=new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(xCoord!=MIN_X_COORD)xCoord--;
            direction='r';
        }
    };

    public GamePanel() {
        this.getInputMap().put(KeyStroke.getKeyStroke('d'),"right");
        this.getInputMap().put(KeyStroke.getKeyStroke('a'),"left");
        this.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"up");
        this.getActionMap().put("right", right);
        this.getActionMap().put("left", left);
        this.getActionMap().put("up", jump);
        setFocusable(true);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        grounds = new ArrayList<Ground>();
        grasses=new ArrayList<Grass>();
        r=new Random();
        v=new Victory(16,19, size);
        p=new Player(xCoord, yCoord, size);
        sky=new ArrayList<Sky>();
        start();
    }

    public void start() {
        playing=true;
        thread=new Thread(this);
        thread.start();
    }
    @Override
    public void run() {
        while (playing) {
            tick();
            repaint();
        }
    }
    public void stop() {

        playing = false;
        // now we create the Game Over Screen
        JFrame f=new JFrame("Game Over Screen");
        JButton b=new JButton("Press this to play again!");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setPreferredSize(new Dimension(500,500));
        JButton close = new JButton("Quit!");
        b.setBounds(130,200,250, 40);
        f.add(b);
        f.add(close);
        f.setLayout(new FlowLayout());
        f.pack();
        f.setVisible(true);
        f.setLocationRelativeTo(null);
        Main.returnFrame().dispatchEvent(new WindowEvent(Main.returnFrame(), WindowEvent.WINDOW_CLOSING));
        Main.returnFrame().dispose();
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                f.dispatchEvent(new WindowEvent(f, WindowEvent.WINDOW_CLOSING));
                Main.main(null);
            }
        });
        close.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void tick() {
        p=new Player(xCoord, yCoord, size);
        if(grounds.size()==0) {
            for(int y=MAX_Y_COORD;y>17;y--)
                for(int x = 0;x<=MAX_X_COORD;x++)
                    grounds.add(new Ground(x,y,size));
        }

        if(grasses.size()==0)
            for (int x=0;x<=MAX_X_COORD;x++)
                grasses.add(new Grass(x, 17, size));
        if (v.getxCoord()==p.getxCoord()&&v.getyCoord()==p.getyCoord()) {
            win();
        }
        if (sky.size()==0)
            for (int x=MIN_X_COORD;x<=MAX_X_COORD;x++)
                for (int y=MIN_Y_COORD;y<17;y++)
                    sky.add(new Sky(x, y, size));
        for(int i = 0;i< grounds.size();i++)
            if(p.getxCoord() == grounds.get(i).getX_COORD() && p.getyCoord() ==grounds.get(i).getY_COORD())
                back();
        for(int i = 0;i< grasses.size();i++)
            if(p.getxCoord() == grasses.get(i).getX_COORD() && p.getyCoord() ==grasses.get(i).getY_COORD())
                back();
    }

    @Override
    public void paint(Graphics g) {
        g.clearRect(0, 0, WIDTH, HEIGHT);
        g.setColor(Color.black);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        for(int i = 0;i<WIDTH/10;i++) { // draws lines
            g.drawLine(i*10, 0, i*10, HEIGHT);
        }
        for(int i = 0;i<HEIGHT/10;i++) {
            g.drawLine(0, i*10, HEIGHT, i*10);
        }
        for(int i = 0;i<grounds.size();i++) {
            grounds.get(i).draw(g);
        }
        for (Grass grass : grasses) {
            grass.draw(g);
        }
        for (Sky s:sky)
            s.draw(g);
        v.draw(g);
        p.draw(g);
    }
    public void win() {
        JOptionPane.showMessageDialog(null, "Hai Vinto");
        stop();
    }
    public void die() {
        JOptionPane.showMessageDialog(null, "Sei morto");
        stop();
    }
    public void back() {
        switch (direction) {
            case 'l': xCoord++;break;
            case 'r': xCoord--;break;
        }
    }
}

玩家


import java.awt.Color;
import java.awt.Graphics;

public class Player {
    int xCoord, yCoord, width, height;
    public Player(int xCoord, int yCoord, int size) {
        this.xCoord=xCoord;
        this.yCoord=yCoord;
        width=size;
        height=size;
    }
    public void draw(Graphics g) {

        g.setColor(Color.RED);
        g.fillRect(xCoord*width, yCoord*height, width, height);
    }

    public void setxCoord(int xCoord) {
        this.xCoord = xCoord;
    }
    public int getxCoord() {
        return xCoord;
    }
    public int getyCoord() {
        return yCoord;
    }
    public void setyCoord(int yCoord) {
        this.yCoord = yCoord;
    }
}

我需要动作 jump 使玩家角色跳两个方块并返回。 我以为我必须增加 yCoord repaint ,但这并不会影响

0 个答案:

没有答案