0

プログラムにキーリスナーがあり、ほとんどのキーについて、ユーザーがキーを押したままにできるようにしたいと考えています。ただし、スクリーンショットのキーは、ユーザーがキーを押したままにできるようにしたいのですが、スクリーンショットは1つしかありませんか?

package me.bevilacqua.game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class InputHandler implements KeyListener{

    private boolean[] keys = new boolean[120];
    public boolean up , down , left , right , screen_shot;

    public void tick() {
        up =  keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];    //Will be Jump
        down =  keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];  //Will not be down but maybe slide or better yet action key or maybe shoot
        left =  keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
        right =  keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];    
        screen_shot = keys[KeyEvent.VK_F5] || keys[KeyEvent.VK_BACK_SLASH];
    }

    public void keyPressed(KeyEvent e) {
        keys[e.getKeyCode()] = true;
    }

    public void keyReleased(KeyEvent e) {
        keys[e.getKeyCode()] = false;
    }

    public void keyTyped(KeyEvent e) {  
    }
}

編集:

これが機能しない理由:

package me.bevilacqua.game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;


public class InputHandler implements KeyListener{
private boolean[] keys = new boolean[120];
public long current , last = -1;
public boolean up , down , left , right , screen_shot;
public boolean shotFlag = true; //True if allowed

public void tick() {
    up =  keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];    //Will be Jump
    down =  keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];  //Will not be down but maybe slide or better yet action key or maybe shoot
    left =  keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
    right =  keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];    
    screen_shot = keys[KeyEvent.VK_F5];
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() != KeyEvent.VK_F5) keys[e.getKeyCode()] = true;
    else if (e.getKeyCode() == KeyEvent.VK_F5 && shotFlag) {
        keys[e.getKeyCode()] = true;
        shotFlag = false;
    }


}

public void keyReleased(KeyEvent e) {
    keys[e.getKeyCode()] = false;
    if(e.getKeyCode() == KeyEvent.VK_F5) shotFlag = true;
}

public void keyTyped(KeyEvent e) {  
}

}

4

2 に答える 2

0

次のように試すことができます。

public boolean up = false;
public boolean down = false;
public boolean left = false;
public boolean right = false;    
public boolean screen_shot = false;

//...

f.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_D)
                {
                    right = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_A)
                {
                    left = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_S)
                {
                    down = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_W)
                {
                    up = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_F5)
                {
                    screen_shot = true;
                }
            }
            public void keyReleased(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_D)
                {
                    right = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_A)
                {
                    left = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_S)
                {
                    down = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_W)
                {
                    up = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_F5)
                {
                    screen_shot = false;
                }
            }
//...

@Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.white);
        g.drawImage(character, characterLocation.x, characterLocation.y, this);

        if (right)
        {
            characterLocation.x += 1;
        }
        if (left)
        {
            characterLocation.x -= 1;
        }
        if (down)
        {
            characterLocation.y += 1;
        }
        if (up)
        {
            characterLocation.y -= 1;
        }
        if (screen_shot)
        {
            BufferedImage shot = character.createScreenCapture(new Rectangle(100,100));
        }
        repaint();
    }   
}

上記のスクリーン ショットの "if" ステートメントを変更する必要があるため、正常に機能しない可能性があります。

于 2014-10-14T10:17:52.420 に答える
0

私が理解していることから、適切なキーを押したままにすると、すべてのキーに関連付けられたアクションが繰り返され、対応するキーを押したままにしても、それらのアクションのいずれかが繰り返されないようにする必要があります。keyPressed()が呼び出されたときに設定される追加のフラグでこれを解決できると思います。次に、このフラグが設定されている場合にのみscreen_shot設定され、フラグは呼び出されるたびに設定解除されます (もちろん、その値を読み取った後)。または、フラグが設定されていて、フラグを設定している場合にのみ、フラグを設定解除できます。どちらでも大差ないと思います。tick()tick()screen_shot

于 2013-01-13T23:05:45.887 に答える