java超级马里奥游戏地板碰撞问题

1yjd4xko  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(178)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

三天前关门了。
改进这个问题
我想做一个超级马里奥一样的游戏,我做了一个对撞机,所以老鼠可以碰撞地板,但它不工作。我在对撞机里找不到我的错误,所以请帮帮我。我是初学者,所以请不要恨我。我有我的画布,奶酪,对撞机,网格,装载机,主要和球员类。这是我的密码:

package srmb;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class Canvas extends JPanel implements KeyListener {
    Player ratto = new Player();
    Grid grid = new Grid();
    static long time = System.nanoTime();
    static long nanodeltatime;
    static double deltatime;
    static double fps;
    static double maxfps = 0;
    static double minfps = 2048;
    ArrayList<Cheese> cheeses = new ArrayList<>();

    public void update() {
        ratto.update();
        if (cheeses.size() < 2) {
            cheeses.add(new Cheese());

        }
        for (int i = 0; i < cheeses.size(); i++) {
            Cheese cheese = cheeses.get(i);
            cheese.update();
            Collider colliderratto = ratto.collider();
            Collider collidercheese = cheese.collider();
            boolean collisioncheese = colliderratto.collides(collidercheese);
            if (collisioncheese == true) {
                cheeses.remove(i);
            }
        }
        ArrayList<Collider> collidergrid = grid.collider();
        Collider colliderratto = ratto.collider();
        boolean colliding = false;
        for (int i = 0; i < collidergrid.size(); i++) {
            boolean collisionhardgrid = colliderratto.collides(collidergrid.get(i));
            System.out.println(colliderratto.x0);
            System.out.println(colliderratto.x1);
            System.out.println(colliderratto.y0);
            System.out.println(colliderratto.y1);
            System.out.println(collidergrid.get(i).x0);
            System.out.println(collidergrid.get(i).x1);
            System.out.println(collidergrid.get(i).y0);
            System.out.println(collidergrid.get(i).y1);

            if (collisionhardgrid == true) {
            colliding = true;
            }
        }
        ratto.colliding = colliding;

    }

    @Override
    public void paintComponent(Graphics g) {
        long newtime = System.nanoTime();
        nanodeltatime = newtime - time;
        time = newtime;
        deltatime = nanodeltatime / 1e9;
        fps = 1 / deltatime;
//      System.out.println("Time: " + System.nanoTime() + "   Nanodeltatime: " + nanodeltatime + "   Deltatime: "
//              + deltatime + "   FPS: " + fps + "   MinFPS: " + minfps + "   MaxFPS: " + maxfps);
        if (fps > maxfps) {
            maxfps = fps;
        }
        if (fps < minfps) {
            minfps = fps;
        }
//      Out of business!
//      try {
//          Thread.sleep((long) (((1/60)*1e-3)-(deltatime*1e-3)));
//      } catch (InterruptedException e) {
//          e.printStackTrace();
//      }
        update();
        super.paintComponent(g);
        grid.render(g);
        ratto.render(g);
        for (int i = 0; i < cheeses.size(); i++) {
            Cheese cheese = cheeses.get(i);
            cheese.render(g);
        }
        repaint();
    }

    @Override
    public void keyTyped(KeyEvent e) {
        ratto.keyTyped(e);
    }

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

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

package srmb;

import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class Cheese {
    int width = 2560;
    int height = 1600;
    int cxpos = (int) Math.floor(width * Math.random());
    int cypos = 1200;
    boolean cdir = true;
    Image cheese;

    Cheese() {
        try {
            cheese = ImageIO.read(new URL("file:///Users/user/Desktop/cheese_v1.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void update() {
        if (cypos == 1100) {
            cdir = false;
        }
        if (cypos == 1200) {
            cdir = true;
        }
        if (cdir == true) {
            cypos = cypos - 1;
        }
        if (cdir == false) {
            cypos = cypos + 1;
        }

    }

    public void render(Graphics g) {
        g.drawImage(cheese, cxpos, cypos, cheese.getWidth(null) * 8, cheese.getHeight(null) * 8, null);
    }

    public Collider collider() {
        return new Collider(cxpos, cxpos + cheese.getWidth(null) * 8, cypos, cypos + cheese.getHeight(null) * 8);
    }
}

package srmb;

public class Collider {
    int x0;
    int x1;
    int y0;
    int y1;

    boolean collides(Collider col) {
        return ((x1 > col.x0 && x1 < col.x1) || (x0 > col.x0 && x0 < col.x1))
                && ((y1 > col.y0 && y1 < col.y1) || (y0 > col.y0 && y0 < col.y1));
    }

    Collider(int x0, int x1, int y0, int y1) {
        this.x0 = x0;
        this.x1 = x1;
        this.y0 = y0;
        this.y1 = y1;
    }

}

package srmb;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;

public class Grid {
    String world = "world_v3.srmb";
    Image air;
    Image dirt;
    Image gras;
    int[][] plines = Loader.loader("/Users/user/Desktop/" + world);
    ArrayList<Collider> colliders = new ArrayList<>();

    Grid() {
        try {
            air = ImageIO.read(new URL("file:///Users/user/Desktop/air_v2.png"));
            dirt = ImageIO.read(new URL("file:///Users/user/Desktop/dirt_v1.png"));
            gras = ImageIO.read(new URL("file:///Users/user/Desktop/gras_v1.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < plines.length; i++) {
            for (int j = 0; j < plines[0].length; j++) {
                if (plines[i][j] != 0) {
                    colliders.add(new Collider(dirt.getWidth(null) * 16 * j,
                            dirt.getWidth(null) * 16 * j + dirt.getWidth(null) * 16, dirt.getHeight(null) * 16 * i,
                            dirt.getHeight(null) * 16 * i + dirt.getHeight(null) * 16));
                }
            }
        }
    }

    public void render(Graphics g) {
        ((Graphics2D) g).setTransform(new AffineTransform());
        for (int i = 0; i < plines.length; i++) {
            for (int j = 0; j < plines[0].length; j++) {
                if (plines[i][j] == 1) {
                    g.drawImage(gras, gras.getWidth(null) * 16 * j, gras.getHeight(null) * 16 * i,
                            gras.getWidth(null) * 16, gras.getHeight(null) * 16, null);
                } else if (plines[i][j] == 2) {
                    g.drawImage(dirt, dirt.getWidth(null) * 16 * j, dirt.getHeight(null) * 16 * i,
                            dirt.getWidth(null) * 16, dirt.getHeight(null) * 16, null);
                } else {
                    g.drawImage(air, air.getWidth(null) * 16 * j, air.getHeight(null) * 16 * i, air.getWidth(null) * 16,
                            air.getHeight(null) * 16, null);
                }
            }
        }
    }

    public ArrayList<Collider> collider() {
        return colliders;
    }
}

package srmb;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class Loader {
    public static int[][] loader(String datapath) {
        String data;
        try {
            data = Files.readString(Path.of(datapath));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        String[] lines = data.split("\n");
        int[][] plines = new int[lines.length][lines[0].length()];
        for (int i = 0; i < lines.length; i++) {
            String line = lines[i];
            for (int j = 0; j < line.length(); j++) {
                char block = line.charAt(j);
                if (block == '1') {
                    plines[i][j] = 1;
                } else if (block == '2') {
                    plines[i][j] = 2;
                } else {
                    plines[i][j] = 0;
                }
            }
        }
        return plines;
    }
}

package srmb;

import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
        JFrame frame = new JFrame();
        frame.setSize(screensize);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Super Ratto Metello Bros.");
        Canvas canvas = new Canvas();
        frame.addKeyListener(canvas);
        frame.setFocusTraversalKeysEnabled(false);
        frame.setContentPane(canvas);
        JMenuBar menubar = new JMenuBar();
        JMenu menu1 = new JMenu("Settings");
        JMenu menu2 = new JMenu("Help");
        menubar.add(menu1);
        menubar.add(menu2);
        frame.setJMenuBar(menubar);
        frame.setVisible(true);
    }
}

package srmb;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class Player {
    int xpos = 0;
    int ypos = 0;
    int velox = 0;
    int veloy = 0;
    int maxvelox = 20;
    boolean gas = false;
    boolean jump = false;
    boolean left = false;
    boolean right = true;
    boolean colliding;
    Image ratr;
    Image ratl;

    Player() {
        try {
            ratr = ImageIO.read(new URL("file:///Users/user/Desktop/rat.right_v1.png"));
            ratl = ImageIO.read(new URL("file:///Users/user/Desktop/rat.left_v1.png"));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void update() {
        if (ypos + veloy < 1200 && jump == false && colliding == false) {
            veloy = veloy + 2;
            ypos = ypos + veloy;
        } else {
            ypos = 1200;
        }
        if (right == true) {
            xpos = xpos + velox;
        }
        if (left == true) {
            xpos = xpos - velox;
        }
        if (gas == false) {
            if (velox > 0) {
                velox = velox - 1;
            }

        }
        if (jump == true) {
            ypos = ypos + veloy;
        }

    }

    public void render(Graphics g) {

        if (right == true) {
            g.drawImage(ratr, xpos, ypos, ratr.getWidth(null) * 8, ratr.getHeight(null) * 8, null);
        } else if (left == true) {
            g.drawImage(ratl, xpos, ypos, ratl.getWidth(null) * 8, ratl.getHeight(null) * 8, null);
        }

    }

    public void keyTyped(KeyEvent e) {

    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT) {
            if (velox <= maxvelox) {
                velox = velox + 1;
            }
            gas = true;
            right = true;
            left = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT) {
            if (velox <= maxvelox) {
                velox = velox + 1;
            }
            gas = true;
            right = false;
            left = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP && ypos == 1200) {
            jump = true;
            veloy = veloy - 100;
        }
        if (e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_DOWN) {
        }
    }

    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP) {
            jump = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT) {
            gas = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT) {
            gas = false;
        }
    }

    public Collider collider() {
        Collider ratcol;
        if (right == true) {
            ratcol = new Collider(xpos, xpos + ratr.getWidth(null) * 8, ypos, ypos + ratr.getHeight(null) * 8);
        } else {
            ratcol = new Collider(xpos, xpos + ratl.getWidth(null) * 8, ypos, ypos + ratl.getHeight(null) * 8);
        }
        return ratcol;
    }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题