0

「グリッド」に沿って形状を移動することに取り組んでいます。ようやく理解できたようですが、少し問題があります。各動きの間に特定の時間間隔をどれだけ近づけようとしても、まだグリッドから外れているようです。この方法でどのように機能しているかを理解しているので、現在使用している方法を使用したいと思います。ランダムな動きの「グリッチ」が時々発生することはわかっています。これは、前後に移動すると、何があってもグリッドにロックされる必要があるためです。これが私のコードです(コメントの欠如と、コードをテストしているだけの奇妙な配置で申し訳ありません):

メインクラス:

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;
    }
}

TimeKeeper クラス:

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;
}
}

ありがとうございました!

4

1 に答える 1

0

気にしないで、それを理解しました。%演算子を使用して、図形が移動した数がx方向とy方向の両方で各ステップで32で割り切れるかどうかを確認する必要がありました。

于 2012-11-22T02:05:31.003 に答える