2016-03-02 91 views
0

我试图用java做一个太空射击游戏,但它不工作。我目前正在研究产生敌人。为了保住所有敌人的位置,我使用了一个名为allEnemiesArrayListArrayList充满了Point对象。我通过在游戏循环中调用updateEnemies()来更新游戏。雪碧无法正常移动的Java

最初,我通过1例敌人的y位置增量,但这是太快了,所以我就在试图改变0.2慢下来。一旦我达到0.2,精灵就会在顶部产生,但不会向下移动。我为超过1的任何值工作,包括小数,但不低于任何值。这里是我的代码:

Enemy.java

package main; 

import java.awt.Point; 
import java.util.ArrayList; 

public class Enemy { 

    static ArrayList<Point> allEnemies = new ArrayList<Point>(); 

    public static ArrayList<Point> createEnemies(int round) { 
     for (int i = 0; i < round; i++) { 
      Point newEnemyLocation = new Point((int) (Math.random()*Game.WIDTH - 64), 0); 
      allEnemies.add(newEnemyLocation); 
     } 
     return allEnemies; 
    } 

    public static ArrayList<Point> updateEnemies() { 
     if (allEnemies.size() != 0) { 
      for (int i = 0; i < allEnemies.size(); i++) { 
       Point enemyLocation = allEnemies.get(i); 
       if (enemyLocation.y <= Game.HEIGHT) { 
        allEnemies.get(i).y += 0.2; 
       } else { 
        allEnemies.remove(i); 
       } 
      } 
     } 
     return allEnemies; 
    } 

} 

Game.java

package main; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 

public class Game extends Canvas implements Runnable, KeyListener { 

    //declare values 
    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = 800; 
    public static final int HEIGHT = 600; 
    public static final String TITLE = "Space Shooter"; 

    private boolean running = false; 
    private Thread thread; 

    private Player player; 

    private BufferedImage playerImage; 
    private BufferedImage bulletImage; 
    private BufferedImage enemyImage; 

    int playerx; 
    int playery; 

    int round = 1; 

    public Game() { 
     // 
     player = new Player((WIDTH/2)-32, HEIGHT-200); 

     //allocates all file resources 
     try { 
      playerImage = ImageIO.read(this.getClass().getResourceAsStream("/resources/player.png")); 
      bulletImage = ImageIO.read(this.getClass().getResourceAsStream("/resources/bullet.png")); 
      enemyImage = ImageIO.read(this.getClass().getResourceAsStream("/resources/enemy.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     addKeyListener(this); 
     setFocusable(true); 
     requestFocusInWindow(); 
    } 

    //starts thread 
    private synchronized void start() { 
     if (running) 
      return; 

     running = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    //stops thread 
    private synchronized void stop() { 
     if (!running) 
      return; 

     running = false; 
     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.exit(1); 
    } 

    @Override 
    //game loop 
    public void run() {  
     long lastTime = System.nanoTime(); 
     final double amountOfTicks = 60.0; 
     double ns = 1000000000/amountOfTicks; 
     double delta = 0; 
     int updates = 0; 
     int frames = 0; 
     long timer = System.currentTimeMillis(); 
     while (running) { 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      if (delta > 1) { 
       tick(); 
       updates++; 
       delta--; 
      } 
      Shoot.updateBullets(); 
      Enemy.updateEnemies(); 
      render(); 
      frames++; 

      if (System.currentTimeMillis() - timer > 1000) { 
       timer += 1000; 
       System.out.println(updates + " TICKS, " + frames + " FPS"); 
       updates = 0; 
       frames = 0; 
      } 
     } 
     stop(); 
    } 

    //updates sprite locations 
    public void tick() { 
     playerx = player.getX(); 
     playery = player.getY(); 
    } 

    //renders sprites 
    public void render() { 
     //setting up triple-buffering 
     BufferStrategy bs = this.getBufferStrategy(); 
     if (bs == null) { 
      createBufferStrategy(3); 
      return; 
     } 
     Graphics g = bs.getDrawGraphics(); 

     ////////////////////////////////// 

     g.setColor(Color.BLACK); g.fillRect(0,0,getWidth(), getHeight()); 
     g.drawImage(playerImage, playerx, playery, this); 

     if (Shoot.allBullets.size() != 0) { 
      for (int i = 0; i < Shoot.allBullets.size(); i++) { 
       int bulletx = (int) Shoot.allBullets.get(i).getX(); 
       int bullety = (int) Shoot.allBullets.get(i).getY(); 
       g.drawImage(bulletImage, bulletx + 21, bullety, this); 
      } 
     } 

     if (Enemy.allEnemies.size() != 0) { 
      for (int i = 0; i < Enemy.allEnemies.size(); i++) { 
       int enemyx = (int) Enemy.allEnemies.get(i).getX(); 
       int enemyy = (int) Enemy.allEnemies.get(i).getY(); 
       g.drawImage(enemyImage, enemyx, enemyy, this); 
      } 
     } else { 
      Enemy.createEnemies(round); 
      round++; 
     } 

     ////////////////////////////////// 

     g.dispose(); 
     bs.show(); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     int key = e.getKeyCode(); 
     if (key == KeyEvent.VK_SPACE) { 
      Shoot.addBullet(player.getX(), player.getY()); 
     } 
    } 

    public void keyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 
     if (key == KeyEvent.VK_UP) { 
      player.setY(playery -= 20); 
     } else if (key == KeyEvent.VK_DOWN) { 
      player.setY(playery += 20); 
     } else if (key == KeyEvent.VK_RIGHT) { 
      player.setX(playerx += 20); 
     } else if (key == KeyEvent.VK_LEFT) { 
      player.setX(playerx -= 20); 
     } 
    } 

    public void keyTyped(KeyEvent e) {} 

    public static void main(String[] args) { 

     Game game = new Game(); 
     JFrame frame = new JFrame(TITLE); 

     frame.setSize(WIDTH, HEIGHT); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.add(game); 
     frame.getContentPane().setBackground(Color.BLACK); 
     frame.setVisible(true); 

     game.start(); 

    } 

} 
+0

你需要具体什么问题是...... –

+0

问题是,当我设置敌方精灵以小于1的速度递增时,它根本不移动。 –

回答

2

你好这是因为点类包含2个整数x和y,你尝试添加0.2〜一个只能存储没有小数的值的整数,所以你有2个选项1是将点改为Point2D(保持双精度值和双精度值可以包含小数)或者你可以用ax和y创建一个敌人类float/double但是在这种情况下,我会选择1,因为这是一个小游戏,祝你好运!

编辑: 我错的Point2D,刚看到它是一个抽象类,所以做这样的

市民阶级敌人{

公共双X,Y;

公敌(双X,双Y){

 this.x = x; 
     this.y = y; 

}

}

并使用它作为你的ArrayList中的对象

+0

我试过了,但是代码的某些部分无法正常工作。有没有什么办法可以减缓敌人的速度而不这样做? –

+0

@the好糊弄,然后我会去制作一类2个双打(x和y),得花2个变量(X,Y)构造然后通过this.x = X设置在构造函数中的变量;和y一样,然后使用这个类,你刚刚作为arraylist中的对象而不是点 – WilliamTaco

+0

谢谢,这工作! –