Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用for loop在地面上绘制块_Java_Loops_Slick2d_Side Scroller - Fatal编程技术网

Java 使用for loop在地面上绘制块

Java 使用for loop在地面上绘制块,java,loops,slick2d,side-scroller,Java,Loops,Slick2d,Side Scroller,我正在使用slick2d制作一个马里奥类型的克隆游戏。我们有50x50的图像,我们正在使用的块,这将是在地板上。每当我将这段代码放入for循环时,我都可以看到正在绘制的块,并一直重新绘制到指定区域的末尾,而不是每50个像素绘制一个块 package edu.bsu.cs222.finalProject.states; public class GameState extends BasicGameState { int stateID = 1; Image background; Ima

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

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);
至于第二部分,块体未固定。它在原地不动。每次你把它叫做:

g.drawImage(block, 600, 400);
将块放置在屏幕上的同一位置。所以从技术上讲,你的街区不会移动

如果你想做的是像马里奥一样,你的角色向前移动,所有的东西都向后移动,以模仿在关卡中移动的样子,那么你需要更新所有东西的位置

如果你向前移动了一定量,将物体的位置设置为-50px或者类似的东西。如果向后移动,请将对象的位置设置为向前+50px


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

你能发布更多的代码吗?另外,在一个名字中大写单词也是一个很好的做法;e、 g.
imagePositionX
而不是
imagePositionX
。您的图像是否有轮廓?可能是它在画方框,但你看不见。为你添加了更多代码Ryan这是我正在学习的全部课程with@Crazy它是一个填充的50x50砖块图像是的,它在屏幕的左侧绘制块,当循环执行时,你可以看到它从左到右闪烁,但只保留循环中的最终块坐标。然后你就可以了需要为循环的每个实例创建一个新块,并且您应该获得一行块。不确定如何完成,认为它可以使用循环中的代码完成,但它只是在屏幕上移动它,而不是绘制新块。由于块引用的是单个变量对象,因此它会重新绘制当前块。使名为block的变量与您的一样。然后循环的每个实例创建一个新实例,block=new Image();如果这不起作用,尝试为游戏对象创建一个类,它们显然有一个图像和一个位置。以这种方式为每个实例创建一个新块。