1

x 軸 (xSpeed) 座標に影響を与える左右の矢印と y 軸 (ySpeed) に影響を与える上下の矢印を使用して、Java KeyListener を移動オブジェクトに組み込んでいます。何らかの理由で、オブジェクトと KeyListener を接続できません。お願い助けて?ありがとう!

    import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class Action
{
    private static final int GRAVITY = 1;
    private int ballDegradation = 8;
    private Ellipse2D.Double circle;
    private Color color;
    private int diameter;
    private int xPosition;
    private int yPosition;
    private final int groundPosition; 
    private final int topPosition;
    private final int leftSidePosition;
    private final int rightSidePosition;
    private Canvas canvas;
    private int ySpeed = -1;  
    private int xSpeed = 8;
    public Action(int xPos, int yPos, int ballDiameter, Color ballColor,
    int groundPos, int topPos, int leftSidePos, int rightSidePos, Canvas drawingCanvas)
    {
        xPosition = xPos;
        yPosition = yPos;
        color = ballColor;
        diameter = ballDiameter;
        groundPosition = groundPos;
        topPosition = topPos;
        leftSidePosition = leftSidePos;
        rightSidePosition = rightSidePos;
        canvas = drawingCanvas;
    }
    public void draw()
    {
        canvas.setForegroundColor(color);
        canvas.fillCircle(xPosition, yPosition, diameter);
    }
    public void erase()
    {
        canvas.eraseCircle(xPosition, yPosition, diameter);
    }    
    public void move()
    {
        erase();
        ySpeed += GRAVITY;
        yPosition += ySpeed;
        xPosition += xSpeed;
        if(yPosition >= (groundPosition - diameter) && ySpeed > 0) 
        {
            yPosition = (int)(groundPosition - diameter);
            ySpeed = -ySpeed + ballDegradation; 
        }
        if(yPosition <= topPosition && ySpeed < 0)
        {
            yPosition = (int)topPosition;
            ySpeed = -ySpeed + ballDegradation;
        }
        if(xPosition <= leftSidePosition && xSpeed <0)
        {
            xPosition = (int)leftSidePosition;
            xSpeed = -xSpeed + ballDegradation;
        }
        if(xPosition >= (rightSidePosition - diameter) && xSpeed > 0) 
        {
            xPosition = (int)(rightSidePosition - diameter);
            xSpeed = -xSpeed + ballDegradation;
        }
        draw();
    }
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            switch( keyCode ) { 
        case KeyEvent.VK_UP:
            ySpeed = -ySpeed --;
            break;
        case KeyEvent.VK_DOWN:
            ySpeed = -ySpeed ++;
            break;
        case KeyEvent.VK_LEFT:
            xSpeed = xSpeed --;
            break;
        case KeyEvent.VK_RIGHT :
            xSpeed = xSpeed ++;
            break;
     }
    } 
    }
4

1 に答える 1

2
  • API、メソッド、または ei に予約済みの Java 名を使用しないActionでください。MyAction

  • AWT Canvas を使用せず (OpenXxx、CAD、CAM など、本当に重要な理由がある場合のみ)、代わりに JPanel または JComponent を使用してください。

  • (誰もあなたのコードの残りを知りません) AWT コンポーネントと Swing JComponent を混ぜないでください

  • JPanel または JComponent を使用する場合は、KeyListener ではなくKeyBindingsを使用します。

  • それ以外の場合は、Canvas に Focusable を設定する必要があり、Focus に関する変更を行った後、Focus を Canvas に戻す必要があります。これは KeyListener の問題です。

于 2012-05-28T11:09:51.800 に答える