Probleme java graphics

Fermé
Epic_sans.fr - 16 nov. 2020 à 18:09
Bonsoir, je voudrais savoir comment créer des "entités" comme dans le jeu minecraft en java.
j'ai reussi à programmer ce petit programme qui génère des projectiles mais je n'arrive pas à
mettre une position spécifique à chacun..
et je voulais comprendre aussi pourquoi mon jeu ne réponds pas très très fluidement
quand j'active les clées qui permettent de faire bouger le personnage

Voici le code en entier:

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Timer;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class main extends JPanel{
//size of charactere
static final int HEIGHT = 50;
static final int WIDTH = 40;
//size of frame
static final int HEIGHT_FRAME = 14*50;
static final int WIDTH_FRAME = 14*50;
//number of sword
static int nbsword = 0;
//list who stock positions
static ArrayList<Integer> array = new ArrayList<Integer>();
//activate/desactivate jump and throw
static int Jump = 0;
static boolean Throw = false;
public static void main(String[] args) {
new Images();
JFrame frame = new JFrame("The Game");
//add keylistener
frame.addKeyListener( new KeyListener(){

@Override
public void keyPressed(KeyEvent arg0) {
//call of the fonction PlayerMove
Player.PlayerMove(arg0.getKeyCode());
}

@Override
public void keyReleased(KeyEvent arg0) {
//call of the function Jumping if space bar is Released
if(arg0.getKeyCode()==38) {
if(Jump==0) {
Jump=1;
Jumping();
}
}
}

@Override
public void keyTyped(KeyEvent arg0) {

}
});
frame.setContentPane(new main());
frame.setSize(WIDTH_FRAME,HEIGHT_FRAME);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
}
public main(){
new Thread(new Runnable(){

@Override
public void run(){
while(true) {
repaint();
try {
//60fps
Thread.sleep(1000/60l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}).start();
}

public static void Jumping(){
new Thread(new Runnable(){

@Override
public void run(){
if(Jump==1) {
int ysnakePart = Player.y;
while(Player.y!=ysnakePart-HEIGHT*3) {
try {
Thread.sleep(3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Player.y-=2;
}
while(ysnakePart!=Player.y) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Player.y+=1;
}

Jump=0;
}
}
}).start();
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
JLayeredPane Layer = new JLayeredPane();
g.drawImage(Images.Background, 0, 0,HEIGHT_FRAME,WIDTH_FRAME ,Layer);
g.drawImage(Images.Joueur,Player.x, Player.y, WIDTH,HEIGHT, Layer);
if(Throw==true) {
for(int i = -1; i<=nbsword; i++) {
g.drawImage(Images.Projectile,array.get(nbsword-1), Player.y, 50, 50, Layer);
}
}
}
static class Player{
public static int x = 50, y = 500;
public static void PlayerMove(int arg0) {
if(arg0==37 || arg0==39) {
x = (arg0 == 37) ?x-5: x+5;
}
if(arg0==32) {
nbsword++;
Projectile.x = Player.x+50;
Projectile.Throw();
array.add(Projectile.x);
Throw = true;
}
}

}
static class Projectile{
static int compteur = 0;
static int x = Player.x+50;
static int y = Player.y+10;
public static void Throw(){
new Thread(new Runnable(){

@Override
public void run(){
compteur++;
// TODO Auto-generated method stub
if(compteur==1) {
while(true) {
try {
Thread.sleep(1000/60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
array.remove(nbsword-1);
x+=7;
array.add(x);
}
}
}
}).start();
}
}
}


merci de votre reponse, bonne soirée.
A voir également: