Java 使用for loop在地面上绘制块
我正在使用slick2d制作一个马里奥类型的克隆游戏。我们有50x50的图像,我们正在使用的块,这将是在地板上。每当我将这段代码放入for循环时,我都可以看到正在绘制的块,并一直重新绘制到指定区域的末尾,而不是每50个像素绘制一个块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
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();如果这不起作用,尝试为游戏对象创建一个类,它们显然有一个图像和一个位置。以这种方式为每个实例创建一个新块。