import java.awt.Color
import java.awt.Dimension
import java.awt.Graphics
import java.awt.Graphics2D
import java.awt.RenderingHints
import java.awt.event.MouseEvent
import java.awt.event.MouseMotionListener
import java.awt.image.BufferedImage
import javax.swing.JFrame
import javax.swing.JPanel
public class CopyOfBallCrash implements Runnable {
public static void main(final String[] args) {
new Thread(new CopyOfBallCrash()).start()
}
private final int width = 400
private final int height = 700
private int mouse_X, mouse_Y
private final BufferedImage offscreen = new BufferedImage(width, height,
BufferedImage.TYPE_4BYTE_ABGR)
private final JPanel panel = new JPanel()
private final Shape ball = new Shape(100, 100, 1, 1, 20)
private final Shape rect = new Shape(0, 100, 20)
public CopyOfBallCrash() {
final JFrame frame = new JFrame()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
panel.setPreferredSize(new Dimension(width, height))
ball.setBounds(width, height)
rect.setBounds(width, height)
frame.setContentPane(panel)
panel.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(final MouseEvent e) {}
@Override
public void mouseMoved(final MouseEvent e) {
mouse_X = e.getX()
mouse_Y = e.getY()
}
})
frame.pack()
frame.setVisible(true)
}
public void paint(final Graphics g) {
final Graphics2D g2d = offscreen.createGraphics()
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON)
g2d.fillRect(0, 0, width, height)
g2d.setColor(Color.blue)
rect.drawRect(g2d, mouse_X)
g2d.setColor(Color.red)
ball.drawOval(g2d, rect)
if (Shape.isLose) g2d.drawString("你输了!!!", 100, 300)
g2d.dispose()
g.drawImage(offscreen, 0, 0, null)
}
@Override
public void run() {
while (true)
paint(panel.getGraphics())
}
}
class Shape {
public int width, height
public int x, y, vx, vy, r, w, h
public static boolean isLose
public Shape(final int x, final int y, final int vx, final int vy, final int r) {
super()
this.x = x
this.y = y
this.vx = vx
this.vy = vy
this.r = r
}
public Shape(final int x, final int w, final int h) {
super()
this.x = x
this.w = w
this.h = h
}
public final void setBounds(final int width, final int height) {
this.width = width
this.height = height
}
public final void drawOval(final Graphics2D g2d, final Shape shape) {
if (y + h >= height) {
isLose = true
return
}
if (x + vx <= 0 || x + vx + w >= width) vx = -vx
if (y + vy <= 0) vy = -vy
if (isCrashOutside(shape.x, shape.y, shape.w, shape.h) &&y + w >= shape.y)
vy = -vy
x += vx
y += vy
g2d.fillOval(x, y, r, r)
}
public final void drawRect(final Graphics2D g2d, final int mouseX) {
y = height - h
if (x + w <width &&x <mouseX) x++
if (x >0 &&x >mouseX) x--
g2d.fillRect(x, y, w, h)
}
public final boolean isCrashOutside(final int x, final int y, final int w,
final int h) {
return (this.x >x ? this.x <= w + x : x <= r + this.x)
&&(this.y >y ? this.y <= h + y : y <= r + this.y)
}
}
我没用java写过代码,所以我只说算法,代码你自己翻译下按C的语法来:
void xiaoqiu
{
int UB=10,DB=200,LB=10,RB=200 //定义弹球范围的边界
int sh=1 //定义横向步长
int sz=1 //定义纵向步长(两步长之比决定了反弹的角度)
int x=LB,y=UB //定义坐标
int i=10000 //循环次数(自己选择跳出手段)
while(i>0)
{
i--
x=x+sh
if(x>=RB||x<=LB) sh=-sh //碰壁后步长变反
y=y+sz
if(y>=DB||y<=UB) sz=-sz //碰壁后步长变反
(显示代码)
}
return
}
总得来说,就是相当于横向和纵向分别处理移动、反弹的问题,碰壁后步长变为相反数
不懂请追问