是否实现扩展类

时间:2017-04-24 18:07:19

标签: java swing

关于java继承的另一个问题:我想知道两件事: 1)如何设置我的程序在使用继承类之间切换? 2)我不确定为什么我的扩展类glidingObject.java没有响应我的按键

这是我的Game.java(运行游戏;我应该传递一些参数,允许用户选择正确使用哪个类 - 飞行物体或滑翔物体?我也是包括我的飞行物体和滑翔物体的两个类)

public class Game extends JPanel {

private static final long serialVersionUID = 1L;

public static int WIDTH = 800, HEIGHT = 750;

public static ArrayList<Rectangle> columns;

public static Random rand;

public static double score;

public static boolean gameOver, started; //two modes, started and gameover

public static String username;

public static String currTime;

public static Timer timer;

public static flyingObject obj;

private PropertyChangeSupport mPcs = new PropertyChangeSupport(this);

public Game(flyingObject object){

    obj = object;
    timer = new Timer(20, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                tick();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    });

    columns = new ArrayList<Rectangle>();
    rand = new Random(); 
    Background bk = new Background();

    addColumn(true);
    addColumn(true);
    addColumn(true);
    addColumn(true);

    addMouseListener(new MouseAdapter() {       
        @Override
        public void mouseReleased(MouseEvent e) {
            started = true;
        }
    });

    PropertyChangeListener listener = new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            try {
                scoreBoard.record();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    this.addPropertyChangeListener(listener);

    getDate(); //get the date of the game played
    mPcs.firePropertyChange("gameOver",false, true); //alert record() method when the game is over
    timer.start();      
}

//adding the column
public static void addColumn(boolean start) {
    int space = 300; 
    int width = 100; 
    int height = 50 + rand.nextInt(300);

    if (start) { 
        //add top and bottom
        columns.add(new Rectangle(WIDTH + width + columns.size() * 300, HEIGHT - height - 120, width, height + 100));
        columns.add(new Rectangle(WIDTH + width + (columns.size() - 1) * 300, 0, width, HEIGHT - height - space));
    }
    else
    {
        columns.add(new Rectangle(columns.get(columns.size() - 1).x + 600, HEIGHT - height - 120, width, height + 100));
        columns.add(new Rectangle(columns.get(columns.size() - 1).x, 0, width, HEIGHT - height - space));
    }
}

//paint the columns
public void paintColumn(Graphics g, Rectangle column) {
    g.setColor(Color.white);
    g.fillRect(column.x, column.y, column.width, column.height);
}

public static void reset() {
    obj = new glidingObject(WIDTH / 2 - 10, HEIGHT / 2 - 10);
    columns.clear();
    score = 0.0;

    addColumn(true);
    addColumn(true);
    addColumn(true);
    addColumn(true);

    gameOver = false;
}

public void tick() throws IOException {
    if (started) {      
        int speed = 10;
        glidingObject.move();
        for (int i = 0; i < columns.size(); i ++) {
            Rectangle column = columns.get(i);
            column.x -= speed;

            if (column.x + column.width < 0) {
                columns.remove(column);
                if  (column.y == 0) {
                    addColumn(false);
                }
            }
        }
        for (Rectangle column: columns) {
            if (column.x == glidingObject.X) {
                score += 0.5;
            }

            if (column.intersects(glidingObject.getBounds())) {
                gameOver = true;

                //when the object crashes, it does not go through the column
                if (glidingObject.X <= column.x) {
                    glidingObject.X = column.x - glidingObject.DIAMETER; 
                }
                else if (glidingObject.Y < column.height) {
                    glidingObject.Y = column.height;
                }      
                Main.gameOver();
            }
        }

        if (glidingObject.Y > HEIGHT || glidingObject.Y < 0) {
            gameOver = true;
            //timer.stop();
            Main.gameOver();
        }

        if (glidingObject.Y + glidingObject.YMotion >= HEIGHT) {
            gameOver = true;
            //timer.stop();
            Main.gameOver();
        }
    }
    //update the display
    repaint();
}

public void getDate() {
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date date = new Date();
    currTime = dateFormat.format(date);
    }

