我想在Java Applet中開發2D RPG遊戲。現在我有一個簡單的橢圓形,玩家可以使用Left,Right,Up和Down移動,並且與applet邊界的碰撞停止。問題是,我想創造一個玩家可以移動的區域的巨大世界(2000 x 2000 x)。不過,我希望他們一次只能看到600x400x的屏幕。如果他們繼續向右移動,我希望屏幕跟隨他們,同樣向上,向下和向左移動。誰能告訴我如何做到這一點?這是我的代碼到目前爲止:Java Applet遊戲2D窗口滾動
import java.awt.*;
import java.awt.event.KeyEvent;
import java.applet.Applet;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Main extends Applet implements Runnable, KeyListener
{
private Image dbImage;
private Graphics dbg;
Thread t1;
int x = 0;
int y = 0;
int prevX = x;
int prevY = y;
int radius = 40;
boolean keyReleased = false;
public void init()
{
setSize(600, 400);
}
public void start()
{
addKeyListener(this);
t1 = new Thread(this);
t1.start();
}
public void destroy()
{
}
public void stop()
{
}
public void paint(Graphics g)
{
//player
g.setColor(Color.RED);
g.fillOval(x, y, radius, radius);
}
public void update(Graphics g)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics();
// initialize buffer
if (dbImage == null)
{
}
// clear screen in background
dbg.setColor(getBackground());
dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
// draw elements in background
dbg.setColor(getForeground());
paint(dbg);
// draw image on the screen
g.drawImage(dbImage, 0, 0, this);
}
@Override
public void run()
{
while (true)
{
//x++;
repaint();
try
{
t1.sleep(17);
}
catch (Exception e)
{
}
}
}
public boolean CheckCollision(String dir)
{
if (x <= 0 && dir.equals("L"))
{
x = prevX;
return true;
}
else if (y <= 0 && dir.equals("U"))
{
y = prevY;
return true;
}
else if (x >= (getWidth() - radius) && dir.equals("R"))
{
System.out.println(getWidth());
x = prevX;
return true;
}
else if (y >= (getHeight() - radius) && dir.equals("D"))
{
y = prevY;
return true;
}
return false;
}
@Override
public void keyPressed(KeyEvent e)
{
switch (e.getKeyCode())
{
case KeyEvent.VK_RIGHT:
if (!CheckCollision("R"))
{
x += 4;
prevX = x;
}
break;
case KeyEvent.VK_LEFT:
if (!CheckCollision("L"))
{
x -= 4;
prevX = x;
}
break;
case KeyEvent.VK_UP:
if (!CheckCollision("U"))
{
y -= 4;
prevY = y;
}
break;
case KeyEvent.VK_DOWN:
if (!CheckCollision("D"))
{
y += 4;
prevY = y;
}
break;
}
}
@Override
public void keyReleased(KeyEvent arg0)
{
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0)
{
// TODO Auto-generated method stub
}
}
本質上講,你需要創建一個虛擬世界(無,嚴重),所以即使角色只能在300x200的屏幕上,他們也可以在全球1000x700。這將要求你知道世界的頂部/左邊角落開始,並允許你查找功能將其轉換爲「虛擬」座標。簡單:D – MadProgrammer
@MadProgrammer我是Java的新手,我不明白我如何創建你所說的。是否有代碼可以讓我將尺寸設置爲任何我想要的尺寸,但是讓我將尺寸設置爲像600x400一樣可見,並且隨着玩家向右,向左,向上或向下移動屏幕x或y,會發生什麼情況?換句話說,你是否知道代碼。我真的需要一些東西讓我開始。 –
很多問題涉及到如何渲染世界?它是一個大的位圖還是一系列的瓷磚? – MadProgrammer