Bom dia, estou criando um prototipo de um jogo side scrolling, inseri a imagem de background
e criei uma logica que dependendo da movimentação da imagem do background na tela ao chegar no eixo x = 1024, ele recria a imagem 1020 pixel a frente
porem ao inserir a imagem da nave junto com a movimentação usando o teclado, a imagem de background se sobrepoe a imagem da nave, fazendo ela não ficar visivel
Principal.java
package Principal;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import modelo.Game;
public class Principal {
public static final int LARGURA_TELA = 1024;
public static final int ALTURA_TELA = 630;
// construtor
public Principal() {
// Criação do objeto que representa a janela da aplicação
JFrame janela = new JFrame("STAR IMPACT");
Game game = new Game();
// configurar os diversos aspectos da janela
game.setPreferredSize(new Dimension(LARGURA_TELA, ALTURA_TELA));
janela.setResizable(false); // evita o redimensionamento da janela
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setLocation(100,100); // define a posição de ancoragem da janela
janela.setVisible(true); // torna a janela visivel na tela
janela.getContentPane().add(game);
janela.pack();
}
public static void main(String[] args) {
new Principal();
}
}
Game.java
package modelo;
import Principal.Principal;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Game extends JPanel{
// ATRIBUTOS ---------------------------------------------------------
public NaveJogador navejogador;
public FundoEspaco fundoespaco;
public FundoEspaco fundoespacob;
// os estados de pressionamento das teclas direcionais
public boolean k_cima = false;
public boolean k_baixo = false;
public boolean k_direita = false;
public boolean k_esquerda = false;
// CONSTRUTOR ---------------------------------------------------------
public Game() {
// adiciona o escutador de eventos de pressionamento do teclado
addKeyListener(new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) { // escutador de pressionamento de tecla
switch (e.getKeyCode()) {
case KeyEvent.VK_UP: // tecla cima
k_cima = true;
break;
case KeyEvent.VK_DOWN: // tecla baixo
k_baixo = true;
break;
case KeyEvent.VK_LEFT: // tecla esquerda
k_esquerda = true;
break;
case KeyEvent.VK_RIGHT: // tecla direita
k_direita = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) { // escutados da soltura de tecla
switch (e.getKeyCode()) {
case KeyEvent.VK_UP: // tecla cima
k_cima = false;
break;
case KeyEvent.VK_DOWN: // tecla baixo
k_baixo = false;
break;
case KeyEvent.VK_LEFT: // tecla esquerda
k_esquerda = false;
break;
case KeyEvent.VK_RIGHT: // tecla direita
k_direita = false;
break;
}
}
});
navejogador = new NaveJogador();
fundoespaco = new FundoEspaco();
fundoespacob = new FundoEspaco();
fundoespacob.posX = fundoespacob.posX + 1024;
fundoespaco.velX = fundoespaco.velX - 6;
fundoespacob.velX = fundoespacob.velX - 6;
setFocusable(true); // para poder tratar eventos
setLayout(null);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
gameloop(); // dispara o gameloop do jogo
}
});
thread.start();
}
// GAMELOOP ---------------------------------------------------------
public void gameloop() {
while(true) { // cada repeti��o � um quadro do jogo
handlerEvent();
update();
render();
try {// dando uma pause de 17 milisegundos (60FPS)
Thread.sleep(17);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void handlerEvent(){
}
public void update() {
//move a cada quadro 1 px a direita
fundoespaco.posX += fundoespaco.velX;
fundoespacob.posX += fundoespacob.velX;
testeFundo();
testeColisao();
}
public void render() {
repaint(); // for�ar o redesenho da tela
}
// M�TODOS ---------------------------------------------------------
public void testeFundo()
{
if((fundoespaco.posX+1024) <= 0)//se saiu pela esquerda da tela
{
//reposiciona fundoespaco para tras do fundoespacob
fundoespaco.posX = fundoespacob.posX + 1020;
}
if((fundoespacob.posX+1024) <= 0)//se saiu pela esquerda da tela
{
//reposiciona fundoespaco para tras do fundoespacob
fundoespacob.posX = fundoespaco.posX + 1020;
}
}
public void testeColisao() {
// colisão da navejogador com o lado direito da tela
if(navejogador.posX+(navejogador.raio*2) >= Principal.LARGURA_TELA) {
System.out.println("Colidiu!");
navejogador.posX = navejogador.posX - navejogador.velX; // desfaz o movimento horizontal
}
// colisão da navejogador com o lado esquerdo da tela
if(navejogador.posX <= 0) {
System.out.println("Colidiu!");
navejogador.posX = navejogador.posX - navejogador.velX; // desfaz o movimento horizontal
}
// colisão da navejogador com o lado inferior da tela
if(navejogador.posY+(navejogador.raio*2) >= Principal.ALTURA_TELA ) {
System.out.println("Colidiu!");
navejogador.posY = navejogador.posY - navejogador.velY; // desfaz o movimento vertical
}
// colisão da navejogador com o lado superior da tela
if(navejogador.posY <= 0) {
System.out.println("Colidiu!");
navejogador.posY = navejogador.posY - navejogador.velY; // desfaz o movimento vertical
}
}
// M�TODOS ESPECIAIS ---------------------------------------------------------
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(navejogador.parada, navejogador.posX, navejogador.posY, this);
g.drawImage(fundoespaco.imagem, fundoespaco.posX, fundoespaco.posY, null);
g.drawImage(fundoespacob.imagem, fundoespacob.posX, fundoespacob.posY, null);
}
}
FundoEspaco.java
package modelo;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class FundoEspaco
{
public BufferedImage imagem;
public int posX;
public int posY;
public int velX;
public FundoEspaco()
{
try
{
imagem = ImageIO.read(getClass().getResource("/imagens/background.jpg"));
}
catch(Exception e)
{
e.printStackTrace();
}
posX = 0;
posY = 0;
velX = 0;
}
}
NaveJogador.java
package modelo;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
/* Representa o personagem do jogo */
public class NaveJogador {
public BufferedImage parada;
public int posX;
public int posY;
public int raio;
public int velX;
public int velY;
public NaveJogador() {
// faz o carregamento das imagens
try {
parada = ImageIO.read(getClass().getResource("/imagens/nave.png"));
}catch(Exception e) {
e.printStackTrace();
}
posX=100;
posY=100;
raio=50;
velX=0;
velY=0;
}
}
BACKGROUND
NAVE: