'package javaapplication12;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.*;
/** Bouncing Ball (Animation) via custom thread */
public class JavaApplication12 extends JFrame implements KeyListener{
// Define named-constants
private static final int CANVAS_WIDTH = 640;
private static final int CANVAS_HEIGHT = 480;
private static final int UPDATE_INTERVAL = 30; // milliseconds
int xx = 200;
int yy = 400;
Shape a1;
Shape a2;
Rectangle2D a3;
Rectangle2D a12;
Rectangle2D a4;
Rectangle2D a5;
Rectangle2D a6;
Rectangle2D a7;
Rectangle2D a8;
Rectangle2D a9;
Rectangle2D a10;
Rectangle2D a11;
Rectangle2D a13;
Rectangle2D a14;
Rectangle2D a15;
Rectangle2D a16;
Rectangle2D a17;
Rectangle2D a18;
Rectangle2D a19;
Rectangle2D a20;
Rectangle2D a21;
Rectangle2D a22;
Rectangle2D a23;
Rectangle2D a25;
ArrayList<Rectangle2D> s = new ArrayList<Rectangle2D>();
Color c2 = Color.RED;
private DrawCanvas canvas; // the drawing canvas (extends JPanel)
// Attributes of moving object
private int x = 375; // top-left (x, y)
private int y = 355;
private int size = 20; // width and height
private int xSpeed = 3; // moving speed in x and y directions
private int ySpeed = 5; // displacement per step in x and y
/** Constructor to setup the GUI components */
public JavaApplication12() {
canvas = new DrawCanvas();
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
this.setContentPane(canvas);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setTitle("Bouncing Ball");
this.setVisible(true);
addKeyListener(this);
fun();
// Create a new thread to run update at regular interval
Thread updateThread = new Thread() {
@Override
public void run() {
while (true) {
update(); // update the (x, y) position
repaint(); // Refresh the JFrame. Called back paintComponent()
try {
// Delay and give other thread a chance to run
Thread.sleep(UPDATE_INTERVAL); // milliseconds
} catch (InterruptedException ignore) {}
}
}
};
updateThread.start(); // called back run()
}
/** Update the (x, y) position of the moving object */
public void update() {
x += xSpeed;
y += ySpeed;
if (x > CANVAS_WIDTH - size || x < 0) {
xSpeed = -xSpeed;
}
if (y > CANVAS_HEIGHT - size || y < 0) {
ySpeed = -ySpeed;
}
}
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
int keycode = ke.getKeyCode();
if(keycode == KeyEvent.VK_LEFT)
{
xx = xx-15;
}
if(keycode == KeyEvent.VK_RIGHT)
{
xx = xx+15;
}
}
@Override
public void keyReleased(KeyEvent ke) {
// throw new UnsupportedOperationException("Not supported yet.");
}
/** DrawCanvas (inner class) is a JPanel used for custom drawing */
class DrawCanvas extends JPanel {
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // paint parent's background
Graphics2D d = (Graphics2D)g;
for(Rectangle2D r : s){
d.fill(r);
}
setBackground(Color.BLACK);
g.setColor(Color.BLUE);
a1 = new Ellipse2D.Double(x,y,size,size);
a2 = new RoundRectangle2D.Double(xx,yy,120,10,20,20);
a25 = new Rectangle2D.Double(530,120,100,20);
d.fill(a1);
d.setPaint(c2);
d.fill(a2);
if(a1.intersects(a3.getBounds()))
{
s.remove(a3);ySpeed = -ySpeed;
}
if(a1.intersects(a4.getBounds()))
{
s.remove(a4);ySpeed = -ySpeed;
}
if(a1.intersects(a5.getBounds()))
{
s.remove(a5);ySpeed = -ySpeed;
}
if(a1.intersects(a6.getBounds()))
{
s.remove(a6);ySpeed = -ySpeed;
}
if(a1.intersects(a7.getBounds()))
{
s.remove(a7);ySpeed = -ySpeed;
}
if(a1.intersects(a8.getBounds()))
{
s.remove(a8);ySpeed = -ySpeed;
}
if(a1.intersects(a9.getBounds()))
{
s.remove(a9);ySpeed = -ySpeed;
}
if(a1.intersects(a10.getBounds()))
{
s.remove(a10);ySpeed = -ySpeed;
}
if(a1.intersects(a11.getBounds()))
{
s.remove(a11);ySpeed = -ySpeed;
}
if(a1.intersects(a12.getBounds()))
{
s.remove(a12);ySpeed = -ySpeed;
}
if(a1.intersects(a13.getBounds()))
{
s.remove(a13);ySpeed = -ySpeed;
}
if(a1.intersects(a14.getBounds()))
{
s.remove(a14);ySpeed = -ySpeed;
}
if(a1.intersects(a15.getBounds()))
{
s.remove(a15);ySpeed = -ySpeed;
}
if(a1.intersects(a16.getBounds()))
{
s.remove(a16);ySpeed = -ySpeed;
}
if(a1.intersects(a17.getBounds()))
{
s.remove(a17);ySpeed = -ySpeed;
}
if(a1.intersects(a18.getBounds()))
{
s.remove(a18);ySpeed = -ySpeed;
}
if(a1.intersects(a19.getBounds()))
{
s.remove(a19);ySpeed = -ySpeed;
}
if(a1.intersects(a20.getBounds()))
{
s.remove(a20);ySpeed = -ySpeed;
}
if(a1.intersects(a21))
{
s.remove(a21);ySpeed = -ySpeed;
}
if(a1.intersects(a22))
{
s.remove(a21);ySpeed = -ySpeed;
ySpeed = -ySpeed;
}
collide();
}
}
public final void fun()
{
a3 = new Rectangle2D.Double(20,15,100,20);
a4 = new Rectangle2D.Double(150,15,100,20);
a5 = new Rectangle2D.Double(280,15,100,20);
a6 = new Rectangle2D.Double(400,15,100,20);
a7 = new Rectangle2D.Double(530,15,100,20);
a8 = new Rectangle2D.Double(20,50,100,20);
a9 = new Rectangle2D.Double(150,50,100,20);
a10 = new Rectangle2D.Double(280,50,100,20);
a12 = new Rectangle2D.Double(400,50,100,20);
a11 = new Rectangle2D.Double(530,50,100,20);
a13 = new Rectangle2D.Double(20,85,100,20);
a14 = new Rectangle2D.Double(150,85,100,20);
a15 = new Rectangle2D.Double(280,85,100,20);
a16 = new Rectangle2D.Double(400,85,100,20);
a17 = new Rectangle2D.Double(530,85,100,20);
a18 = new Rectangle2D.Double(20,120,100,20);
a19 = new Rectangle2D.Double(150,120,100,20);
a20 = new Rectangle2D.Double(280,120,100,20);
a21 = new Rectangle2D.Double(400,120,100,20);
a22 = new Rectangle2D.Double(530,120,100,20);
s.add(a3);
s.add(a4);
s.add(a5);
s.add(a6);
s.add(a7);
s.add(a8);
s.add(a9);
s.add(a10);
s.add(a11);
s.add(a12);
s.add(a13);
s.add(a14);
s.add(a15);
s.add(a16);
s.add(a17);
s.add(a18);
s.add(a19);
s.add(a20);
s.add(a21);
s.add(a22);
}
public void collide()
{
if(a2.intersects(a1.getBounds()))
{
xSpeed = +xSpeed;
ySpeed = -ySpeed;
}
}
public static void main(String[] args) {
// Run GUI codes in Event-Dispatching thread for thread safety
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JavaApplication12(); // Let the constructor do the job
}
});
}
} `
好的我是Java游戏编程的新手。我正在编写一个类似砖块破坏者的游戏
我有一个包含一些矩形的数组列表。我使用增强型for-loop
绘制它。我的比赛有一个球,当球击中矩形时,它必须在球必须反向运动的同时消失。一切正常。但是一旦矩形消失,如果球再次移动到那个位置,即使矩形不存在,球也会反向移动。
使用intersect()
方法检查了Collison。
答案 0 :(得分:1)
用于绘制矩形的代码使用了arraylist&#39; s,并且您的逻辑正确地删除它们以便它们消失。
但是,用于反转速度的代码不会考虑该矩形是否仍处于&#39;或不。无论是否从一个矩形中移除了逻辑:
if(a1.intersects(a3.getBounds()))
如果球到达矩形所在的位置,将始终返回true。您需要执行以下操作:
if(s.contains(a3) && a1.intersects(a3.getBounds()))
以便在删除矩形后,它将不匹配并反弹。
此外,您在&#39; a22&#39;:
中输入了拼写错误if(a1.intersects(a22))
{
s.remove(a21);ySpeed = -ySpeed;
ySpeed = -ySpeed;
}
应该是:
if(a1.intersects(a22))
{
s.remove(a22);ySpeed = -ySpeed;
}
另一件需要考虑的事情是,如果球在两个矩形之间正好击中,它将与两个矩形相交,并且它们将各自反转ySpeed(因此球将继续直行)
希望有所帮助!