Проблема с размером компонента! Размеры по размеру родителей по причинам, которые я не знаю! - PullRequest
0 голосов
/ 24 января 2010

Я не могу понять, почему это происходит ...

Мой serverPaddle (он основан на java.awt.Component) не соответствует нужному размеру. Я поместил System.out.println (serverPaddle.getSize ()); в цикле потока, и это показывает, что компонент имеет правильный размер для 1 цикла, а затем следующий и последующий, это тот же размер, что и родительский элемент (контейнер).

import javax.swing.JFrame;
import java.awt.Container;
import java.awt.Color;
import java.awt.Graphics;

    private final int FRAMERATE = 60,       THIS_MUCH = 1000/FRAMERATE,
        BALL_DIAMETER = 30,                               BALL_SPEED = 15,    
        PADDLE_WIDTH = 15,    PADDLE_HEIGHT = 60,         PADDLE_SPEED = 30;
    private final Color BALL_COLOR = Color.WHITE, PADDLE_COLOR = Color.WHITE;

    private Container c;
    private Ball puck;
    private Paddle serverPaddle, clientPaddle;

...

    private Container c;

...

    c = getContentPane();

...

    public void run() {

        //Center puck
        puck = new Ball(c.getWidth()/2 - BALL_DIAMETER/2,
                        c.getHeight()/2 - BALL_DIAMETER/2, BALL_SPEED);
        puck.setSize(BALL_DIAMETER, BALL_DIAMETER);
        puck.setForeground(BALL_COLOR);
        puck.createHitbox();
        puck.setMoving(true);

        //West paddle
        serverPaddle = new Paddle(PADDLE_WIDTH,
                            c.getHeight()/2 - PADDLE_HEIGHT/2,
                            PADDLE_SPEED);
        serverPaddle.setSize(PADDLE_WIDTH, PADDLE_HEIGHT);
        serverPaddle.setForeground(PADDLE_COLOR);
        serverPaddle.createHitbox();

        c.add(puck);
        c.add(serverPaddle);

        //Draw at FRAMERATE frames per second
        while (true) {
            System.out.println(serverPaddle.getSize());
            puck.move(determineSituation());
            puck.repaint();
            wait(THIS_MUCH);
        }
    }

Это класс Paddle

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

public class Paddle extends GameObject implements KeyListener {

    private int x = 0, y = 0;

    public Paddle(int x, int y, int speed) {
        super(speed);
        this.x = x;
        this.y = y;
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    public void paint(Graphics g) {
        setLocation(x, y);

        //These two are the culprits, the size is correct when
        //I use constants instead.
        g.fillRect(0, 0, **getWidth()**, **getHeight()**);
        updateHitbox();
    }
}

Мой класс GameObject ...

import java.awt.Component;
import java.awt.Rectangle;

public class GameObject extends Component {

    /* Members */
    private int speed = 0;
    private boolean isMoving = false;
    private Rectangle hitbox;

    //Dead south = 0 radians, anti-clockwise
    private double direction = 0;

    public GameObject(int speed) {
        this.speed = speed;
    }

    /* Accessors */
    public boolean isMoving() { return isMoving; }
    public void setMoving(boolean isMoving) { this.isMoving = isMoving; }

    public int getSpeed() { return speed; }
    public void setSpeed(int speed) { this.speed = speed; }

    public double getDirection() { return direction; }
    public void setDirection(double direction) { this.direction = direction; }

    public Rectangle getHitbox() { return hitbox; }
    public void createHitbox() { 
        hitbox = new Rectangle(getX(), getY(), getWidth(), getHeight());
    }

    public void createHitbox(int x, int y, int width, int height) { 
        hitbox = new Rectangle(x, y, width, height);
    }

    public void updateHitbox() {
        hitbox.setLocation(getX(), getY());
    }
}

, даже когда я комментирую весь код для Ball / шайбу, он не работает. Комментирование метода «wait» также не работает. Это просто почему-то меняется по какой-то причине, которую я не знаю, но я действительно хочу знать, так что я могу это исправить !! 11

Помощь! Спасибо.

Кстати, wait - это просто вызов Thread.sleep

public void wait(int durationInMilliseconds) {
    try {
        Thread.sleep(durationInMilliseconds);
    } catch (InterruptedException e) {
        System.out.println(e);
    }
}

Ответы [ 4 ]

2 голосов
/ 24 января 2010

Во-первых, это очень много кода. Вы хотите быть в состоянии сократить проблему так, чтобы это было достаточно маленьким, чтобы это стало тривиальным. И если вы хотите, чтобы другие люди помогали, то, как правило, неплохо иметь возможность создать полную, скомпилируемую программу, которая показывает проблему и ничего больше.

В действительности все выглядит так, как будто вы используете панель содержимого JFrame со значением по умолчанию LayoutManager. По умолчанию это будет BorderLayout. Когда вы добавляете компоненты без указания ограничений, они будут добавлены в «центр». Без каких-либо боковых компонентов центральный компонент будет распределяться по всей доступной области.

Итак, установите соответствующий менеджер раскладки. Я предпочитаю создавать JPanel и использовать setContentPane, а не сгибать структуру кода вокруг getContentPane.

0 голосов
/ 24 января 2010

Возможно, вам понравится Учебник по Java 2D-играм с игрой в стиле Breakout .

0 голосов
/ 24 января 2010

Эх ...

По какой-то очень странной для меня причине, когда я добавляю эту строку прямо под методом run () ...

try {
      Clip clip = AudioSystem.getClip();
      //More to be written
    } catch (Exception e) {}

Лопатка правильно отображает (правильный размер).

Когда я удаляю его, проблема возвращается ... так ... какого черта?

try {
      //Clip clip = AudioSystem.getClip();
      //More to be written
    } catch (Exception e) {}
0 голосов
/ 24 января 2010

По какой причине вы не используете Swing?

...