首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建对象的副本?

如何创建对象的副本?
EN

Stack Overflow用户
提问于 2020-05-04 21:25:14
回答 2查看 65关注 0票数 0

如何以固定的时间间隔创建激光对象的副本?激光是来自激光束的轨迹。我希望来自激光束的轨迹不是单个激光对象,而是经典游戏蛇的set.Like?

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);
}
}
EN

回答 2

Stack Overflow用户

发布于 2020-05-05 00:14:41

您的类不应该在构造函数中使用Stage。如果你真的使用它做任何事情,它会产生双向耦合和脆弱的代码。

你绝对不应该从Actor内部加载纹理,特别是其他Actor使用的纹理。纹理是在从一个切换到另一个时占用大量内存和CPU的资源。当每个执行元加载其自己的纹理副本时,您将在绘制过程中浪费内存、加载时间和CPU周期。如果不处理它们,也会泄漏大量内存。您应该为整个游戏加载纹理的单个副本,并将对纹理的引用传递给Actor的构造函数。

没有复制对象的快捷方式。必须创建静态方法或构造函数,以便手动将每个属性的值复制到新实例中。如果相关,还必须复制内部引用的类。

因此,激光的复制方法如下所示,但您需要复制它使用的每个相关参数:

代码语言:javascript
运行
复制
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;
}

如果使用do this with constructors,您可以利用层次结构来简化复制子类的工作。例如:

代码语言:javascript
运行
复制
// 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字段正在遮蔽Actor已有的颜色字段。

票数 0
EN

Stack Overflow用户

发布于 2020-05-04 22:25:51

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61593310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档