2015-03-05 5 views
2

Итак, я работаю над проектом темы Space Invaders, и у меня есть большинство моих классов, которые запускаются и запускаются в анимации. Часть процесса - это корабельное оружие.Создание глобального массива объектов (java)

У меня есть класс для оружия, как показано ниже (фокус на конструкторе):

/** 
* @(#)Weapon.java 
* 
* 
* @author Tristan Nel - 18179460 
* @version 1.00 2015/3/4 
*/ 


public class Weapon { 

    private String type; 
    private int damage; 
    private int rof; //rate of fire 
    private int orientation; 
    private int firingStage; //0 - not firing ; 1 - flash & recoil ; 2 - bullet 
    private String[] sprites; //Set of sprite image file names 

    public Weapon() { 
    } 

    public Weapon(String type, int damage, int rof, int orientation, int firingStage, String[] sprites) 
    { 
     this.type = type; 
     this.damage = damage; 
     this.rof = rof; 
     this.orientation = orientation; 
     this.firingStage = firingStage; 
     this.sprites = sprites; 
    } 

    //GET and SET Methods 
    public void setType(String type) 
    { 
     this.type = type; 
    } 

    public void setDamage(int damage) 
    { 
     this.damage = damage; 
    } 

    public void setROF(int rof) 
    { 
     this.rof = rof; 
    } 

    public void setOrientation(int orientation) 
    { 
     this.orientation = orientation; 
    } 

    public void setFiringStage(int firingStage) 
    { 
     this.firingStage = firingStage; 
    } 

    public void setSprites(String[] sprites) 
    { 
     this.sprites = sprites; 
    } 

    public String getType() 
    { 
     return this.type; 
    } 

    public int getDamage() 
    { 
     return this.damage; 
    } 

    public int getROF() 
    { 
     return this.rof; 
    } 

    public int getOrientation() 
    { 
     return this.orientation; 
    } 

    public int getFiringStage() 
    { 
     return this.firingStage; 
    } 

    public String[] getSprites() 
    { 
     return this.sprites; 
    } 

} 

В другом классе, который обрабатывает все элементы на экране игры, чтобы быть анимированными, я хочу, чтобы иметь глобальный массив жестко закодированных типов оружия, к которым можно получить доступ по мере необходимости без суеты. Я попытался сделать это в верхней части содержания класса:

/** 
* @(#)GameScreen.java 
* 
* 
* @author Tristan Nel - 18179460 
* @version 1.00 2015/3/4 
*/ 

import java.util.Scanner; 
import java.io.*; 

public class GameScreen { 

    private static final String HIGH_SCORE_FILE = "highScore.txt"; 

    //Available Weapons 
    //UPDATED SINCE ORIGINAL POST 
    public static final Weapon[] WEAPONS = new Weapon[4]; 
    WEAPONS[0] = new Weapon("Machinegun",  10, 20, 0, 0, {Graphics.MG_L_NORM, Graphics.MG_R_NORM}); 
    WEAPONS[1] = new Weapon("Plasma MG",  20, 20, 0, 0, {Graphics.PMG_L_NORM, Graphics.PMG_R_NORM}); 
    WEAPONS[2] = new Weapon("Photon Cannon",  40, 5, 0, 0, {Graphics.PC_L_NORM, Graphics.PC_R_NORM}); 
    WEAPONS[3] = new Weapon("Alien Destabilizer", 60, 10, 0, 0, {Graphics.AD_L_NORM, Graphics.AD_R_NORM}); 

    private Ship defender; 
    private Weapon equipped; 
    //private Invader[] aliens; 
    //private Bullet[] bullets; 
    private int score; 
    private int highscore; 
    private int lives; 

    public GameScreen() { 
    } 

    public GameScreen(Ship defender, int score, int lives) 
    { 
     this.defender = defender; 
     this.score = score; 
     this.lives = lives; 
    } 

    public void loadHighscore() 
    { 
     try 
     { 
      Scanner sc = new Scanner(new File(HIGH_SCORE_FILE)); 
      this.highscore = Integer.parseInt(sc.next()); 
      sc.close(); 
     } 
     catch(FileNotFoundException fnf) 
     { 
      System.out.println(fnf); 
      this.highscore = 0; 
     } 

    } 

