正如标题所说,我的导弹没有出现。我不确定它是一个输入错误还是什么。这里的任务说的话:太空侵略者类型游戏,导弹不会出现
BlockquotePart 5:拍摄
的巡逻舰将发射导弹的向上箭头键被按下时。 使类变量patrolMissileX和patrolMissileY。初始化 patrolMissileY为0.使一个容器PATROL_MISSILE_LENGTH初始化为 为10.编写一个方法:public static void movePatrolMissileAndDraw(Graphics g);即移动导弹并画 它类似于移动敌人船和拖曳:如果 巡逻Mississy为0,不要画任何东西。否则,导弹垂直线与 规定长度和x位置。巡逻Mississy是 线的顶部。用白色绘制导弹,将导弹上移5个像素,然后用黑色再次绘制导弹。如果巡逻MissileY为0或负数,则不要将 画成黑色导弹,但将巡逻MISSileY设置为0.
在循环睡眠之前调用此方法。当按下向上箭头键 并巡视MississyY为0时,将patrolMissileX设置为巡逻船的中心 ,并设置导弹的顶部,使其底部的 位于巡逻船顶部(PATROL_Y)的上方一个像素。你应该一次只能发射一枚导弹,如果仍然显示导弹,向上箭头不应该做任何事情。
而且,因为我一直来这里每一个部分,在最后一部分任何提示,将不胜感激:
第6部分:检测命中
进行布尔类变量,打,初始化为假;编写 方法:public static boolean detectHit();如果 当前导弹击中敌方舰船则返回true,否则返回false。如果导弹的顶部在敌方舰船的内部,则有一个命中 。为此到 发生了两件事情必须是真的:导弹的顶端的x值必须在敌人的左右两侧之间y的值为 导弹的顶端必须在顶部和底部之间敌人 。在startGame循环结束时,如果 detectHit()返回true,则将hit设置为true。修改moveEnemyShipAndDraw,使得如果命中 为真,则敌方船只被拉成黑色并且不会移动。在这个 的情况下,显示消息:敌舰命中!在绿色的下方一行 巡逻船上。如果敌方舰艇离开屏幕或时间运行了 ,显示消息:敌船离开!在红色的 以下的巡逻船上。
下面的代码:
import java.awt.*;
public class Project2 {
public static final int PATROL_Y = 250;
public static final int PATROL_SIZE = 20;
public static int patrolX = 270;
public static final int ENEMY_Y = 20;
public static final int ENEMY_SIZE = 30;
public static int enemyX = 0;
public static final int RIGHT_ARROW = 39;
public static final int LEFT_ARROW = 37;
public static final int UP_ARROW = 38;
public static int patrolMissileX = 0;
public static int patrolMissileY = 0;
public static final int PATROL_MISSILE_LENGTH = 10;
//exe starts here
public static void main(String[] args) {
DrawingPanel panel = new DrawingPanel(300, 300);
Graphics g = panel.getGraphics();
g.drawString("Project 2 by Garrett Griffin", 10, 15);
startGame(panel, g);
}
//Creates a patrol ship at x = patrolX,y=PATROL_Y, with side PATROL_SIZE in the given color
public static void drawPatrol(Graphics g, Color c){
g.setColor(Color.GREEN);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
}
//moveEnemyShipAndDraw: draws the enemy ship first in white, then increment enemyX by 1, then draws the ship in red again.
public static void moveEnemyShipAndDraw(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(enemyX, ENEMY_Y, ENEMY_SIZE, ENEMY_SIZE);
enemyX+=1;
g.setColor(Color.RED);
g.fillRect(enemyX, ENEMY_Y, ENEMY_SIZE, ENEMY_SIZE);
if(enemyX>300) {
g.setColor(Color.RED);
g.drawString("The enemy ship got away!", 10, 290);
}
}
//Handles user input: RIGHT_ARROW and LEFT_ARROW moves patrolship by 3 pixels left or right
public static void handleKeys(DrawingPanel panel, Graphics g) {
//Set panel.getKeyCode(); to a variable. Any variable.
int i = panel.getKeyCode();
//keep from going out of bounds on the right side
if (RIGHT_ARROW==i && patrolX>=280) {
g.setColor(Color.WHITE);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
patrolX-=3;
g.setColor(Color.GREEN);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
} else if (LEFT_ARROW==i && patrolX<=0) {
g.setColor(Color.WHITE);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
patrolX+=3;
g.setColor(Color.GREEN);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
//if RA, move right 3 pixels
} else if (RIGHT_ARROW==i) {
g.setColor(Color.WHITE);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
patrolX+=3;
g.setColor(Color.GREEN);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
//if LA, move left 3 pixels
} else if(LEFT_ARROW==i) {
g.setColor(Color.WHITE);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
patrolX-=3;
g.setColor(Color.GREEN);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
//if zero, do nothing
} else if(i==0) {
g.setColor(Color.GREEN);
g.fillRect(patrolX, PATROL_Y, PATROL_SIZE, PATROL_SIZE);
}
}
//Gets uparrow input from user to create missile. Do not draw anything if patrolMissileY is 0.
public static void movePatrolMissileAndDraw(DrawingPanel panel, Graphics g) {
int i = panel.getKeyCode();
if(UP_ARROW==i && patrolMissileY>0){
patrolMissileX=patrolX;
patrolMissileY=PATROL_Y;
g.setColor(Color.WHITE);
g.drawLine(patrolMissileX, patrolMissileY, PATROL_MISSILE_LENGTH, PATROL_MISSILE_LENGTH);
patrolMissileY+=5;
g.setColor(Color.BLACK);
g.drawLine(patrolMissileX, patrolMissileY, PATROL_MISSILE_LENGTH, PATROL_MISSILE_LENGTH);
}
}
public static void startGame(DrawingPanel panel, Graphics g) {
int x = 0;
int y = 270;
int deltaX = 1;
int deltaY = -3;
drawPatrol(g, Color.green);
for (int time = 0; time <= 1000; time++) {
moveEnemyShipAndDraw(g);
handleKeys(panel, g);
movePatrolMissileAndDraw(panel, g);
panel.sleep(50);
}
}
}
DrawingPanel类我使用:
/*
Stuart Reges and Marty Stepp
February 24, 2007
Changes by Tom Bylander in 2010 (no anti-alias, repaint on sleep)
Changes by Tom Bylander in 2012 (track mouse clicks and movement)
Changes by Tom Bylander in 2013 (fix bug in tracking mouse clicks)
Changes by S. Robbins in 2014 (getters for width and height)
Changes by S. Robbins in 2014 (addKeyListener added)
Changes by S. Robbins in 2014 (catch exception on default close so that it works in an applet)
Changes by S. Robbins in 2015 (buffer key events)
Changes by S. Robbins in 2015 (show mouse status by default is off)
The DrawingPanel class provides a simple interface for drawing persistent
images using a Graphics object. An internal BufferedImage object is used
to keep track of what has been drawn. A client of the class simply
constructs a DrawingPanel of a particular size and then draws on it with
the Graphics object, setting the background color if they so choose.
To ensure that the image is always displayed, a timer calls repaint at
regular intervals.
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.ArrayList;
public class DrawingPanel implements ActionListener {
private static final String versionMessage =
"Drawing Panel version 1.1, January 25, 2015";
private static final int DELAY = 100; // delay between repaints in millis
private static final boolean PRETTY = false; // true to anti-alias
private static boolean showStatus = false;
private static final int MAX_KEY_BUF_SIZE = 10;
private int width, height; // dimensions of window frame
private JFrame frame; // overall window frame
private JPanel panel; // overall drawing surface
private BufferedImage image; // remembers drawing commands
private Graphics2D g2; // graphics context for painting
private JLabel statusBar; // status bar showing mouse position
private volatile MouseEvent click; // stores the last mouse click
private volatile boolean pressed; // true if the mouse is pressed
private volatile MouseEvent move; // stores the position of the mouse
private ArrayList<KeyInfo> keys;
// construct a drawing panel of given width and height enclosed in a window
public DrawingPanel(int width, int height) {
this.width = width;
this.height = height;
keys = new ArrayList<KeyInfo>();
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
statusBar = new JLabel(" ");
statusBar.setBorder(BorderFactory.createLineBorder(Color.BLACK));
statusBar.setText(versionMessage);
panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
panel.setBackground(Color.WHITE);
panel.setPreferredSize(new Dimension(width, height));
panel.add(new JLabel(new ImageIcon(image)));
click = null;
move = null;
pressed = false;
// listen to mouse movement
MouseInputAdapter listener = new MouseInputAdapter() {
public void mouseMoved(MouseEvent e) {
pressed = false;
move = e;
if (showStatus)
statusBar.setText("moved (" + e.getX() + ", " + e.getY() + ")");
}
public void mousePressed(MouseEvent e) {
pressed = true;
move = e;
if (showStatus)
statusBar.setText("pressed (" + e.getX() + ", " + e.getY() + ")");
}
public void mouseDragged(MouseEvent e) {
pressed = true;
move = e;
if (showStatus)
statusBar.setText("dragged (" + e.getX() + ", " + e.getY() + ")");
}
public void mouseReleased(MouseEvent e) {
click = e;
pressed = false;
if (showStatus)
statusBar.setText("released (" + e.getX() + ", " + e.getY() + ")");
}
public void mouseEntered(MouseEvent e) {
// System.out.println("mouse entered");
panel.requestFocus();
}
};
panel.addMouseListener(listener);
panel.addMouseMotionListener(listener);
new DrawingPanelKeyListener();
g2 = (Graphics2D)image.getGraphics();
g2.setColor(Color.BLACK);
if (PRETTY) {
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(1.1f));
}
frame = new JFrame("Drawing Panel");
frame.setResizable(false);
try {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // so that this works in an applet
} catch (Exception e) {}
frame.getContentPane().add(panel);
frame.getContentPane().add(statusBar, "South");
frame.pack();
frame.setVisible(true);
toFront();
frame.requestFocus();
// repaint timer so that the screen will update
new Timer(DELAY, this).start();
}
public void showMouseStatus(boolean f) {
showStatus = f;
}
public void addKeyListener(KeyListener listener) {
panel.addKeyListener(listener);
panel.requestFocus();
}
// used for an internal timer that keeps repainting
public void actionPerformed(ActionEvent e) {
panel.repaint();
}
// obtain the Graphics object to draw on the panel
public Graphics2D getGraphics() {
return g2;
}
// set the background color of the drawing panel
public void setBackground(Color c) {
panel.setBackground(c);
}
// show or hide the drawing panel on the screen
public void setVisible(boolean visible) {
frame.setVisible(visible);
}
// makes the program pause for the given amount of time,
// allowing for animation
public void sleep(int millis) {
panel.repaint();
try {
Thread.sleep(millis);
} catch (InterruptedException e) {}
}
// close the drawing panel
public void close() {
frame.dispose();
}
// makes drawing panel become the frontmost window on the screen
public void toFront() {
frame.toFront();
}
// return panel width
public int getWidth() {
return width;
}
// return panel height
public int getHeight() {
return height;
}
// return the X position of the mouse or -1
public int getMouseX() {
if (move == null) {
return -1;
} else {
return move.getX();
}
}
// return the Y position of the mouse or -1
public int getMouseY() {
if (move == null) {
return -1;
} else {
return move.getY();
}
}
// return the X position of the last click or -1
public int getClickX() {
if (click == null) {
return -1;
} else {
return click.getX();
}
}
// return the Y position of the last click or -1
public int getClickY() {
if (click == null) {
return -1;
} else {
return click.getY();
}
}
// return true if a mouse button is pressed
public boolean mousePressed() {
return pressed;
}
public synchronized int getKeyCode() {
if (keys.size() == 0)
return 0;
return keys.remove(0).keyCode;
}
public synchronized char getKeyChar() {
if (keys.size() == 0)
return 0;
return keys.remove(0).keyChar;
}
public synchronized int getKeysSize() {
return keys.size();
}
private synchronized void insertKeyData(char c, int code) {
keys.add(new KeyInfo(c,code));
if (keys.size() > MAX_KEY_BUF_SIZE) {
keys.remove(0);
// System.out.println("Dropped key");
}
}
private class KeyInfo {
public int keyCode;
public char keyChar;
public KeyInfo(char keyChar, int keyCode) {
this.keyCode = keyCode;
this.keyChar = keyChar;
}
}
private class DrawingPanelKeyListener implements KeyListener {
int repeatCount = 0;
public DrawingPanelKeyListener() {
panel.addKeyListener(this);
panel.requestFocus();
}
public void keyPressed(KeyEvent event) {
// System.out.println("key pressed");
repeatCount++;
if ((repeatCount == 1) || (getKeysSize() < 2))
insertKeyData(event.getKeyChar(),event.getKeyCode());
}
public void keyTyped(KeyEvent event) {
}
public void keyReleased(KeyEvent event) {
repeatCount = 0;
}
}
}
感谢所有帮助的朋友。你们都是无价的。
来之前,你应该先做一些调试。如果您从未使用调试器,现在是时候开始了,因为它们不易使用,而且您学到的东西将对您所有未来的项目都有用。 – 2015-03-25 01:23:04
我来到这里是因为我一直在搞导弹大约一个小时左右。我得到的最多的是一个奇怪的黑色条,它在右上角我的名字上偏离了...此外,我们还没有完成任何调试?我不知道我们什么时候会过去。我们几乎没有得到if/else语句。 – JBGriffin 2015-03-25 01:25:01
你可以在课前“学习”他们。检查你的变量,看看你的程序运行时他们正在做什么。 – 2015-03-25 01:26:41