2014-04-18 1 views
1

안녕하세요. 스크롤 한 게임에 문제가 있습니다. 스크롤 플레이어가 스크롤하기에 너무 빠르면 나는이 문제가 플레이어 좌표를 계산하지 않는다고 생각한다. 여기 자바 스크롤 된 게임 문제

코드입니다 :

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 위치를 변경하지 마십시오. 예를 들어, player.getX() 및 player.getY() 대신에 하드 코딩 200,200을 시도하고 합리적인 스크롤링을했습니다. 어쩌면 이것이 너의 후유증 일까?

+1

제안 해 주셔서 감사합니다. 나는 문제를 해결했다 :). 나는 단지 이것을 변경한다 : g.drawImage (loadImg.getImg ("tree.PNG"), player.getX() - cameraX, player.getY() - cameraY, null); – Suak