    public void saveHighScore(int highscore) 
    { 
     try 
     { 
      FileWriter write = new FileWriter(HIGH_SCORE_FILE); 
      PrintWriter pw = new PrintWriter(write); 
      pw.print(this.highscore); 

      pw.close(); 
     } 
     catch(IOException e) 
     { 
      System.out.println(e); 
     } 
    } 

    //GET and SET methods 
    public void setDefender(Ship defender) 
    { 
     this.defender = defender; 
    } 

    public void setScore(int score) 
    { 
     this.score = score; 
    } 

    public void setLives(int lives) 
    { 
     this.lives = lives; 
    } 

    public Ship getDefender() 
    { 
     return this.defender; 
    } 

    public int getScore() 
    { 
     return this.score; 
    } 

    public int getLives() 
    { 
     return this.lives; 
    } 

} 

Это дает мне следующие сообщения об ошибках на каждой строке, я стараюсь, чтобы добавить еще один элемент в массив:

ОБНОВЛЕНО https://drive.google.com/file/d/0B7ye7Ul2JDG2NDFDRTJNM1FCd0U/view?usp=sharing

Это очень расстраивает .. Я где-то читал, что вам нужно создать объект в рамках метода? (Например, основной().) Но я пробовал, что в моем классе водителя и это не имело никакого значения ...

будет признателен за любую помощь/совет (:

+0

Извините, слово wrap не делает отчет об ошибке очень читаемым. Загрузите файл error.txt с моего Google Диска, чтобы проверить его правильно https://drive.google.com/file/d/0B7ye7Ul2JDG2NERKaE5wcVhNMlU/view?usp=sharing – gorrox23

+1

Я думаю, вы должны использовать новое ключевое слово –

+0

I haven ' t внимательно посмотрел на ошибки, но могу сказать, что объявление объекта требует «нового», т.е. 'Новое оружие (материал-идет-здесь)'. Я бы предположил, что количество ошибок означает, что это наименьшая из ваших проблем. – SimplyPanda

ответ

2

есть несколько вопросов

  • вы не можете иметь произвольный код в бодибилдинг y вашего класса, например. звонки WEAPONS[0] =. Однако вы можете инициализировать массив напрямую, используя новый синтаксис Type [] {}. Вы также можете использовать статический инициализатор static {}, но это не рекомендуется.

  • Кроме того, вы должны использовать конструктор с помощью нового ключевого слова, это не просто метод, т.е. new Weapon() не Weapon()

  • Вы не можете объявлять массивы, используя {}, т.е. new String[]{{Graphics.MG_L_NORM, Graphics.MG_R_NORM}} не {Graphics.MG_L_NORM, Graphics.MG_R_NORM}

Working версия

public static final Weapon[] WEAPONS = new Weapon[] { 
    new Weapon("Machinegun",  10, 20, 0, 0, new String []{Graphics.MG_L_NORM, Graphics.MG_R_NORM}), 
    new Weapon("Plasma MG",  20, 20, 0, 0, new String []{Graphics.PMG_L_NORM, Graphics.PMG_R_NORM}), 
    new Weapon("Photon Cannon",  40, 5, 0, 0, new String []{Graphics.PC_L_NORM, Graphics.PC_R_NORM}), 
    new Weapon("Alien Destabilizer", 60, 10, 0, 0, new String []{Graphics.AD_L_NORM, Graphics.AD_R_NORM}) 
}; 
+0

Вы мастер, отлично работающий. Я был немного плотным, чтобы не осознавать, что мне пришлось использовать новое ключевое слово для массива строк в качестве параметра. Большое спасибо – gorrox23

+0

@ gorrox23 Если вам понравился его ответ, пожалуйста, примите его. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – SimplyPanda

0

На самом деле я положил его неправильно раньше, но это выглядит вам нужно вызвать конструктор с помощью нового оператора, как это.

arrayName[0] = new Weapon(); 
0

Поскольку эти классы кажутся несколько статичными, что-то еще, что нужно изучить, это использовать перечисления для это. Это поможет избежать осложнений, когда вам нужно искать определенное оружие. Лучшим вариантом было бы иметь перечисление WeaponType, содержащее все статические неизменяемые данные относительно Оружия, и иметь класс Weapon, содержащий все данные состояния.

Смежные вопросы