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.
world.step()
is not actually working, can't figure out why, tried moving it about and changing arguments. No avail. – Gibbo