2015-02-01 4 views
0

이것은 논리 문제이므로 불행히도 내가 잘못하고있는 것에 대해서는 실제로 찾을 수 없었습니다. 거의 하루 동안 저는 centerX와 centerY 변수가 CoreProcesses 파일의 플레이어 개체에 대해 올바르게 업데이트되지 않는 이유를 알아 내려고 노력했습니다. 적절한 버튼을 누를 때마다 적절한 금액만큼 증가 또는 감소한다고 가정되지만, 어떤 이유로 든 내가 시도한 것과 상관없이 동일하게 유지됩니다. 나는 완전한 손실에 여기있다. 나는 단지 올바른 방향으로 지적 할 필요가 있으며, 모든 사람들에게 미리 감사드립니다. 아래는 파일변수가 제대로 업데이트되지 않음

Player.java

package gameloopconcepts; 

public class Player { 

    /** 
    * Constants 
    */ 
    final int MOVESPEED = 20; 

    /** 
    * Class wide variables 
    */ 

    // Player Draw Coordinates 
    private int centerX = 90; 
    private int centerY = 390; 

    // Handles updating draw coordinates 
    private int speedX = 0; 
    private int speedY = 0; 

    /** 
    * Update method for game loop 
    */ 

    public void update(){ 
     // Updates draw coordinates 
     centerX += speedX; 

    } 

    /** 
    * Movement Methods 
    */ 

    public void moveUp(){ 
     speedY = -MOVESPEED; 
    } 

    public void moveDown(){ 
     speedY = MOVESPEED; 
    } 

    public void moveRight(){ 
     speedX = 20; 
    } 

    public void moveLeft(){ 
     speedX = -20; 
    } 

    public void stop(){ 
     speedX = 0; 
    } 

    /** 
    * Getters and setters for variabes 
    */ 

    public int getCenterX(){ 
     return centerX; 
    } 

    public int getCenterY(){ 
     return centerY; 
    } 

    public void setCenterX(int centerX){ 
     this.centerX = centerX; 
    } 

    public void setCenterY(int centerY){ 
     this.centerY = centerY; 
    } 

} 

CoreProcesses.java

package gameloopconcepts; 

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.net.URL; 

public class CoreProcesses extends Applet implements Runnable, KeyListener { 

    // Constants 

    // Class wide variables 
    private Player player; 
    private Image image, character; 
    private Graphics second; 
    private URL docBase; 

    /** 
    * Initializes the applet 
    */ 
    @Override 
    public void init() { 
     // TODO Auto-generated method stub 
     super.init(); 
     // Sets window size 
     setSize(480, 800); 

     // Sets window background color 
     setBackground(Color.WHITE); 

     // Sets the window to focus at the start 
     setFocusable(true); 

     // Sets the key listener 
     addKeyListener(this); 

     // Sets the applet frame and the title 
     Frame frame = (Frame) this.getParent().getParent(); 
     frame.setTitle("ORIGIN ALPHA"); 

     // Gets document base 
     try{ 
      docBase = getDocumentBase(); 
     } catch (Exception e){ 

     } 

     // Sets up images 
     character = getImage(docBase, "/Users/StudioAccount/Documents/Development/Workspaces/IntelliJ Idea/Test/src/assets/player.png"); 

    } 

    /** 
    * Starts the applet and assigns any necessary game objects 
    */ 
    @Override 
    public void start() { 
     // TODO Auto-generated method stub 
     super.start(); 
     player = new Player(); 

     // Defines the main thread and starts it 
     Thread mainThread = new Thread(); 
     mainThread.start(); 
    } 

    @Override 
    public void stop() { 
     // TODO Auto-generated method stub 
     super.stop(); 
    } 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 
     super.destroy(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     // Main Loop 
     while(true){ 
      player.update(); 
      repaint(); 
      try{ 
       Thread.sleep(17); 
      } catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 

    } 

    @Override 
    public void update(Graphics g){ 
     if(image == null){ 
      image = createImage(this.getWidth(), this.getHeight()); 
      second = image.getGraphics(); 
     } 

     second.setColor(getBackground()); 
     second.fillRect(0, 0, getWidth(), getHeight()); 
     second.setColor(getForeground()); 
     paint(second); 

     g.drawImage(image, 0, 0, this); 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawImage(character, player.getCenterX(), player.getCenterY(), this); 
    } 

    /** 
    * Key Listener events 
    */ 
    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 

     // Test logs for key events 
     switch (e.getKeyCode()) { 
      case KeyEvent.VK_W: 
       player.moveUp(); 
       System.out.println(player.getCenterY()); 
       break; 
      case KeyEvent.VK_S: 
       player.moveDown(); 
       System.out.println(player.getCenterY()); 
       break; 
      case KeyEvent.VK_A: 
       player.moveLeft(); 
       System.out.println(player.getCenterX()); 
       break; 
      case KeyEvent.VK_D: 
       player.moveRight(); 
       System.out.println(player.getCenterX()); 
       break; 
     } 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 

     // Test logs for key events 
     switch (e.getKeyCode()) { 
      case KeyEvent.VK_W: 
       System.out.println("Stop moving character up"); 
       break; 
      case KeyEvent.VK_S: 
       System.out.println("Stop moving character down"); 
       break; 
      case KeyEvent.VK_A: 
       player.stop(); 
       System.out.println("Stop moving character left"); 
       break; 
      case KeyEvent.VK_D: 
       player.stop(); 
       System.out.println("Stop moving character right"); 
       break; 
     } 

    } 

} 

centerX 및 centerY 올라가고 또는 아래로 (20)에 의해 해당 버튼을 누름에 있어야합니다.

+0

'speedX'와'centerX'는 같은 것이 아닙니다. – Makoto

+0

@Makoto moveRight가 호출되면 speedX에 20을 더한 다음 updateXXX에 centerX에 speedX를 추가하고 키 릴리스 stop()을 호출하여 speedX를 0으로 재설정하고 업데이트의 무한 이동을 방지합니다 루프 – Saphiric

답변

1

Thread 생성시 Runnable 개체를 지정하지 않았기 때문에 CoreProcessesrun 메서드가 실행되지 않는 것이 문제입니다.

그래서, 대신

Thread mainThread = new Thread(); 

당신은 또한

Thread mainThread = new Thread(this); 

, 당신은 당신이 한 번 키를 누르면, 당신은 X 위치의 거대한 증가를 볼 것이다, 그것을 가지고 방법이 있어야합니다 왜냐하면이 메서드는 실제로 여러 번 실행되기 때문입니다.

keyPressed 이벤트에서 플레이어가 바로 update입니다.

@Override 
public void keyPressed(KeyEvent e) { 

    switch (e.getKeyCode()) { 
     case KeyEvent.VK_W: 
      player.moveUp(); 
      System.out.println(player.getCenterY()); 
      break; 
     case KeyEvent.VK_S: 
      player.moveDown(); 
      System.out.println(player.getCenterY()); 
      break; 
     case KeyEvent.VK_A: 
      player.moveLeft(); 
      System.out.println(player.getCenterX()); 
      break; 
     case KeyEvent.VK_D: 
      player.moveRight(); 
      System.out.println(player.getCenterX()); 
      break; 
    } 

    player.update(); 
} 
+0

매력처럼 작동합니다. 나는 너를 고맙게 여기는 것을 결코 생각하지 않았다조차. – Saphiric

관련 문제