Hello !
I currently have a problem with my Side-scroller. (I’m using SLICK2D)
My player moves correctly(the background in fact), and the collisions are working correctly too.
But I don’t really know how to move correctly my monster entity, because they don’t move with the background…
Here are my codes:
Player.java :
package com.poulpicious.gtw.entities;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.state.StateBasedGame;
public class Player extends LivingEntity {
public Player(float x, float y, float width, float height) {
super(x, y, width, height);
screenXPos = 400;
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) {
g.setColor(Color.white);
g.draw(new Rectangle(screenXPos - width / 2 + 1, yPos, width, height));
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta, Input input) {
if (input.isKeyDown(Input.KEY_Q)) {
xDir = -2;
}
if (input.isKeyDown(Input.KEY_D)) {
xDir = 2;
}
if (input.isKeyDown(Input.KEY_LSHIFT)) {
xDir *= 1.4;
}
if (input.isKeyDown(Input.KEY_SPACE) && hasJump) {
yDir = (float) -(4);
hasJump = false;
startJumpY = yPos;
}
startX = xPos;
startY = yPos;
startXDir = xDir;
startYDir = yDir;
collidingTop = false;
moveBounds();
gravity();
move();
handleCollisions();
xDir = 0;
}
public void moveBounds() {
bounds.setLocation(xPos + xDir, yPos + yDir);
}
public void move() {
xPos += xDir;
yPos += yDir;
}
public void gravity() {
yDir += 0.06;
}
private void handleCollisions() {
for (Rectangle rec : blocks) {
Rectangle rect = new Rectangle(rec.getX() - screenXPos + width / 2 - 1, rec.getY(), rec.getWidth(), rec.getHeight());
float[] points = bounds.getPoints();
if (rect.contains(points[4] - 2, points[5] + 2) || rect.contains(points[6] + 2, points[7] + 2)) {
yPos = startY;
yDir = 0;
hasJump = true;
collidingTop = true;
}
if (rect.intersects(getBounds()) && collidingTop == false) {
xPos = startX;
xDir = startXDir;
}
}
}
public float getRealXPos() {
return screenXPos + width / 2 - 1;
}
}
MobEntity.java :
package com.poulpicious.gtw.entities;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.state.StateBasedGame;
public class MobEntity extends LivingEntity {
private Player thePlayer;
public MobEntity(Player player, float x, float y, float width, float height) {
super(x, y, width, height);
thePlayer = player;
isAlive = true;
screenXPos = x;
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) {
g.draw(new Rectangle(xPos - screenXPos, yPos, width, height));
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta, Input input) {
if (thePlayer.getRealXPos() < xPos - screenXPos) {
xDir = -2;
}
if (thePlayer.getRealXPos() > xPos - screenXPos) {
xDir = 2;
}
startX = xPos;
startY = yPos;
startXDir = xDir;
startYDir = yDir;
collidingTop = false;
moveBounds();
gravity();
move();
handleCollisions();
xDir = 0;
}
public void moveBounds() {
bounds.setLocation(xPos + xDir, yPos + yDir);
System.out.println(bounds.getX());
}
public void move() {
xPos += xDir;
yPos += yDir;
}
public void gravity() {
yDir += 0.06;
}
private void handleCollisions() {
for (Rectangle rec : blocks) {
Rectangle rect = new Rectangle(rec.getX() - screenXPos, rec.getY(), rec.getWidth(), rec.getHeight());
float[] points = bounds.getPoints();
if (rect.contains(points[4] - 2, points[5] + 2) || rect.contains(points[6] + 2, points[7] + 2)) {
yPos = startY;
yDir = 0;
hasJump = true;
collidingTop = true;
}
if (rect.intersects(getBounds()) && collidingTop == false) {
xPos = startX;
xDir = startXDir;
}
}
}
public boolean isAlive() {
return isAlive;
}
}