目前我在我的程序中是双缓冲的(尽管你应该知道),我有一个存储BufferedImages和整数的数组列表。目前,我在屏幕上移动整个arraylist的代码是:
public static void MoveMap(final double ammount){
Thread t = new Thread(){
public void run(){
for(int i = 0; i < TileHelper.MAIN_LIST.size();i++){
TileHelper.MAIN_LIST.get(i).changeX(ammount*DATA.speed);
}
}
};
t.start();
}
这就完成了工作,但看起来并不顺利。即使我使用像.25这样的数字来表示变量数量。(我只是注意到我在代码中拼写错误:O)如果我的所有图像都在这个数组中,我如何才能做出平滑的移动呢?顺便说一句,如果你想知道这个不流畅的地方,这是一个事实,这是滞后的,在每个图像之间你会看到一个很大的空白。任何帮助都会被感谢。谢谢!
渲染代码:
public class Main extends JFrame {
public static int worldsize = 1080;
private static final long serialVersionUID = 6149918602875295087L;
public static void main(String args[]){
new Main();
}
TileHelper tiles = new TileHelper(TileHelper.MAIN_LIST);
public Main(){
DATA_IMAGES.initImages();
addDefaultBlocks();
setSize(640,480);
setResizable(false);
setTitle("Stranded");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
createBufferStrategy(2);
GameLoop();
addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
Movement.MoveMap(3.25);
break;
case KeyEvent.VK_RIGHT:
Movement.MoveMap(-3.25);
break;
case KeyEvent.VK_UP:
DATA.speed++;
break;
case KeyEvent.VK_DOWN:
DATA.speed--;
break;
case KeyEvent.VK_SPACE:
System.out.println(DATA.speed);
break;
}
}
});
}
private void addDefaultBlocks() {
for(int x = -1000/32; x < worldsize/32; x++){
for (int y = -1000/32; y < worldsize/32; y++){
TileHelper.addBlock(DATA_IMAGES.GRASS, x*32, y*32);
}
}
}
public void GameLoop(){
Thread gameloop = new Thread(){
public void run(){
while(true){
RenderInit();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
gameloop.start();
}
public void RenderInit(){
BufferStrategy buff = getBufferStrategy();
Graphics g = buff.getDrawGraphics();
g.clearRect(0, 0, getWidth(), getHeight());
Render(g);
g.dispose();
buff.show();
Toolkit.getDefaultToolkit().sync();
}
public void Render(Graphics g){
tiles.RenderAll(g);
}
}
发布于 2012-08-06 06:50:19
我假设你正在尝试制作一个sidescroller游戏,而我的工作方式是将游戏中的所有物体都变成精灵。
我创建了一个Sprite类,其中包含,x,y,xvelocity,yvelocity属性以及getter和setter。当我想要滚动时,我要么临时将速度设置为相反的方向,要么移动x值。
另一种方法是保留每个子画面中存储的原始x和y值,当绘制到屏幕时,我有一个名为"offSetX“的变量,该变量被精灵的原始位置相加或相减,以在屏幕上的所有精灵之间进行统一的移动。
如果这不是你要找的,我会删除它。:)
注意:我最近修改了我的旧的sidescroller游戏引擎,发现最后一个方法是最好的,而不是修改精灵列表上的所有x位置。我的offSetX变量是一个浮点值,当绘制到屏幕时,我使用Math.round(sprite.getX() + offSetX)来获得最精确的位置。
https://stackoverflow.com/questions/11820697
复制相似问题