2012-11-21 3 views
0

"그리드"를 따라 셰이프를 이동하려고합니다. 나는 마침내 물건을 알아 낸 것 같지만 약간의 문제가 있습니다. 아무리 가까이에서 각 운동 사이에 특정 시간 간격을 얻으려고해도 그리드에서 벗어나는 것처럼 보입니다. thig가 어떻게 작동하는지 이해함에 따라, 현재 사용하고있는 방법을 사용하고 싶습니다. 나는 무작위적인 움직임 "글리치"를 때때로 얻는다는 것을 안다. 왜냐하면 내가 그것을 뒤로 움직이면 어떤 것이 든 상관없이 그리드 위에 고정되어야하기 때문이다.그리드 타이밍 문제

메인 클래스 :

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 

public class WhyOhWhy { 
public int x; 
public int y; 

public static void main(String[] args) { 

    JFrame f = new JFrame(); 
    InputHandler input = new InputHandler(); 
    f.add(input); 
    f.setVisible(true); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setSize(800,600); 
    input.doStuff(); 
    } 
} 

InputHandler 등급 :

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class InputHandler extends JPanel implements ActionListener, KeyListener { 

Timer t = new Timer(5, this); 
int x = 0, y = 0, velX = 0, velY = 0; 
int i = 0, j = 0; 
TimeKeeper timeStart; 


public void doStuff(){ 
    velX = 0; 
    velY = 0; 
} 
public InputHandler() { 
    t.start(); 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 
} 


public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.fill(new Ellipse2D.Double(x, y, 32, 32)); 
    for(int i = 0;i <500;i+=32){ 
     g2.drawRect(i, j, 32, 32); 
     for(int j=0;j<500;j+=32){ 
      g2.drawRect(i, j, 32, 32); 
     } 
    } 
} 

public void actionPerformed(ActionEvent e) { 

    repaint(); 
    x += velX; 
    y += velY; 

    if(TimeKeeper.isFinished() == true){ 
     System.out.println("DONE"); 
     TimeKeeper.resetTimer(false); 
     velX = 0; 
     velY = 0; 
     setEnabled(true); 
    } 
} 

public void up() { 
    //System.out.println("Moving up"); 

    timeStart = new TimeKeeper(185); 
    velY = -1; 
    velX = 0; 
    setEnabled(false); 
} 

public void down() { 
    //System.out.println("Moving down"); 
    setEnabled(false); 
    timeStart = new TimeKeeper(185); 
    velY = 1; 
    velX = 0; 
} 

public void left() { 
    //System.out.println("Moving left"); 
    setEnabled(false); 
    timeStart = new TimeKeeper(185); 
    velY = 0; 
    velX = -1; 
} 

public void right() { 
    //System.out.println("Moving right"); 
    setEnabled(false); 
    timeStart = new TimeKeeper(185); 
    velY = 0; 
    velX = 1; 
} 

public void keyPressed(KeyEvent e) { 

    int code = e.getKeyCode(); 
    if (code == KeyEvent.VK_W) { 
     up(); 
     } 
    if (code == KeyEvent.VK_S) { 
     down(); 
     } 
    if (code == KeyEvent.VK_A) { 
     left(); 
     } 
    if (code == KeyEvent.VK_D) { 
     right(); 
     } 
    } 

public void keyTyped(KeyEvent e) { 
    } 

public void keyReleased(KeyEvent e) { 
    velX = 0; 
    velY = 0; 
    } 
} 

시계 클래스 다음 (의견의 부족과 사물 난 그냥 코드를 테스트하고 이상한 배치 죄송합니다) 내 코드입니다 :

import java.util.Timer; 
import java.util.TimerTask; 

public class TimeKeeper { 

Timer timer; 
public static boolean isDone = false; 

public TimeKeeper(int seconds) { 

    timer = new Timer(); 
    isDone = false; 
    timer.schedule(new RemindTask(), seconds); 
} 

class RemindTask extends TimerTask { 

    public void run() { 
     //System.out.println("Time's up!"); 
     isDone = true; 
     timer.cancel(); //Terminate the timer thread 
    } 
} 

public static boolean isFinished() { 
    return isDone; 
} 

public static void resetTimer(boolean done) { 
    isDone = done; 
} 
} 

고마워요!

답변

0

신경 쓰지 마라. 알아 냈어. % 연산자를 사용하여 모양이 이동 한 숫자가 각 단계마다 x 및 y 방향으로 나눌 수 있는지 확인해야했습니다.