Возможно ли получить доступ к объекту, созданному внутри метода? - PullRequest
0 голосов
/ 07 октября 2019

Я работаю над своим финальным проектом для моего класса дизайна и разработки игр. У меня есть метод, который создает объект класса для персонажа и пространственную геометрию для представления вражеского персонажа.

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

Вот метод, который создает врага:

/*
Method to create an enemy model.  
*/
protected Spatial makeEnemy(String t, float x, float y, float z) {

    Character emy = new Character(t);

    // load a character from jme3test-test-data
    Spatial enemy = assetManager.loadModel(emy.getLocation());
    if (t=="ogre") {
        enemy.scale(4.0f);
    } else {
        enemy.scale(1.0f);
    }

    enemy.setLocalTranslation(x, y, z);

    //add physics
    enemy_phy = new RigidBodyControl(2f);
    enemy.addControl(enemy_phy);
    bulletAppState.getPhysicsSpace().add(enemy_phy);

    //add a light to make the model visible
    DirectionalLight sun = new DirectionalLight();
    sun.setDirection(new Vector3f(-0.1f, -0.7f, 1.0f));
    enemy.addLight(sun);
    enemy.rotate(0.0f, 3.0f, 0.0f);
    return enemy;
}//end makeEnemy

класс символов выглядит следующим образом:

public class Character {

    private String modelLocation; //the location of the model
    private int hitPoints;
    private int atk;
    private int score;

    Character() {
        modelLocation = "Models/Ninja/Ninja.mesh.xml";//makes the ninja the default character
        hitPoints = 10;
        atk = 1;
        score = 0;
    }//end no argument constructor

    /*
    This will be the constructor used primarily for 
    creating enemy characters.
    */
    Character(String s){
        if(s=="ogre"){
            modelLocation = "Models/Sinbad.j3o";
            hitPoints = 5;
            atk = 1;
            score= 0;
        } else {
            modelLocation = "Models/Oto/Oto.mesh.xml";
            hitPoints = 10;
            atk = 1;
            score = 0;
        }
    }//end constructor

    /*
    This constructor will be used for 
    creating the player character.
    */
    Character(String s, int h, int a){
        modelLocation = s;
        hitPoints = h;
        atk = a;
        score= 0;//score always starts at zero
    }//end constructor

    /*
    Getter Methods
    */
    public String getLocation() {
        return modelLocation;
    }//end getLocation
    public int getHitPoints() {
        return hitPoints;
    }//end getHitPoints
    public int getAtk() {
        return atk;
    }//end getAtk
    public int getScore() {
        return score;
    }//end getScore

    /*
    Setter methods
    */
    public void setHitPoints(int n) {
        hitPoints = n;
    }//end setHitPoints
    public void setAtk(int n) {
        atk = n;
    }//end setAtk
    public void setScore(int n) {
        score = n;
    }//end setScore

    //method to deal damage to character
    public void takeDamage(int a) {
        hitPoints = hitPoints - a;
    }//end takeDamage

    //mehtod to add to character score
    public void addScore() {
        if(modelLocation == "Models/Sinbad.j3o") {
            score = score + 1; // 1 point for a ogre
        } else {
            score = score + 2; //2 points for golems
        }//end if else
    }//end addScore
}//end character

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

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Локальные переменные доступны только «локально» , то есть только в пределах своей области, которая обычно определяется фигурными скобками ({}), в которых они созданы (только метод знает, где они находятся).

Чтобы решить упомянутую проблему и сделать переменную с символом доступной вне метода, у вас есть несколько вариантов:

  • Реализация переменной символа как экземпляра (возможно, даже переменной класса)и инициализировать его внутри метода.
  • Лучшим подходом было бы вернуть переменную Character вашим методом.

Предполагая, что пространственный объект описывает положение персонажа, вы могли бывернуть символ и пространство как пару значений ключа. В этой ситуации я бы использовал другой подход и определил бы Пространство для каждого персонажа в самом объекте персонажа (я не знаю, допускает ли это ваша архитектура).

0 голосов
/ 21 октября 2019

Поскольку это jMonkeyEngine, учтите следующее: Заставьте персонажа расширять AbstractControl. Тогда:

enemy.addControl(emy);

Теперь вы сможете получить к нему доступ через:

Character char = enemy.getControl(Character.class);
char.setHitPoints(10000);

Управляйте вашими друзьями: https://wiki.jmonkeyengine.org/jme3/advanced/custom_controls.html

...