In Play class I have the viewport of game height=320 and game width=240unitswith camera cam. I have set the camera(cam) viewport width to 10 and viewport height to 7.I have another camera hud whose viewport width is game width and viewport height is game height. In render method, I have set Spritebatch to a projection matrix of hud.combined.
import com.mygdx.manager.GameStateManager;
import com.mygdx.manager.MyContactListener;
import com.mygdx.manager.MyInput;
import static com.mygdx.manager.Box2DVariables.BIT_PLAYER;
import static com.mygdx.manager.Box2DVariables.PPM;
public class Play extends GameState{
private World world;
private Player player;
private Box2DDebugRenderer b2d;
private OrthographicCamera B2DCAM;
private TiledMap tileMap;
private OrthogonalTiledMapRenderer orthomap;
private MyContactListener cl;
private float tileSize;
private Sprite sprite;
private Viewport viewport;
private Texture back;
//file name
private final String LEVEL_1 ="maps/tilemap_1.tmx";
public Play(GameStateManager gsm) {
super(gsm);
//setup box2d
world=new World(new Vector2(0,-9.8f),true);
cl=new MyContactListener();
world.setContactListener(cl);
sb=new SpriteBatch();
viewport = new ExtendViewport(MyMainGame.Width, MyMainGame.Height, cam);
// sprite=new Sprite(MyMainGame.con.getTexture("sprite"),32,32);
//cam=new OrthographicCamera();
b2d=new Box2DDebugRenderer();
//create Player
createPlayer();
//create Tiles
createTiles();
orthomap = new OrthogonalTiledMapRenderer(tileMap,1/32f);
// sb=new SpriteBatch();
//setup Box2D Cam
B2DCAM=new OrthographicCamera();
B2DCAM.setToOrtho(false, MyMainGame.Width/PPM,MyMainGame.Height/PPM);
//setup hud and cam
hud=new OrthographicCamera();
cam=new OrthographicCamera();
cam.setToOrtho(false,10,7);
hud.setToOrtho(false,MyMainGame.Width,MyMainGame.Height);
/* //TODO - remove me
File file = new File(LEVEL_1);
if(file.exists())
System.out.println("file exists");*/
}
@Override
public void init() {
}
@Override
public void update(float dt) {
handleInput();
world.step(dt,6,2);
player.update(dt);
}
@Override
public void draw() {
}
@Override
public void render() {
//clear screen
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
hud.update();
if (sb == null) {
System.out.println("Sb is null");
}
// cam.position.set(player.getPosition().x,player.getPosition().y,0 );
sb.setProjectionMatrix(cam.combined);
//draw tile map
orthomap.setView(cam);
orthomap.render();
//draw player
sb.setProjectionMatrix(hud.combined);
player.render(sb);
b2d.render(world,B2DCAM.combined);
}
@Override
public void handleInput() {
if(MyInput.isPressed((MyInput.SPACE))){
System.out.println("space pressed");
if(cl.isPlayerOnGround())
System.out.println(cl.isPlayerOnGround());
player.getBody().applyForceToCenter(0,200,true);
}
}
@Override
public void dispose() {
world.dispose();
b2d.dispose();
tileMap.dispose();
orthomap.dispose();
}
private void createPlayer(){
BodyDef bodydef=new BodyDef();
FixtureDef fixdef=new FixtureDef();
PolygonShape shape=new PolygonShape();
//create player
bodydef.position.set(60/PPM,200/PPM);
bodydef.type= BodyDef.BodyType.DynamicBody;
//
bodydef.linearVelocity.set(1,0);
Body body=world.createBody(bodydef);
shape.setAsBox(13/PPM,13/PPM);
fixdef.shape=shape;
fixdef.filter.categoryBits= BIT_PLAYER;
fixdef.filter.maskBits=Box2DVariables.BIT_BLUE;
// fixdef.filter.maskBits=Box2DVariables.BIT_GREEN;
body.createFixture(fixdef).setUserData("PLAYER");
//create foot sensor
shape.setAsBox(13/PPM,2/PPM,new Vector2(0,-13/PPM),0);
fixdef.shape=shape;
fixdef.filter.categoryBits= BIT_PLAYER;
fixdef.filter.maskBits=Box2DVariables.BIT_BLUE;
// fixdef.filter.maskBits=Box2DVariables.BIT_GREEN;
fixdef.isSensor=true;
body.createFixture(fixdef).setUserData("FOOT");
//create Player
player=new Player(body);
body.setUserData(player);
}
private void createTiles(){
//load tile map
tileMap = new TmxMapLoader().load(LEVEL_1);
//orthomap = new OrthogonalTiledMapRenderer(tileMap,1);
tileSize=(int)tileMap.getProperties().get("tilewidth", Integer.class);
System.out.println("Tile Size " +tileSize);
TiledMapTileLayer layer;
layer=(TiledMapTileLayer)tileMap.getLayers().get("Blue");
createLayer(layer,Box2DVariables.BIT_BLUE);
layer=(TiledMapTileLayer)tileMap.getLayers().get("Green");
createLayer(layer,Box2DVariables.BIT_GREEN);
layer=(TiledMapTileLayer)tileMap.getLayers().get("Red");
createLayer(layer,Box2DVariables.BIT_RED);
System.out.println("Layer Height " +layer.getHeight());
System.out.println("Layer Width " +layer.getWidth());
}
private void createLayer(TiledMapTileLayer layer,short bits){
BodyDef bodydef1=new BodyDef();
FixtureDef fixdef1=new FixtureDef();
//go through cells in layer
for(int row=0;row<layer.getHeight();row++){
for(int col=0;col<layer.getWidth();col++){
//get cells
TiledMapTileLayer.Cell cell=layer.getCell(col,row);
//check if cell exists
if(cell==null) continue;
if(cell.getTile()==null) continue;
//create body and fixture from cell
bodydef1.type= BodyDef.BodyType.StaticBody;
bodydef1.position.set((col+0.5f)*tileSize/PPM,(row+0.5f)*tileSize/PPM);
ChainShape cs=new ChainShape();
Vector2[] v=new Vector2[3];
//bottom left
v[0]=new Vector2(-tileSize/2/PPM,-tileSize/2/PPM);
//top left
v[1]=new Vector2(-tileSize/2/PPM,tileSize/2/PPM);
//top right corner
v[2]=new Vector2(tileSize/2/PPM,tileSize/2/PPM);
cs.createChain(v);
fixdef1.friction=0;
fixdef1.shape =cs;
fixdef1.filter.categoryBits=bits;
fixdef1.filter.maskBits=BIT_PLAYER;
fixdef1.isSensor=false;
world.createBody(bodydef1).createFixture(fixdef1);
}
}
}
}
I want the camera to follow the player. I have tried this
cam.position.set(player.getPosition().x,player.getPosition().y,0);