**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
三天前关门了。
改进这个问题
我想做一个超级马里奥一样的游戏,我做了一个对撞机,所以老鼠可以碰撞地板,但它不工作。我在对撞机里找不到我的错误,所以请帮帮我。我是初学者,所以请不要恨我。我有我的画布,奶酪,对撞机,网格,装载机,主要和球员类。这是我的密码:
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;
}
}
暂无答案!
目前还没有任何答案,快来回答吧!