开发者

Component size problem! Resizes to parent's size for reasons I'm unaware of!

I can't seem to figure out why this is happening...

My serverPaddle (it's based on a java.awt.Component) isn't coming out the right size. I've placed System.out.println(serverPaddle.getSize()); in the thread loop and it shows that the component is the right size for 1 loop and then the next and thereafter, it's the same size as the parent (Container).

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(BAL开发者_开发问答L_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);
        }
    }

This is the Paddle class

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

My GameObject class...

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

even when I comment all the code out for the Ball/puck, it doesn't work. Commenting out the "wait" method doesn't work as well. It just somehow changes for some reason that I don't know but I really wanna know SO I CAN FIX THIS THING!!11

Help! Thanks.

By the way, wait is just calling Thread.sleep

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


Firstly, that is an awful lot of code. You want to be able to cut the problem down so that it is small enough that it becomes trivial. And if you want other people to help, it's generally a good idea to be able to produce a complete, compilable program that shows the problem and nothing else.

As it is, it looks as if you are using the content pane of a JFrame with the default LayoutManager. This will default to BorderLayout. When you add components without specifying constraints, they will be added to the "center". Without any side components, the center component will spread out to fill all available area.

So set an appropriate layout manager. I prefer to create a JPanel and use setContentPane, rather than have to bend my code structure around getContentPane.


Any reason you are not using Swing?


Eh...

For some very strange reason unbeknownst to me, when I add this line right below the run() method...

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

The paddle renders (correct size) correctly.

When I remove it, the problem comes back... so... what the heck?

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


You might like this Java 2D games tutorial, featuring a Breakout style game.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