【问题标题】:Java - Slick2D - Dynamically Creating ObjectsJava - Slick2D - 动态创建对象
【发布时间】:2013-05-31 19:35:36
【问题描述】:

好的,我知道可以在渲染语句中渲染图像。不过,我确实有一个问题。有没有一种方法可以动态创建对象(例如平面类)并通过称为纹理的字符串创建和渲染图像?例如,如果我有一个名为 Bullet 的类,我如何在运行时动态创建 Image

Bullet myBullet = new Bullet();

?非常感谢您的帮助。

例子:

class Bullet
{
    public float x, y = 0;
    public float rotation = 0;
    public void bullet(posX, posY)
    {
         x = posX;
         y = posY;
    }

另外,我怎样才能让它自动循环一个方法(我已经在主类中运行了一个循环,但是如何将它附加到块中?)?

public void update() {
    x += 2 * Math.cos((Math.PI / 180) * rotation);
    y += 2 * Math.sin((Math.PI / 180) * rotation);
}
}

谢谢,

编辑:通过创建图像,我的意思是也渲染它。

或者,对于我正在开发的一款行为有点像 Frogger 的游戏,当我声明它并将它的更新语句添加到 BasicGame 文件中的 update() 循环中时,如何使这个类的 Image 称为纹理渲染? 包杂项;

import mobile.MobileOctopus;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

public class Current {
    public Image texture;
    public float x, y = 0;
    MobileOctopus player;
    public Current(int posY, MobileOctopus character) throws SlickException
    {
        texture = new Image("res/current.png");
        x = 0;
        y = posY;
        player = character;
    }
public void update()
{
    x -= 3;
    if(x < -380)
    {
        x = 0;
    }
    if(player.y + 32 > y && player.y + 32 < y + 32)
    {
        player.x -= 3;
    }
}
}

当玩家在里面时,Current 类将玩家向左移动。但是,我怎么能通过调用来做到上面所说的

Current myCurrent = new Current(100, player);

【问题讨论】:

    标签: java graphics lwjgl slick2d spawning


    【解决方案1】:

    在我看来,当您加载 Bullet 对象时,将图像加载到构造函数中并将其保存在变量中。也就是说,如果文件不是太大而无法保存在内存中。

    public Bullet(){
        //Load image here
    }
    

    据我所知,更新方法是循环调用的。假设您的问题在子弹类中,只需执行以下操作:

    @Override
    public void update(GameContainer gc, int delta) throws SlickException {
        bullet.update()
    }
    

    如果您在更新方法中调用循环,那么它只会在游戏的任何内容可以执行、更新或应用之前循环子弹。您要确保整个游戏能够公平更新。

    编辑 1

    我现在明白你的意思了。为了渲染对象的图像,这就是我所做的。我不知道这是否是最好的方法,但我就是这样做的。

    首先我应该给对象添加一个绘制方法;确保添加 Slick 的图形实现。

    public void paint(Graphics g){
        g.drawImage(image, X, Y);
    }
    

    在渲染方法中,您可以调用对象并对其进行绘制。

    public void render(GameContainer gc, Graphics g){
        bullet.paint(g);
    }
    

    这将允许您将对象渲染到屏幕上。现在请记住,当您需要在屏幕上绘制多个东西时,您需要将它们按顺序排列,否则它们会重叠。

    【讨论】:

    • 是的,但是,如何让它自动渲染?如果是在update语句中,需要加上bullet.update();当我编程时。此外,您只能在 render() 方法中进行渲染。我怎样才能做到这一点,只需声明这将呈现它并将 bullet.update() 添加到更新语句中?也许是一个数组?
    • 好的,但是我要怎么做才能不用在渲染语句中添加 bullet.paint() 呢?我应该使用图像数组吗?
    • @user2441712 您可以将要渲染的图像设置为数组,然后循环遍历它们。但是,您必须获取对象所在位置的 X 和 Y 位置。这就是为什么我建议在课堂上加入一个绘画方法。您只需要调用对象并让该对象发挥作用。
    • 好的,但是不能只在render语句中渲染吗? 编辑: 好的,所以经过测试,这行得通。但是,如果我想在同一个数组中渲染子弹和箭头(例如)怎么办?如果我转换它,对象数组可能会有所帮助。
    • @user2441712 一个对象数组将保存对象,但您必须找出对象是什么实例,然后将它们转换并渲染它们。在我看来,它更像是一项任务。现在,如果它们共享一个公共类,您可以将其转换为超类,并以这种方式呈现。
    【解决方案2】:

    当您制作游戏时,Slick2D 会自动调用您游戏的更新方法和渲染方法。您所要做的就是让游戏的更新/渲染调用对象的更新/渲染。

    这是一个例子:

    import org.newdawn.slick.*;
    
    public class ExampleGame extends BasicGame {
        public static void main(String[] args) throws SlickException {
            //creates and starts the game
            AppGameContainer g = new AppGameContainer(new ExampleGame("Title"));
            g.start();
        }
        public ExampleGame(String title) {
            super(title);
        }
    
        public void render(GameContainer container, Graphics g)
                throws SlickException {
            // This code automatically runs on a loop
            System.out.println("render");
        }
    
        public void init(GameContainer container) throws SlickException {
            // This code runs once
            System.out.println("init");
        }
    
        public void update(GameContainer container, int delta)
                throws SlickException {
            // This code automatically runs on a loop:
            System.out.println("update");
    
        }
    
    }*
    

    这是输出到日志的内容:

    init
    render
    update
    render
    update
    render
    render
    render
    update
    render
    ...
    

    如您所见,示例代码没有循环调用渲染或更新。 Slick2D 内置了循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多