Как мне создавать копии объектов? - PullRequest
0 голосов
/ 04 мая 2020

Как создавать копии объекта Lasermid через равные промежутки времени? Lasermid - это след от лазерного луча. Я хочу, чтобы след от лазерного луча оставался не единственным объектом Lasermid, а набором. Как класс c игровая змея?

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.Stage;


public class Laser extends BaseActor {

Lasermid lasermid;

Color color=new Color(Color.GREEN);

public Laser(float x, float y, Stage s) {
    super(x, y, s);

    loadTexture("assets/Line11.png");


    setSize(30,10);
    setMaxSpeed(800);
    setBoundaryPolygon(8);
    setSpeed(10);

        lasermid = new Lasermid(-30, 0, s);
        addActor(lasermid);
        lasermid.setColor(color);
        // lasermid.setPosition(getX(),getY());

}


public void act(float dt) {
    super.act(dt);
    applyPhysics(dt);

}
 }

Класс Lasermid

public class Lasermid extends BaseActor{
public Vector2 position = new Vector2();


public Lasermid(float x, float y, Stage s) {
    super(x, y, s);

    loadTexture("assets/Line111.png");
    setSize(30, 10);
    setBoundaryPolygon(8);
}

public void act(float dt) {
    super.act(dt);
    applyPhysics(dt);
}
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Ваши классы не должны использовать Stage в конструкторе. Если бы вы на самом деле использовали его для чего-либо, это создаст двунаправленную связь и код fr agile.

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

Нет ярлыка для копирования объекта. Вы должны создать либо метод stati c, либо конструктор, который вручную копирует значения каждого свойства в новый экземпляр. И вы должны также скопировать внутренние ссылочные классы, если это уместно.

Таким образом, метод копирования для Laser будет выглядеть примерно так, но вам нужно будет скопировать каждый соответствующий параметр, который он использует:

public Laser copy() {
    final Laser laser = new Laser(getX(), getY());
    laser.setRotation(getRotation());
    laser.setSpeed(getSpeed());
    laser.setColor(getColor());
    laser.laserMid.setRotation(laserMid.getRotation);
    // etc.
    return laser;
}

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

// BaseActor constructor:
public BaseActor(BaseActor other) {
    super();
    setX(other.getX());
    setY(other.getY());
    setColor(other.getColor());
    // etc.
}

// Laser constructors:
public Laser(float x, float y) {
    super();
    init();
}

public Laser(Laser other) {
    super(other);
    init()
    laser.laserMid.setRotation(laserMid.getRotation);
    // etc.
}

private void init() {
    setSize(30,10);
    setMaxSpeed(800);
    setBoundaryPolygon(8);
    setSpeed(10);
    // etc.
}

Кстати, ваше поле color затеняет поле цвета, которое уже есть у актера.

0 голосов
/ 04 мая 2020

Вы должны использовать метод clone ().

Например: object.clone ()

https://en.wikipedia.org/wiki/Clone_ (Java_method)

https://www.geeksforgeeks.org/clone-method-in-java-2/

...