Java侧滚游戏

Java侧滚游戏,java,scroll,Java,Scroll,我正在制作自己版本的马里奥。我遇到的一个问题是如何做游戏的侧滚部分。但是我不太知道如何将imageableX和imageableY实现到世界显示器中。 任何帮助都将不胜感激!以下是我到目前为止的情况: public class World extends JPanel implements Runnable, KeyListener{ private static final int BEGINNING_X = 0, ENDING_X = 10000; private static final

我正在制作自己版本的马里奥。我遇到的一个问题是如何做游戏的侧滚部分。但是我不太知道如何将imageableX和imageableY实现到世界显示器中。 任何帮助都将不胜感激!以下是我到目前为止的情况:

public class World extends JPanel implements Runnable, KeyListener{

private static final int BEGINNING_X = 0, ENDING_X = 10000;
private static final int TOP_Y = 0, BOTTOM_Y = 5000;
private boolean inGame = false;

private Player player;
//set up a new world with a player
public World(Player player){
    inGame = true;
    this.player = player;
}

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    //the world size
    g.drawRect(0, 0, BEGINNING_X, ENDING_X);
}

//check to see if the new x postition is valid on the game board
public boolean isValidXPosition(double x){
    if(x < BEGINNING_X || x > ENDING_X){
        return false;
    }
    return true;                
}

public double imageableStartX(Player player){
    if(player.returnX() - 100 <= BEGINNING_X)
        return BEGINNING_X;
    else
        return player.returnX() - 100;
}

public double imageableTopY(Player player){
    if(player.returnY()-100 <= BOTTOM_Y)
        return BOTTOM_Y;
    else
        return BOTTOM_Y - 100;
}

public double imageableEndX(Player player){
    if(player.returnX() + 200 <= ENDING_X)
        return ENDING_X;
    else
        return player.getX() + 200;
}

public double imageableBottomY(Player player){
    if(player.returnY()+100 >= BOTTOM_Y)
        return BOTTOM_Y;
    else
        return BOTTOM_Y + 100;
}

public void run() {
    while(inGame){
        //TODO run game code
    }
}

public void keyTyped(KeyEvent e) {}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){
        player.moveRight();
    }
    if(e.getKeyCode() == KeyEvent.VK_LEFT){
        player.moveLeft();
    }
    if(e.getKeyCode() == KeyEvent.VK_SPACE){
        player.setSprint(true);
    }
    if(e.getKeyCode() == KeyEvent.VK_UP){
        player.Jump();
    }


}

public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_UP){
        player.Descend();
        player.setFalling(true);
    }
    if(e.getKeyCode() == KeyEvent.VK_SPACE){
        player.setSprint(false);
    }
}
}
public-class-World-extends-JPanel实现了可运行的KeyListener{
私有静态最终整数起始值为0,结束值为10000;
私有静态最终int TOP_Y=0,BOTTOM_Y=5000;
私有布尔inGame=false;
私人玩家;
//用一个玩家建立一个新世界
公共世界(玩家){
inGame=true;
this.player=player;
}
@凌驾
公共组件(图形g){
超级组件(g);
//世界大小
g、 drawRect(0,0,开始,结束);
}
//检查新的x位置在游戏板上是否有效
公共布尔值isValidXPosition(双x){
如果(x<开始| x | x>结束|x){
返回false;
}
返回true;
}
公共双映像StartX(播放器){

如果(player.returnX()-100,您可能会发现在paintComponent()方法中实现X和Y位置定义更容易,而不是将过程抽象为其他方法并每次传递一个播放器对象。请尝试在paintComponent()中为视口尺寸(视口宽度、视口高度等)定义常量方法,将这些坐标与玩家的坐标一起参考,以在屏幕上定位角色。同时确保使用相对坐标:

// center the screen on the player, though you can modify it to do otherwise
int viewportX = player.returnX() - VIEWPORT_WIDTH/2;
int viewportY = player.returnY() - VIEWPORT_HEIGHT/2;

g.setColor(Color.WHITE);
g.fillRect(viewportX, viewportY, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
如果希望视口始终保持在世界中,即使角色移动到屏幕边缘,也可以正常执行所有位置计算,但在实际绘制任何内容之前进行一些检查,以便在视口位置发生偏离屏幕时对其进行更改


好运。

你可能会考虑使用2D瓦片引擎来处理绘图。抱歉,这听起来有点愚蠢,但我以前从未使用过瓦片引擎,你能简单地解释一下它们做什么以及如何制作吗?