1
votes

I am probably missing something simple, not sure what. I am just practicing and re-creating Pong to see how it would go.

I have this:

package com.gibbo.pong;

enter code here
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.World;

public class GameScreen implements Screen {

    // Object instances
    Pong pong;
    Paddle paddle;
    Walls wall;
    Ball ball;
    OrthographicCamera cam;
    public static World world;
    Box2DDebugRenderer debug;

    // Booleans for paddles
    private boolean playerOne = false;
    private boolean playerTwo = false;

    // Booleans for walls
    private boolean wallTop = false;
    private boolean wallBottom = false;

    // Fields for the balls
    private boolean ballExists = false;
    private int ballTotal;

    //Array to hold ball objects
    Ball[] ballArray = new Ball[3];

    // GameScreen default constructor
    public GameScreen(Pong pong) {
        this.pong = pong;

        // Initiate the camera
        cam = new OrthographicCamera(20f, 14f);
        cam.position.set(10f, 7f, 0);

        // Initiate the world, no gravity
        world = new World(new Vector2(0, -10), true);

        // Initiate the renderer
        debug = new Box2DDebugRenderer();

        // Initiate the paddle
        paddle = new Paddle();

        //Initiate the walls
        wall = new Walls();

        //Initiate the ball
        ball = new Ball();



    }

    public void render(float delta) {
        // Clear the screen and fill it black
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        // Update the camera
        cam.update();

        // Render the debug lines
        debug.render(world, cam.combined);

        // Check if paddles exist, if not create them
        if (!playerOne) {
            paddle.createPaddle(1, 7);
            playerOne = true;
            System.out.println("Creating player ones paddle");
        }
        if (!playerTwo) {
            paddle.createPaddle(19, 7);
            playerTwo = true;
            System.out.println("Creating player twos paddle");
        }

        //Check if walls exist, if not create them
        if(!wallBottom){
            wall.createWalls(0, 0.1f);
            wallBottom = true;
            System.out.println("Creating top wall");
        }
        if(!wallTop){
            wall.createWalls(0, 13f);
            wallTop = true;
            System.out.println("Creating bottom wall");
        }

        //Checks if ball exists
        if(!ballExists){
            ball.createBall(10f, 7f);
            ballExists = true;
            if(ballTotal == 0){
            System.out.println("Creating ball number 1");
            ballTotal += 1;
            }else{
                System.out.println("Creating ball number "+ballTotal + 1);
            }
        }
        if(ball.ballBody.getPosition().x < 0){
            System.out.println("Player twos point");
            ball.destroyBall();
        }

        boolean test = true;
        if(test){
        ball.ballBody.setLinearVelocity(-10, 0);
        System.out.println("Does this work?");
        }



        // Simulate the world with frame rate
        // Keep at bottom of render when possible
        world.step(1 / 60, 6, 2);
    }

I am using 3 other classes, one for balls, one for wall and one for paddles. Mainly to practice how to get them working together, passing arguments etc etc. Everything wrote here is a mix of tutorials from LibGDX site and the C++ box2d manual.

This is my ball class:

package com.gibbo.pong;

import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.World;

public class Ball {

    //Instance of the world
    World world;

    //Body for the ball
    Body ballBody;

    //Fixture for the ball
    Fixture ballFixture;

    public void createBall(float posX, float posY){
        //Define a body for the ball
        BodyDef ballBodyDef = new BodyDef();
        ballBodyDef.type = BodyType.DynamicBody;
        ballBodyDef.position.set(posX, posY);

        //Define a shape for the ball
        CircleShape ballShape = new CircleShape();
        ballShape.setRadius(0.50f);

        //Define a fixture for the ball
        FixtureDef ballFixtureDef = new FixtureDef();
        ballFixtureDef.shape = ballShape;
        ballFixtureDef.density = 1;

        //Create a ball
        ballBody = GameScreen.world.createBody(ballBodyDef);
        ballFixture = ballBody.createFixture(ballFixtureDef);

        ballShape.dispose();

        ballBody.setLinearVelocity(-10, 0.1f);


    }

Fairly straight forward, can easily be implemented inside the GameScreen class but for the sake of practice and tidyness, I went with this. I have tried setting the LinearVelocity here and in the GameScreen of the ball, I was trying to simulate what would happen if the ball hit the paddle, how it would react and if the method to destroy a ball off screen would work.

But for some reason, everything is just "stuck". As if everything is static. I even tried creating balls in an Object Array so I could do balls[0].setxxxx but that just went all funny.

Would I need to do create a constructor for my ball and other classes? Are my paddles, walls and ball just getting continuously rendered and forced to remain at the same position?

Regarding the random if statement with a print method in it, was just testing to see if that method was even being reached, so forced it to be run via the use of that.

Any spot my fail here?

Thanks in advance.

1
It seems to be as if world.step() is not actually working, can't figure out why, tried moving it about and changing arguments. No avail.Gibbo

1 Answers

1
votes

Shoot me, turns out that integer division is terrible.

I had to change:

world.step(1/60, 6, 2)

to:

world.step(1f/60f, 6, 2)

Wow that was annoying, yet so simple lol.