Hey, for the past two hours or so I’ve been attempting to add collision detection into my program but for some reason I just can’t seem to figure out how to do it. I know that I’m supposed to use .intersects() and I’ve managed to get this working, somewhat, before in a different program but this one is a bit different so it’s just thrown me off a bit.
The player’s character is always centered on the screen, I’ve made sure of that. The screen moves around the player instead of the player moving around the screen. The map is loaded and then re-rendered depending on where the player moves. I can’t figure out how to do .intersects() with the way that I’ve made the movement.
If anyone can figure out a way to get it working or has an idea of what I can try to get this working it’ll help a lot.
Code Related to Map/Character Movement:
KeyboardListener
package Functions;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyboardListener implements KeyListener
{
int xpos = 0; //Player's X and Y positions on the current map.
int ypos = 0;
int direction = 0; //0 left, 1 up, 2 right, 3 down
boolean walking = false, inventory = false, escapeKeyPressed = false, screenshotKeyPressed = false;
public KeyboardListener(Component x)
{
x.addKeyListener(this);
}
public void keyPressed(KeyEvent event)
{
int keyCode = event.getKeyCode();
System.out.println("Walking:"+walking+" KeyCode:"+keyCode+" Direction:"+direction);
switch(keyCode)
{
//Movement Controls
case 87: //w key pressed
direction = 1;
walking = true;
ypos--;
break;
case 65: //a key pressed
direction = 0;
walking = true;
xpos--;
break;
case 83: //s key pressed
direction = 3;
walking = true;
ypos++;
break;
case 68: //d key pressed
direction = 2;
walking = true;
xpos++;
break;
case 38: //up arrow key pressed
direction = 1;
walking = true;
ypos--;
break;
case 37: //left arrow key pressed
direction = 0;
walking = true;
xpos--;
break;
case 40: //down arrow key pressed
direction = 3;
walking = true;
ypos++;
break;
case 39: //right arrow key pressed
direction = 2;
walking = true;
xpos++;
break;
case 73: //i key pressed
inventory = true;
break;
case 27: //escape key pressed
escapeKeyPressed = true;
break;
case 113: //F2 key pressed
screenshotKeyPressed = true;
break;
}
}
public void keyReleased(KeyEvent event)
{
int keyCode = event.getKeyCode();
switch(keyCode)
{
//Movement Controls
case 87: //w key released
walking = false;
break;
case 65: //a key released
walking = false;
break;
case 83: //s key released
walking = false;
break;
case 68: //d key released
walking = false;
break;
case 38: //up arrow key released
walking = false;
break;
case 37: //left arrow key released
walking = false;
break;
case 40: //down arrow key released
walking = false;
break;
case 39: //right arrow key released
walking = false;
break;
case 73: //i key released
break;
case 27: //escape key released
escapeKeyPressed = false;
break;
case 113: //F2 key released
break;
}
}
public void keyTyped(KeyEvent event) //This needs to be here or else an abstract error will be shown when compiling, don't worry; Just keep this here.
{
}
//Get Methods
public int getXpos()
{
return xpos;
}
public int getYpos()
{
return ypos;
}
public int getDirection()
{
return direction;
}
public boolean getWalking()
{
return walking;
}
public boolean getInventory()
{
return inventory;
}
public boolean getEscapeKeyPressed()
{
return escapeKeyPressed;
}
public boolean getScreenshotKeyPressed()
{
return screenshotKeyPressed;
}
//Set Methods
public void setInventory()
{
inventory = false;
}
public void setScreenshotKeyPressed(boolean x)
{
screenshotKeyPressed = false;
}
}
Rendering Player/Map
package Interface;
import Functions.KeyboardListener;
import Functions.ResourceLoader;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
public class ScreenGame extends Screen
{
private KeyboardListener keyboard;
private int spriteCounter = 0;
private boolean gamePaused = false, inventoryScreenPaused = true;
private ResourceLoader resourceLoader;
private GameCanvas canvas;
private static int counter = 0;
public ScreenGame(GameCanvas canvas, KeyboardListener keyboardListener)
{
this.resourceLoader = new ResourceLoader();
keyboard = keyboardListener;
this.canvas = canvas;
}
public void tick()
{
}
public void render(Graphics2D graphics)
{
counter++;
//Check which screen to render.
if(keyboard.getInventory() == true)
{
gamePaused = true;
inventoryScreenPaused = false;
}
RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.setRenderingHints(renderingHints);
int width = 10;
int height = 10;
//Render Map
for(int row = 0; row < height; row++)
{
for(int column = 0; column < width; column++)
{
if(resourceLoader.getMap()[column][row] == -1237980) //To change the movement speed just times all of the .getXpos and .getYpos parts by a speed multiplier
{
graphics.setColor(Color.RED);
graphics.fillRect(column*40 - keyboard.getXpos(), row*40 - keyboard.getYpos(), 40, 40);
}
else if(resourceLoader.getMap()[column][row] == -3584)
{
graphics.setColor(Color.YELLOW);
graphics.fillRect(column*40 - keyboard.getXpos(), row*40 - keyboard.getYpos(), 40, 40);
}
else if(resourceLoader.getMap()[column][row] == -16735512)
{
graphics.setColor(Color.BLUE);
graphics.fillRect(column*40 - keyboard.getXpos(), row*40 - keyboard.getYpos(), 40, 40);
}
}
}
//Render Player
if (keyboard.getWalking() == false)
{
spriteCounter = 0;
counter = 0;
}
else if(keyboard.getWalking() == true && spriteCounter == 0)
{
spriteCounter = 1;
}
int direction = keyboard.getDirection();
if (spriteCounter == 0 && keyboard.getWalking() == false)
{
graphics.drawImage(resourceLoader.getSprite(0, direction, spriteCounter), 628, 499, null);
}
else if (spriteCounter == 1 && keyboard.getWalking() == true && counter >= 15)
{
graphics.drawImage(resourceLoader.getSprite(0, direction, spriteCounter), 628, 499, null);
spriteCounter++;
counter = 0;
}
else if (spriteCounter == 1 && keyboard.getWalking() == true && counter < 15)
{
graphics.drawImage(resourceLoader.getSprite(0, direction, spriteCounter), 628, 499, null);
}
else if (spriteCounter == 2 && keyboard.getWalking() == true && counter >= 15)
{
graphics.drawImage(resourceLoader.getSprite(0, direction, spriteCounter), 628, 499, null);
spriteCounter--;
counter = 0;
}
else if (spriteCounter == 2 && keyboard.getWalking() == true && counter < 15)
{
graphics.drawImage(resourceLoader.getSprite(0, direction, spriteCounter), 628, 499, null);
}
}
}
The map is loaded depending on the RGB values of each pixel on a small .png image.