我是游戏编程的新手。我正在尝试开发一款简单的射击游戏。我正在尝试的游戏场是圆形的。游戏中有一个射手和5个机器人。射手和机器人只能在圆形区域内移动。以下是我试过的代码片段。
我尝试使用State设计模式实现游戏。
在不允许射击者越过圆形边界的逻辑中获得结构。
请帮助完成具有更改射手逻辑的StateImpl
课程
位置。
public class Board extends JPanel implements ActionListener {
private static final long serialVersionUID = -397810249729996307L;
private final Timer timer;
private final Shooter shooter;
public Board(Point boardDimensions) {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.WHITE);
setDoubleBuffered(true);
setSize(boardDimensions.x, boardDimensions.y);
shooter = new Shooter(new Point(200, 225), boardDimensions);
timer = new Timer(5, this);
timer.start();
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
// g2d.draw(new Ellipse2D.Double(20, 10,350,350));
Ellipse2D.Double circle1 = new Ellipse2D.Double(20, 10, 350, 350);
g2d.draw(circle1);
g2d.drawImage(shooter.getImage(), shooter.getShooterPosition().x,
shooter.getShooterPosition().y, this);
g2d.setColor(Color.BLUE);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
/**
* Called by the AWT just after the user informs the listened-to component
* that an action should occur.
*/
public void actionPerformed(ActionEvent e) {
repaint();
}
private class TAdapter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
// Method to enable use of keys for control of the craft;
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
shooter.moveLeft();
}
if (key == KeyEvent.VK_UP) {
shooter.moveForward();
}
if (key == KeyEvent.VK_RIGHT) {
shooter.moveRight();
}
if (key == KeyEvent.VK_DOWN) {
shooter.moveBackward();
}
}
}
public void twait() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("main thread interrupted");
}
}
}
public class Shooter {
private Point shooterPosition;
private final State state;
protected Image image;
public Shooter(Point shooterPosition, Point boardSize) {
super();
this.shooterPosition = shooterPosition;
this.state = new StateImpl(this);
ImageIcon ii = new ImageIcon(this.getClass().getResource("bld2.png"));
image = ii.getImage();
}
public Point getShooterPosition() {
return shooterPosition;
}
public void setShooterPosition(Point shooterPosition) {
this.shooterPosition = shooterPosition;
}
public void moveLeft() {
this.shooterPosition = state.moveLeft();
}
public void moveRight() {
this.shooterPosition = state.moveright();
}
public void moveForward() {
this.shooterPosition = state.moveForward();
}
public void moveBackward() {
this.shooterPosition = state.moveBackward();
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
@Override
public String toString() {
return "Shooter [shooterPosition=" + shooterPosition + ", state="
+ state + ", image=" + image + "]";
}
}
public interface State {
public Point moveForward();
public Point moveBackward();
public Point moveLeft();
public Point moveright();
public void shoot();
}
public class StateImpl implements State {
private final Shooter shooter;
private final int boardSize = 200;
public StateImpl(Shooter shooter) {
this.shooter = shooter;
}
public Point moveForward() {
Point currentShooterPosition = this.shooter.getShooterPosition();
int newY = (currentShooterPosition.y + 1) > boardSize ? boardSize
: currentShooterPosition.y + 1;
return new Point(currentShooterPosition.x, newY);
}
public Point moveBackward() {
Point currentShooterPosition = this.shooter.getShooterPosition();
return new Point(currentShooterPosition.x, currentShooterPosition.y - 1);
}
public Point moveLeft() {
Point currentShooterPosition = this.shooter.getShooterPosition();
return new Point(currentShooterPosition.x - 1, currentShooterPosition.y);
}
public Point moveright() {
Point currentShooterPosition = this.shooter.getShooterPosition();
int newX = (currentShooterPosition.x + 1) > boardSize ? boardSize
: currentShooterPosition.x + 1;
return new Point(newX, currentShooterPosition.y);
}
public void shoot() {
}
}
答案 0 :(得分:1)
不是在paint()方法中初始化圆,而是将它(更重要的是它的中心)保存在类变量中。然后,每当射手移动时,测量圆心和射手新位置之间的距离。如果该距离大于圆的半径,则阻止射手的移动。