java吧 关注:1,273,845贴子:12,784,123
  • 6回复贴,共1

关于键盘侦听器,请教下大佬们

只看楼主收藏回复

飞机大战小游戏的 先上代码


1楼2018-08-01 23:48回复
    package JSD1806HYQ;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.Graphics;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.awt.image.BufferedImage;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    /** 世界 */
    public class World extends JPanel implements KeyListener{
    public static final int WIDTH = 800;
    public static final int HEIGHT = 1000;
    public static final int updistance=30;//java窗口中上边距为30个像素;
    public static final int downdistance=8;//java窗口中下边距左右编剧为8个像素;
    private static final long serialVersionUID = 1L;
    private Boss zzlz = new Boss();
    private Sky sky = new Sky();
    private Hero hero = new Hero();
    private FlyingObject[] enemies = {}; //敌人数组
    private Bullet[] bullets = {}; //子弹数组
    private DrBullet[] drbullets = {};
    Date startTime;//界面开始的时间
    Date startTime1;//游戏开始的时间
    Date endTime;//飞机死亡的时间
    Date nowTime;//现在的时间
    Date collisionTime=new Date();
    Date collisionTimeNow;
    long timefirst=24625;
    long now_startTime;//开始到现在的时间
    int enterNum=0;
    boolean bigbullet=true;
    boolean boss=false;//判断是否是boss关
    boolean flag = false;//表示游戏是否开始
    public static BufferedImage start;
    public static BufferedImage pause;
    public static BufferedImage gameover;
    static{
    start = FlyingObject.loadImage("start.png");
    pause = FlyingObject.loadImage("pause.png");
    gameover = FlyingObject.loadImage("gameover.png");
    }
    public FlyingObject nextOne(){
    Random rand = new Random();
    int type = rand.nextInt(20);
    if(type < 4){
    return new Bee();
    }else if(type < 12){
    return new Airplane();
    }else {
    return new BigAirplane();
    }
    }
    int flyEnterIndex = 0;
    public void enterAction(){
    flyEnterIndex++;
    if(flyEnterIndex%40==0){
    FlyingObject obj = nextOne();
    enemies = Arrays.copyOf(enemies,enemies.length+1);
    enemies[enemies.length-1] = obj;
    }
    }
    public void stepAction(){
    zzlz.step();
    sky.step();
    for(int i=0;i<enemies.length;i++){
    enemies[i].step();
    }
    for(int i=0;i<bullets.length;i++){
    bullets[i].step();
    }
    }
    int shootIndex = 0;
    public void shootAction(){
    shootIndex++;
    if(shootIndex%30==0){
    Bullet[] bs = hero.shoot();
    bullets = Arrays.copyOf(bullets,bullets.length+bs.length);
    System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);
    }
    }
    private int score = 0;
    public void bangAction(){
    for(int i=0;i<bullets.length;i++){
    Bullet b = bullets[i];
    for(int j=0;j<enemies.length;j++){
    FlyingObject f = enemies[j];
    if(b.isLife() && f.isLife() && b.hit(f)){
    b.goDead();
    f.goDead();
    if(f instanceof Enemy){
    Enemy e = (Enemy)f;
    score += e.getScore();
    }
    if(f instanceof Award){
    Award a = (Award)f;
    int type = a.getAwardType();
    switch(type){
    case Award.DOUBLE_FIRE:
    hero.addDoubleFire();
    break;
    case Award.LIFE:
    hero.addLife();
    break;
    }
    }
    }
    }
    }
    }
    public void outOfBoundsAction(){
    int index = 0;
    FlyingObject[] enemyLives = new FlyingObject[enemies.length];
    for(int i=0;i<enemies.length;i++){
    FlyingObject e = enemies[i];
    if(!e.outOfBounds() && !e.isRemove()){
    enemyLives[index++] = e;
    }
    }
    enemies = Arrays.copyOf(enemyLives,index);
    index = 0;
    Bullet[] bulletLives = new Bullet[bullets.length];
    for(int i=0;i<bullets.length;i++){
    Bullet b = bullets[i];
    if(!b.outOfBounds() && !b.isRemove()){
    bulletLives[index++] = b;
    }
    }
    bullets = Arrays.copyOf(bulletLives,index);
    }
    public void hitAction(){
    for(int i=0;i<enemies.length;i++){
    FlyingObject f = enemies[i];
    if(f.isLife() && hero.hit(f)){
    f.goDead();
    hero.subtractLife();
    hero.clearDoubleFire();
    break;
    }
    }
    }
    public void checkGameOverAction(){
    if(hero.getLife()<=0){
    flag = false;
    }
    }
    int num = 1;
    public void action(){ //启动执行
    Timer timer = new Timer();
    int intervel = 10;
    timer.schedule(new TimerTask(){
    public void run(){
    if(flag==true){
    enterAction();
    stepAction();
    shootAction();
    outOfBoundsAction();
    bangAction();
    hitAction();
    checkGameOverAction();
    }
    repaint();
    }
    },intervel,intervel);
    }
    public void paint(Graphics g){
    if(now_startTime>1000){
    System.out.println(now_startTime);
    boss=true;
    zzlz.paintObject(g);
    }
    sky.paintObject(g);
    hero.paintObject(g);
    for(int i=0;i<enemies.length;i++){
    enemies[i].paintObject(g);
    }
    for(int i=0;i<bullets.length;i++){
    bullets[i].paintObject(g);
    }
    for(int i=0;i<drbullets.length;i++){
    drbullets[i].paintObject(g);
    }
    g.drawString("SCORE: "+score,10,25);
    g.drawString("LIFE: "+hero.getLife(),10,45);
    }
    public static void main(String[] args) {
    JFrame frame = new JFrame();
    World world = new World();
    frame.add(world);
    frame.addKeyListener(world);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    world.action();
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyPressed(KeyEvent e) {
    hero.addDirection(e);
    if(e.getKeyCode()==KeyEvent.VK_ENTER){
    flag = true;
    }
    }
    @Override
    public void keyReleased(KeyEvent e) {
    hero.minusDirection(e);
    if(e.getKeyCode()==KeyEvent.VK_ENTER){
    enterNum++;
    if(enterNum==1){
    startTime=new Date();//游戏开始的时间
    System.out.println(startTime);
    }
    }
    }
    }


    2楼2018-08-01 23:49
    回复
      2025-08-13 22:46:41
      广告
      不感兴趣
      开通SVIP免广告
      package JSD1806HYQ;
      import java.awt.Graphics;
      import java.awt.event.KeyEvent;
      import java.awt.image.BufferedImage;
      /** 英雄机类 */
      public class Hero extends FlyingObject implements Enemy{
      private static BufferedImage image;
      static {
      image = loadImage("hero0.png");
      }
      public boolean right,left,up,down;
      private boolean Life; //命
      private int doubleFire; //火力值
      private int life;
      /** 构造方法 */
      public Hero(){
      super(97,124,350,800);
      life = 3;
      doubleFire = 0;
      xSpeed = 2;
      ySpeed = 2;
      }
      int index = 0; //下标
      /** 重写getImage()获取图片 */
      public BufferedImage getImage() { //每10毫秒走一次
      return image;
      }
      /** 生成子弹对象(英雄机发射子弹) */
      public Bullet[] shoot() {
      int xStep = this.width/4; //1/4英雄机的宽
      int yStep = 20; //固定的20
      if(doubleFire>0) { //双
      Bullet[] bs = new Bullet[2]; //2发子弹
      bs[0] = new Bullet(this.x+1*xStep,this.y-yStep); //子弹的x:英雄机的x+1/4英雄机的宽 子弹的y:英雄机的y-固定的20
      bs[1] = new Bullet(this.x+3*xStep,this.y-yStep); //子弹的x:英雄机的x+3/4英雄机的宽 子弹的y:英雄机的y-固定的20
      doubleFire-=2; //发射一次双倍火力,则火力值减2
      return bs;
      }else { //单
      Bullet[] bs = new Bullet[1]; //1发子弹
      bs[0] = new Bullet(this.x+2*xStep,this.y-yStep); //子弹的x:英雄机的x+2/4英雄机的宽 子弹的y:英雄机的y-固定的20
      return bs;
      }
      }
      /** 英雄机增命 */
      public void addLife(){
      life++; //命数增1
      }
      /** 获取英雄机的命 */
      public int getLife(){
      return life; //返回命数
      }
      /** 英雄机减命 */
      public void subtractLife(){
      life--; //命数减1
      }
      /** 清空火力值 */
      public void clearDoubleFire(){
      doubleFire=0; //火力值归零
      }
      /** 英雄机增火力 */
      public void addDoubleFire(){
      doubleFire+=40; //火力值增40
      }
      @Override
      public int getScore() {
      // TODO Auto-generated method stub
      return 0;
      }
      //U上 D下 L左 R右
      //up down left right
      public void step(){
      if(left){
      x-=xSpeed;
      }else if(right){
      x+=xSpeed;
      }else if(up){
      y-=ySpeed;
      }else if(down){
      y+=ySpeed;
      }else if(left || up){
      x-=xSpeed;
      y-=ySpeed;
      }else if(left || down){
      x-=xSpeed;
      y+=ySpeed;
      }else if(right || up){
      x+=xSpeed;
      y-=ySpeed;
      }else if(right || down){
      x+=xSpeed;
      y+=ySpeed;
      }
      }
      private void repaint() {
      // TODO Auto-generated method stub
      }
      public void addDirection(KeyEvent e){
      switch(e.getKeyCode()){
      case KeyEvent.VK_KP_UP:
      up=true;
      break;
      case KeyEvent.VK_KP_DOWN:
      down=true;
      break;
      case KeyEvent.VK_KP_LEFT:
      left=true;
      break;
      case KeyEvent.VK_KP_RIGHT:
      right=true;
      break;
      default:
      break;
      }
      }
      public void minusDirection(KeyEvent e){
      switch(e.getKeyCode()){
      case KeyEvent.VK_KP_UP:
      up=false;
      break;
      case KeyEvent.VK_KP_DOWN :
      down=false;
      break;
      case KeyEvent.VK_KP_LEFT:
      left=false;
      break;
      case KeyEvent.VK_KP_RIGHT:
      right=false;
      break;
      default:
      break;
      }
      }
      public void yj(){
      if(Life){
      if(x<=World.downdistance){
      left=false;
      }
      if(x>=(World.WIDTH-World.downdistance-width)){
      right=false;
      }
      if(y<=World.updistance){
      up=false;
      }
      if((y>=World.HEIGHT-World.downdistance-height)){
      down=false;
      }
      }
      }
      }


      3楼2018-08-01 23:49
      回复
        英雄机的Step方法应该放在哪 如何让英雄机动起来,是我哪里写错了吗


        4楼2018-08-01 23:50
        收起回复
          同飞机大战 我的主函数已经破千行了 敌人飞机各种不同进攻走位轮播切换 玩家子弹火力 根据奖励5种不同变换 然后还有玩家可以放aoe技能


          IP属地:福建来自Android客户端5楼2018-08-02 12:42
          收起回复