1

私は格闘ゲームを作っていますが、攻撃キーをスパムして簡単に勝てないように、プレイヤーのアクションのタイミングを計りたいと思っています。

ここでキーボード操作とディレイを行います。最初は遅延しますが、遅延が時間とともにゆっくりと減少し、最終的には 0 になり、キーをスパムすることができます。ご覧のとおり、キーが遅延などに登録されないようにするために多くのことを試みました。

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (isAction == false) {
        if (key == KeyEvent.VK_LEFT) {
            dx = -1;
            if (nHeroX < -10) {
                dx = 0;
            }
            isRight = false;
            isMoving = true;
        } else if (key == KeyEvent.VK_RIGHT) {
            dx = 1;
            if (nHeroX > 1200) {
                dx = 0;
            }
            isRight = true;
            isMoving = true;
        } else if (key == KeyEvent.VK_C) {
            dx = 0;
            isAction = true;
            isMoving = false;
            isBlock = true;
            nImage = 1;
        } else if (key == KeyEvent.VK_X) {
            dx = 0;
            isAction = true;
            isMoving = false;
            isWeak = true;
            nImage = 2;
        } else if (key == KeyEvent.VK_Z) {
            dx = 0;
            isAction = true;
            isMoving = false;
            isStrong = true;
            nImage = 3;
        } else if (key == KeyEvent.VK_P) {
            if (!pause) {
                pause = true;
            } else if (pause) {
                pause = false;
            }
        }
    }
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT && !isAction) {
        dx = 0;
        isMoving = false;
        nState = nImage = 1;
    } else if (key == KeyEvent.VK_C && !isWeak && !isStrong) {
        delayTask = new DelayTask();
        tmrDelay.schedule(delayTask, 0, 500);
    } else if (key == KeyEvent.VK_X && !isBlock && !isStrong) {
        z = new DelayTask();
        tmrDelay.schedule(z, 0, 450);
    } else if (key == KeyEvent.VK_Z && !isBlock && !isWeak) {
        x = new DelayTask();
        tmrDelay.schedule(x, 0, 1200);
    }
    nImgNum = (int) (Math.random() * 6 + 1);
    nDelay = 0;
}

//http://www.javaprogrammingforums.com/java-se-api-tutorials/883-how-use-tmrDelay-java.html
class DelayTask extends TimerTask {

    public int nTimes = 0;

    @Override
    public void run() {
        nTimes++;
        if (nTimes == 2) {
            isAction = isBlock = isStrong = isWeak = false;
            nState = nImage = 1;
        }
    }
}

誰かが私の遅延が台無しになっている理由を説明できますか? ありがとうございました。

また、このコード:

private class Keys extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        hero.keyPressed(e);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        hero.keyReleased(e);
        if (hero.getPause()) {
            repaint();
        }
    }
}
4

1 に答える 1

2

これを行う最も簡単な方法は、前回のことを思い出すことです。

そう:

 private long lastTime = 0;

 void doAction() {
     long timeNow = System.currentTimeMillis()
     if (lastTime + MIN_DELAY < timeNow) {
        return;
     }
     lastTime = timeNow;

     // Do action
 }

タイマーなどのすべてのものは、必要以上に複雑なアーキテクチャからこれに近づいています。

于 2014-01-18T19:09:40.397 に答える