 @Override
    public void paintComponent(Graphics g) {

    super.paintComponent(g);


    Background.paint(g);
    glidingObject.paint(g);

    for (Rectangle column: columns) {
        paintColumn(g, column);
    }

    g.setColor(Color.white);
    g.setFont(new Font("Manaspace", 1, 60));

   if (!started) {
       g.drawString("Click to start!", 75, HEIGHT / 2 - 50);
   }

   if (gameOver) {
       g.drawString("Game Over!", 200, HEIGHT / 2 - 50);
   }

   if (!gameOver && started) {
       g.drawString(String.valueOf(score), WIDTH / 2 - 25, 100);
   }
}

}

class flyingobject.java

public class flyingObject implements ActionListener, MouseListener, KeyListener {

static int DIAMETER = 25;
static int Y; // Y position of the unicorn
static int X; // X position of the unicorn
static int YMotion; // Y movement of the unicorn

//parameters are the initial positions
public flyingObject(int xpos, int ypos) {
    X = xpos;
    Y = ypos; // this changes
}

//getters
public int getX() {
    return X;
}

public int getY() {
    return Y;
}

//setters
public void setX(int newX) {
    X = newX;
}

public void setY(int newY) {
    Y = newY;
}

//the bounds of the object (rectangle) 
public static Rectangle getBounds() {
    return new Rectangle(X, Y, DIAMETER, DIAMETER);
}

//the visible component of the object - this can get overriden by subclasses
public static void paint(Graphics g){   
    g.setColor(Color.white);
    g.fillRect(X, Y, DIAMETER, DIAMETER);
}

//the movement component of the object
public static void jump() {     

    if (Game.gameOver) {
        Game.reset();
        Game.gameOver = false;
    }
    if (!Game.started) {
        Game.started = true;
    }
    else if (!Game.gameOver) {
    if (YMotion > 0) {
        YMotion = 0;
    }
    YMotion -= 14;
    }
}

public static void move() {
    if ((Y > 0) && (Y < Game.HEIGHT)) {
        YMotion += 1.5; // gravity
        Y += YMotion;
    }
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_SPACE)
    {
        jump();
    }
}

@Override
public void mouseClicked(MouseEvent e) {
    jump();
}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}

@Override
public void actionPerformed(ActionEvent e) {

}


}

类glidingobject.java(game.java应该允许用户在使用飞行物体或扩展类滑翔物体之间进行选择)

public class glidingObject extends flyingObject{

//velocity of the object
private static int vx; 
private static int vy;
private static int lives;

public glidingObject(int xpos, int ypos) {
    super(xpos, ypos);
    vx = 0;
    vy = 0; 
    lives = 3;
}

//getter methods

public int getVx() {
    return vx;
}

public int getVy() {
    return vy;
}
//setter methods

public void setVx(int newVx) {
    vx = newVx;
}

public void setVy(int newVy) {
    vy = newVy;
}

//moves the object
public static void jump() {
    X += vx;
    Y += vy;
}

public static void paint(Graphics g) {
    g.setColor(Color.CYAN);
    g.fillOval(X, Y, DIAMETER, DIAMETER);
}

@Override 
public void keyTyped(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT){
        vx = 10;
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT){
        vx = -10;
    }
    if (e.getKeyCode() == KeyEvent.VK_UP){
        vy = 10;
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN){
        vy = -10;
    }
}

@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void mouseClicked(MouseEvent e) {

}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}

@Override
public void actionPerformed(ActionEvent e) {

}

}

1 个答案:

答案 0 :(得分:1)

  

我应该传递一些参数,允许用户选择正确使用哪个类 - 飞行物体还是滑翔物体?

这是interface变得如此强大的地方。飞行&#34;飞行&#34;和&#34;滑翔&#34;对象将共享一些共同的属性/功能,这些应该由接口描述。您Game应该只接受此interface的实例,它不应该关注实施的内容,只关注它们是否符合商定的interface

这是&#34;接口代码的原则,而不是实现&#34;

这有多复杂取决于你,例如,你可以有抽象的实现来描述&#34; air&#34;基于实体和&#34;地面&#34;基于实体,您可以从中获得&#34; powered&#34;并且&#34;无动力&#34;抽象&#34; air&#34;的实现所有这些都将被绑定到游戏实体&#34; interface

  

我不确定为什么我的扩展类glidingObject.java没有响应我的按键

这是因为您正在使用KeyListener,因为它与焦点相关的问题而闻名。有关推荐的解决方案,请参阅How to Use Key Bindings