2014-04-18 184 views
1

你好,我的滾動遊戲有問題。滾動播放器滾動速度太快時。我認爲問題不在計算座標顯示播放器。Java滾動遊戲問題

下面是代碼:

Main.class

import java.applet.Applet; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 


public class Main extends Applet implements Runnable, KeyListener 
{ 
    Applet app; 

    public static final int gameX = 660; 
    public static final int gameY = 660; 

    Thread thread; 

    int map[][] = new int[29][52]; 

    boolean moveU = false; 
    boolean moveD = false; 
    boolean moveR = false; 
    boolean moveL = false; 

    loadImage loadImg = new loadImage(); 

    Player player; 

    Graphics bgGrap; 
    Image bgimage; 

    public void init(){ 
     app = this; 
     setSize(gameX, gameY); 
     requestFocus(); 
     addKeyListener(this); 

     loadMap(); 

     player = new Player(200,200); 

     bgimage = createImage(gameX, gameY); 
     bgGrap = bgimage.getGraphics(); 
    } 
    public void update(Graphics g) 
    { 
     bgGrap.clearRect(0, 0, gameX, gameY); 
     paint(bgGrap); 
     g.drawImage(bgimage, 0, 0, app); 
    } 
    public void paint(Graphics g){ 
     drawHugeWorld(g); 
     g.drawImage(loadImg.getImg("tree.PNG"), player.getX(), player.getY(), null); //here I draw the player. 
    } 
    public void start() { 
     if(thread == null) 
     { 
     thread = new Thread(this); 
     thread.start(); 
     } 
    } 
    public void stop() { 
     if(thread != null) 
     { 
     thread = null; 
     } 
    } 
    public void destroy(){ 
     thread = null; 
    } 
    public void drawHugeWorld(Graphics g){ 

     int cameraX = player.getX() - (gameX/2); 
     int cameraY = player.getY() - (gameY/2); 

     int tileX = cameraX/32; 
     int tileY = cameraY/32; 

     if(tileX % 32 != 0) { 
       tileX--; 
     } 
     if(tileY % 32 != 0) { 
       tileY--; 
     } 
     for (int y = tileY; y < cameraY + gameY; y+=32) 
     { 
      for (int x = tileX; x < cameraX + gameX; x+=32) 
      { 
       switch(map[y/32][x/32]) 
       { 
       case 0: 
        g.drawImage(loadImg.getImg("grass.png"), x - cameraX, y - cameraY, null); 
        break; 
       case 1: 
        g.drawImage(loadImg.getImg("tree.png"), x - cameraX, y - cameraY, null); 
        break; 
       } 
      } 
     } 
    } 
    public void loadMap(){ 
     int map1[][] = 
      { 
       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 
       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} 
      }; 
     for(int j=0;j<map.length;j++) 
     { 
      for(int i=0;i<map[0].length;i++) 
      { 
      map[j][i] = map1[j][i]; 
      } 
     } 
    } 
    public void run() { 
     while(thread != null){ 
      //System.out.println("ALIVE"); 
      if(moveU){ 
       player.addY(-1); 
       repaint(); 
      } 
      if(moveD){ 
       player.addY(1); 
       repaint(); 
      } 
      if(moveR){ 
       player.addX(1); 
       repaint(); 
      } 
      if(moveL){ 
       player.addX(-1); 
       repaint(); 
      } 
      try { 
       thread.sleep(4); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    public void keyPressed(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP){ 
      moveU = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_DOWN){ 
      moveD = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT){ 
      moveR = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT){ 
      moveL = true; 
     } 
    } 
    public void keyReleased(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP){ 
      moveU = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_DOWN){ 
      moveD = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT){ 
      moveR = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT){ 
      moveL = false; 
     } 
    } 
    public void keyTyped(KeyEvent e) 
    { 
    } 
} 

而且Player.class

public class Player { 

    int x; 
    int y; 

    public Player(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 
    public void addX(int value){ 
     x += value; 
    } 
    public void addY(int value){ 
     y += value; 
    } 
    public int getX(){ 
     return x; 
    } 
    public int getY(){ 
     return y; 
    } 
} 
+0

你正在睡4毫秒。那是對的嗎? – demongolem

+0

我不知道:(如果是的話告訴我,那個睡眠是爲了平穩的運動,只是爲了這個 – Suak

+0

歡迎來到StackOverflow!這是一個很好的第一個問題,但是我不能從你的問題中知道什麼是錯誤的/被問到,你認爲你可以澄清?具體來說,你看到了什麼樣的行爲,以及你期望的是什麼? – BradleyDotNET

回答

0

我想我知道你應該改變什麼,它只是來找我。

g.drawImage(loadImg.getImg("tree.PNG"), player.getX(), player.getY(), null); //here I draw the player. 

您不應該嘗試更改播放器的x,y位置,或許您正在更換相機。例如,我試圖用硬編碼200,200代替player.getX()和player.getY(),並且我得到了合理的滾動。也許這就是你所追求的效果?

+1

感謝您的建議。我解決了這個問題:)。我只改變這個:g.drawImage(loadImg.getImg(「tree.PNG」),player.getX() - cameraX,player.getY() - cameraY,null); – Suak