java - 使用for循环在地面上绘制方 block

标签 java loops slick2d side-scroller

我正在使用 slick2d 制作一个马里奥类型的克隆游戏。我们有 50x50 的图像,用作地板上的 block 。每当我将此代码放入 for 循环中时,我都可以看到正在绘制并重新绘制的 block 一直到指定区域的末尾,而不是每 50 个像素绘制一个 block 。

package edu.bsu.cs222.finalProject.states;



public class GameState extends BasicGameState {

int stateID = 1;
Image background;
Image block;
float x = 0;
float y = -370;
float Dx = x + 200;
float Dy = y + 810;
private float verticalSpeed = 0.0f;
private float horizontalSpeed = 1.8f;
private float imagepositionx=0;
private float imagepositiony=500;
boolean jumping = false;
Animation cowboy, movingLeft, movingRight, movingUp, stoppedLeft,
        stoppedRight;
int[] animationDuration = { 200, 200 };

public GameState(int stateID) {
    this.stateID = stateID;
}

@Override
public void init(GameContainer gc, StateBasedGame sbg)
        throws SlickException {
    background = new Image("res/ui/background.png");
    block = new Image("res/obj/block.png");
    Image[] walkLeft = { new Image("res/char/cowboyleft1.png"),
            new Image("res/char/cowboyleft2.png") };
    Image[] walkRight = { new Image("res/char/cowboyright1.png"),
            new Image("res/char/cowboyright2.png") };
    Image[] stopLeft = { new Image("res/char/cowboyleft1.png"),
            new Image("res/char/cowboyleft2.png") };
    Image[] stopRight = { new Image("res/char/cowboyright1.png"),
            new Image("res/char/cowboyright2.png") };
    movingLeft = new Animation(walkLeft, animationDuration, true);
    movingRight = new Animation(walkRight, animationDuration, true);
    stoppedLeft = new Animation(stopLeft, animationDuration, false);
    stoppedRight = new Animation(stopRight, animationDuration, false);
    cowboy = stoppedRight;
}

@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
        throws SlickException {
    background.draw(x, y);
    g.drawString("Cowboy's X:" + x + "\nCowboy's Y: " + y, 400, 20);
    cowboy.draw(Dx, Dy);


        if(imagepositionx <3000)
        {
            g.drawImage(block, imagepositionx, imagepositiony);
            imagepositionx += 50;
        }



            //pillar1
    block.draw(600, 450);
    block.draw(600, 400);
    g.drawImage(block, 600, 400);
    g.drawImage(block, 600, 350);
    //3 in air
    g.drawImage(block, 800, 250);
    g.drawImage(block, 850, 250);
    g.drawImage(block, 900, 250);
    //pillar2
    g.drawImage(block, 1100, 450);
    g.drawImage(block, 1100, 400);
    g.drawImage(block, 1100, 350);

}

@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta)
        throws SlickException {
    Input input = gc.getInput();
    if (input.isKeyDown(Input.KEY_LEFT)) {
        cowboy = movingLeft;
        x += horizontalSpeed;
        if (x > 0) {
            x -= delta * horizontalSpeed;
        }
    }

    if (input.isKeyDown(Input.KEY_RIGHT)) {
        cowboy = movingRight;
        x -= horizontalSpeed;
        if (x < -2975.0) {
            x += delta * horizontalSpeed;
        }
    }

    if (input.isKeyDown(Input.KEY_UP) && !jumping) {
        verticalSpeed = -3.0f;
        jumping = true;
    }

    if (jumping) {
        verticalSpeed += .03f * delta;
    }

    if (Dy > 470) {
        jumping = false;
        verticalSpeed = 0;
        Dy = 470;
    }
    Dy += verticalSpeed;
}

@Override
public int getID() {
    return stateID;
}

}

使用此代码时也遇到问题,它们会在屏幕上移动,而不是停留在固定位置。

g.drawImage(block, 600, 400);

最佳答案

如果我理解正确的话,你的意思是正在绘制同一个 block ,然后就像它被删除并在新位置重新绘制一样?在循环结束之前您只看到一个 block ?

如果是这种情况,您需要为每个位置创建一个新 block 。

至于第二部分,方 block 没有停留在原位。它停留在原地。每次您调用此命令时都会发生以下情况:

g.drawImage(block, 600, 400);

您的 block 被放置在屏幕上的同一位置。所以从技术上来说你的方 block 并没有移动。

如果您想要做的事情就像马里奥一样,您的角色向前移动,而所有东西都向后移动,以模拟穿越关卡的外观,那么您需要更新所有东西的位置。

如果向前移动一定量,则将对象的位置向后设置 -50px 或类似的值。如果向后移动,请将对象的位置向前设置 +50px。

我希望我说得有道理,解释起来有点奇怪。

关于java - 使用for循环在地面上绘制方 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20223279/

相关文章:

java - 是否可以在 Java 中实现/覆盖 + 和++?

json - 在 json 数组上迭代 Mediator

java - 光滑2d | TextField 字符传递

swift - 如何停止循环 swift 3

javascript - 在 JavaScript 中使用 for 循环打印网格

java - 我无法用 slick2D Java 解决这个问题

Java-Slick2D/lwjgl 获取鼠标位置

java - 在 OSGi 项目中使用 SqLite JDBC Jar

java - 安卓。如何使对话框按钮出现在对话框之外

java - 在 GWT 中使用 javax.validation 会引发运行时错误 ClassNotFoundException