IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Probleme Changé]Optimisation de l'affichage de jeu


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut [Probleme Changé]Optimisation de l'affichage de jeu
    [Edit] Le lag que j'ai rencontré n'es pas du a mon probleme de recherche de colision mais plutot a l'affichage lui meme, voir plus bas pour détails[/Edit]

    Salut à tous et merci de votre attention !

    Voilà je suis en train de coder un petit jeu 2D du style space invaders et j'aimerais ameliorer mon algo de detection de colision entre les "Tirs" de mon vaisseau et les differents "Hostiles" se balandant dans l'espace.

    Le probleme est que lorsque j'ai 60 Tirs et 20 Hostiles le jeu lag enormement...
    Quelqu'un sait comment alleger tout ca ?

    De plus avec ma methode je ne test, que si le centre de l'hostile est dans le rectangle correspondant a l'image du tirs, je preffererais savoir si les deux rectangles sont en colision.

    Pour chaque Objet, que ce soit un "Tir" ou un "Hostile" je peux récuperer :
    vx - vitesse en x
    vy - vitesse en y
    width - largeur en x de l'image represantant l'objet
    height - largeur en y de l'image represantant l'objet
    p - le point des coordonnée centrées de l'objet (en effet le centre de l'image correspond a ce point donc pour la dessiné ca donne drawImage(image, p.getX()-width/2, p.getY()-height-2,null)

    Voilà a peu près le code (en simplifié mais la structure est la même)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	private void checkTirWithHostiles () {
     
    		Tir t;
    		Hostile m;
     
    		for (int i = 0; i<this.hostiles.size(); i++) {
     
    			m = (Hostile) this.hostiles.get(i);
     
    			for (int j = 0; j<this.tirs.size(); j++) {
     
    				t = (Tir) this.tirs.get(j);
    				if (m.getPoint().getX()>t.getMinX() && m.getPoint().getX()<t.getMaxX()+t.getVx() && m.getPoint().getY()>t.getMinY() && m.getPoint().getY()<t.getMaxY()+t.getVy()) {
     
                                     //Je fais ce qu'il y a a faire en cas de collision
    				}
     
    			}
     
    		}		
    	}

    Edit : je viens d'avoir l'idée d'utiliser la classe Rectangle et la methode contains pour voir si le point est dedans... on vera. Mais n'hsitez pas a poster vos conseils ! Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Une petite discussion similaire recente (sur des collisions de Shape) : http://www.developpez.net/forums/sho...d.php?t=158097

    Tu devrais egalement pouvoir trouver des indications dans cet article : http://www.planetalia.com/cursos/index.jsp voir le chapitre 20, la version anglaise est sur la droite de la page.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Je regarde ca tout de suite.

    Merci

  4. #4
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Le deuxieme lien est vraiment pas mal et très proche de mon petit jeu... le code de collision et de chargement est le meme d'ailleur...

    Bon ben je pense aps pouvoir mieux faire.

    Merci

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Note que le test de la boite englobante est un premier pas uniquement ; c'est une approximation permettant d'eliminer rapidement les non-contacts. En cas de recouvrement des boites tu dois faire des tests plus approfondis pour savoir si tes sprites (j'imagine que tu utilises des sprites bitmaps) se touchent correctement. Sinon dans un jeu final ca peut laisser au joueur une impression bizarre : le fait de se faire tuer sans avoir ete rellement touche par l'ennemi... ou au contraire d'etre super-puissant en zigouillant les streumeux sans vraiment bien viser...

    - tu peux parcourir les pixels de la zone de recouvrement et voir si des pixels non-opaque des images des deux sprites sont supperposes.

    - dans le cas ou ton sprites peut avoir des zones + ou - transparentes mieux vaut lui associer un bitmask (image binaire/monochrome 0-1) indiquant quelles zones sont solides ou "vides".



    - sinon tu peux egalement lui associer une Shape vectorielle mais dont le contour est une approximation de la zone occupee par les pixels.



    Les deux derniers cas demandent un peu plus de travail prealable (dans un editeur de sprites par exemple) mais peuvent aider le jeu car le traitement des collisions s'en trouve accellere. En plus ca permet de decider des zones actives qu'on doit toucher lorsqu'on vise un boss par exemple (qu'on doit toucher aux yeux, coeur, zone sensible, etc...). On peut dans ce cas utiliser des bitmaks/masques avec plusieurs couleurs pour distinguer les zones solides des zones actives, etc...



    ou plusieurs formes definies dans un fichier texte accompagnant le sprite.

    Bien sur tu peux aussi prendre en compte une certaine marge d'erreur (zone d'effet) histoire d'accelerer un tant soit peu les calculs.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Oui non mais la je cherche meme pas a verifier qu'ils se touche en zone transparentes...

    Je verifie juste pours les rectangles. de toutes facon mes images sont assez carrées ou petites donc bon...

  7. #7
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Bon en fait leprobleme de lag ne semble pas venir de la gestion de colisions puisqu'en désactivant celle-ci les lag sont parfaitemant identiques...

    Il semblerais que cela soit du a l'affichage du panneau de jeu.
    Je dessine bon nombre d'image dans un JPane. Je dirais entre 50 et 100 images, une par objet, mais elle provienne que de 5 ou 6 fichiers images et sont en static pour chacune de mes classe (les meteorites ont une image, les vaisseaux une, les tirs une et en gros c'est tout). J'affiche aussi un fond qui est en fait une mosaique de la meme image affichée plusieur fois.

    J'ai pour but d'obtenir un fps au alentours de 50, en fait je refresh toutes les 20ms (Thread.sleep(20); )

    Malheureusement tout ca lag franchement..

    Comme je l'ai dit un peu avant mes images sont déclarées static et ouverte (sur le bon conseil de bouye) avec ImageIO(new File("image.png");

    J'ai pensé a un truc que j'avais lut sur le forum concernant le "Doubble Buffering" mais j'ai aussi lut qu'il etais prédéfinit pour Swing, donc pas besoins de le refaire. Me trompe-je ?

    Voici mon code pour le JPanel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
    public class MPanel extends JPanel {
     
    	//Attributs
    	public BufferedImage ifond, iwin, ilose, i1, i2, i3, igo;//Certaines images propres au panel, a part le fond elle ne sont affichees qu'en debut et fin de partie
    	private Dimension screen;//la dimention du panel
    	private MJeu jeu;//Le gestionnaire du jeu ou on va chercher pas mal de donnee
    	private int dx, dy;//La moitiee en x et y de l'image du vaisseau
    	private int fx, fy;//Le nombre de repetition en x et y de l'image de fond
            private fdx, fdy;//La taille de l'image de fond en x et y
     
    	//Constructeur
    	public MPanel (MJeu jeu, Dimension screen) {
     
    		try {
    			ifond = ImageIO.read(new File(GConstantes.I_FOND));
    			iwin = ImageIO.read(new File(GConstantes.I_WIN));
    			ilose = ImageIO.read(new File(GConstantes.I_LOSE));
    			igo = ImageIO.read(new File(GConstantes.I_GO));
    			i1 = ImageIO.read(new File(GConstantes.I_1));
    			i2 = ImageIO.read(new File(GConstantes.I_2));
    			i3 = ImageIO.read(new File(GConstantes.I_3));
    		} catch (IOException e) {}
     
    		this.jeu = jeu;
    		jeu.setPanelSize(screen);
    		this.setInvisibleCursor();
    		this.screen=screen;
    		this.setSize(screen);
    		this.setPreferredSize(screen);
    		this.dx=(int)this.jeu.getJoueur().getImageVaisseau().getWidth(null)/2;
    		this.dy=(int)this.jeu.getJoueur().getImageVaisseau().getHeight(null)/2;
    		this.fdx = this.ifond.getWidth();
    		this.fdy = this.ifond.getHeight();
    		this.fx=(int)this.screen.getWidth()/fdx+2;
    		this.fy=(int)this.screen.getHeight()/fdy+2;
     
    	}
    	//PaintComponent
    	public void paintComponent (Graphics g) {
     
    		super.paintComponent(g);
    		//Dessin du fond
    		this.drawBackground(g);		
    		//Dessin du vaisseau
    		g2d.drawImage(this.jeu.getJoueur().getImageVaisseau(), (int)this.jeu.getJoueurPos().getX(), (int)this.jeu.getJoueurPos().getY(), null);
    		//Dessin des hostiles
    		this.drawHostiles(g);		
    		//Dessin des tirs
    		this.drawTirs(g);		
    		//Dessin des explosions
    		this.drawExplosion(g);	
    		//Dessin du bouclier
    		if (this.jeu.shieldOn()){
    			g2d.drawImage(this.jeu.getJoueur().getImageBouclier(), (int)this.jeu.getJoueurPos().getX(), (int)this.jeu.getJoueurPos().getY(), null);
    		}				
    	}
    	//Methodes Privées
    	private void drawExplosion(Graphics g) {
     
    		MExplode e;
    		for (int i = 0; i < this.jeu.getExplosions().size(); i++) { //On dessine toutes les explosions			
    			e = (MExplode) this.jeu.getExplosions().get(i);  //Recuperation de l'explosion
    			g.drawImage(e.getImage(), (int)e.getPoint().getX(), (int)e.getPoint().getY(), null); //Dessin de l'explosion
    		}		
    	}
    	private void drawTirs(Graphics g) {
     
    		MTir t;
    		for (int i = 0; i < this.jeu.getTirs().size(); i++) {			
    			t = (MTir) this.jeu.getTirs().get(i);
    			g.drawImage(t.getImage(), (int)t.getPoint().getX(), (int)t.getPoint().getY(), null);
    		}		
    	}
    	private void drawHostiles(Graphics g) {
     
    		if (jeu.getDecompte() < 0) {			
    			MHostile m;
    			for (int i = 0; i < this.jeu.getHostiles().size(); i++) {				
    				m = (MHostile) this.jeu.getHostiles().get(i);
    				g.drawImage(m.getImage(), (int)m.getPoint().getX(), (int)m.getPoint().getY(), null);
    			}		
    		}		
    	}
    	private void drawBackground(Graphics g) {
     
    		for (int i = 0; i<this.fx; i++) {//Dessin dans la hauteur			
    			for (int j = 0; j<this.fy; j++) {//Dessin dans la largeur				
    				//Dessin de l'image de fond avec un decalage en x de dxf%largeur de l'image pour creer l'illusion de mouvement
    				g.drawImage(ifond, j*fdx-this.jeu.getDfx(), i*fdy, null);				
    			}			
    		}		
    	}
    }

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Si tu utilises une acceleration materielle quelconque (ex: BufferStrategy) l'affichage peut etre ralenti (et pas qu'un peu) si tes images ne sont pas compatibles avec ton affichage : http://www.developpez.net/forums/sho...d.php?t=155407
    EDIT - Ca peut peut-etre egalement le faire en mode dessin direct dans le graphics de l'ecran ou en mode de rendu offscreen software dans une image (j'avais pas vu le code quand j'ai repondu).

    C'est aussi mentionne tout a la fin (chapitre 29) de l'article sur le Space Invaders que je t'ai passe plutot.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Je ne m'y connais pas en acceleration matériel, je n'en utilise a prioris pas (en fait je ne pense), du moins je ne spécifie pas.

    Mes images sont en png, je pense que ca doit pas poser de probleme ? si ?

    Je met ce JPanel dans une frame que je met en full screen dont le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class MFrame extends JFrame {
     
    	private static final long serialVersionUID = 1682471703050663407L;
     
    	public MFrame () {
     
    		//parametre de la frame
    		this.setTitle("MiniJeu");
    		this.setResizable(false);
    		this.setUndecorated(true);
    		Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    		this.setSize((int)screenSize.getWidth(), (int)screenSize.getHeight());
    		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
     
    	}
     
    }
    voila ce que ça donne diminué a 75%, on peut distinguer quelques points rouges plus gros qui sont aussi des images (les tirs des mechant vaisseaux rouges )

  10. #10
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Citation Envoyé par bouye
    EDIT - Ca peut peut-etre egalement le faire en mode dessin direct dans le graphics de l'ecran ou en mode de rendu offscreen software dans une image (j'avais pas vu le code quand j'ai repondu).
    Excuse moi mais je ne comprends pas trop ce que tu dis. Le lag viendrais du fait que je fasse directement g.drawImage(....); ?

    [Edit] J'ai cherché "offscreen" sur le forum et sur google et j'ai pas trouvé à quoi ca corrspondait. Une petite explcation ?

    Sinon un details sur le chargement des images, voila a quoi ca ressemble, est ce que je fais mal ? les images sont elle bien chargées de cette facon ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class MGrandMeteore implements MHostile {
     
    	private int vx, vy;
    	private static Image image;
    	private static int damagePower;
    	private int health;
    	private MJeu jeu;
    	private Rectangle rectangle;
    	private static int dx, dy;
     
    	public MGrandMeteore(MJeu jeu, Point p, int vx, int vy) {
     
    		this.jeu=jeu;
    		this.vx = vx;
    		this.vy = vy;
    		if (image==null){
    			try {
    				image = ImageIO.read(new File(GConstantes.I_GRAND_METEORE));
    				dx = (int)image.getWidth(null)/2;
    				dy = (int)image.getHeight(null)/2;
    				damagePower = GConstantes.METEORE_DAMAGE_POWER_GRAND;
    			} catch (IOException e) {}
    		}
    		this.rectangle=new Rectangle((int)p.getX(), (int)p.getY(), 2*dx, 2*dy);
    		this.health = GConstantes.METEORE_HEALTH_GRAND;
     
    	}

  11. #11
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Je peux mettre tout mon code a disposition si quelqu'un veut tester, observer ou autre ?

    Demandez et je met un lien vers un .rar contenant toutes les sources (images, .java et .class) prèt a etre lancé

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    En fait ca viendrai (peut-etre, a verifier) du format interne des images (Java, pas les fichiers PNG) elles-meme qui n'est pas compatible avec la maniere dont la carte video gere sa memoire, d'ou des ralentissements.

    The first optimization consists in using images in a compatible format. What does this mean? A compatible immage is an image in memory that has the same (or at least very similar) characteristics as the native video mode we are using - in terms of bits per pixel, transparency, etc. Compatible images are much faster to draw than images in any other format. Right now we are using the images in whatever format ImageIO chooses to return them. We can optimize this by :

    Reading the image from disk using ImageIO
    Creating a compatible image of the same size as the loaded image
    Drawing the loaded image on the compatible image
    This gives us a "compatible version" of an image located on disk
    Quand au rendu tu as grosso modo 4 choix pour le rendu si j''ai bien compris avec + ou - d'acceleration materielle :

    - dessin direct sur l'ecran (rendu actif) ce que tu fais et en general fonctionne tres bien dans la plupart des cas. Cette solution n'est pas 100% software de toute maniere dans les versions les plus recentes de la JVM.

    - dessin dans une BufferedImage destination, elle-meme composee sur l'ecran (rendu offscreen "software"). Cette solution n'est cependant pas non-plus 100% software dans les JVM recentes.

    - dessin dans une VolatileImage destination, elle-meme composee sur l'ecran (rendu offscreen "hardware"). Une VolatileImage est stockee dans la memoire de la carte video.

    - dessin dans un BufferStrategy. C'est un acces direct a la memoire de la carte video. Cela permet entre autre d'effectuer des changements de page en changeant rapidement le pointeur sur la page courante dans la memoire de la carte video (avec des methodes Java bien sur, on ne vas pas se mettre a faire du C). L'embettant c'est qu'on ne peut pour le moment creer de tel objets qu'avec les composants AWT Window et Canvas.

    Mais bon de base ce n'est pas trop ton probleme immediat ; cependant tu peux "generifier" ton code de rendu de maniere a ne tenir compte que du fait que tu rends dans un Graphics et supporter ainsi tel ou tel mode (ou tous si besoin et suivant les choix de l'utilisateur).

    Apres tu peux avoir d'autres trucs qui peuvent ralentir le tout, ex : utiliser des images avec de la transparence 24/32-bits (sisi) au lieu d'images en 256 couleurs avec un couleur transparente (cf : tes sprites semblent avoir un faible niveau de couleurs) mais bon artistiquement ca rend quand meme mieux avec une vraie transparence.

    Enfin plutot que d'aggrandir ta frame au maximum en en retirant les bord, il existe en Java le mode plein ecran exclusif qui fait ca tres bien pour toi et devrai t'affranchir des limitations (et ralentissements) du mode fenetre. Apparement il est meme possible de changer la resolution (voir le didacticiel indiquee et egalement ici).

    Comme je l'ai indique dans l'autre thread on sort un peu de mon domaine de competences habituelles, le site http://www.javagaming.org/ a un sous-forum special 2D qui devrait te permettre d'avoir plus facilement de l'aide dans le domaine des jeux.

    Voir egalement le site du livre Killer Game Programming in Java qui, dans sa version papier, est edite par O'Reilly. Certes c'est principalement de la 3D mais certaines techniques (modes d'affichage, etc...) sont aussi applicables en 2D. Note : il y a plus de chapitres sur le site que dans le livre lui-meme.

    Joli jeu
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Joli jeu
    Merci mais tu sais ce n'est que quleques image bien agencées

    Non, le plus ettonant c'est qu'il est presque amusant à jouer !

    Je met les sources dipsos ici, lancez MDriver en vous placant dans /bin (lien ok)

    /!\ il est possible que les images sois introuvable et que cela bug sous linux, les chemins d'acces se trouvent dans la classe kernel.GConstantes, editez les \\ en //

    Petit manuel du jeu :

    touche de 1 à 6 > changer d'arme (attention les muntions partent vite avec les plus grosse armes et je n'ai pas eu le temps de faire de jolie sprites, a vos risques et perils pour les yeux , ne testez que la une et la deux c'est les mieux je trouve)
    touche espace > utiliser le bouclier.
    Sous votre vaisseau : en vert votre vie, en bleu votre energie (tulise pour le bouclier)

    Bon jeu !

    Surtout dites moi si vous souffrez du lag vous aussi.

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Ca marche plutot bien et plutot rapidement sans pour autant etre totalement fluide/synchronise avec le taux de raffraichissement.

    J'ai eut egalement ca en essayant de passer a la 3ieme arme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in thread "main" java.lang.NullPointerException
            at voyage.MTirLarge.move(MTirLarge.java:35)
            at voyage.MJeu.moveTirs(MJeu.java:372)
            at voyage.MJeu.run(MJeu.java:237)
            at MDriver.main(MDriver.java:35)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
            at voyage.MTirLarge.getPoint(MTirLarge.java:41)
            at voyage.MPanel.drawTirs(MPanel.java:170)
            at voyage.MPanel.paintComponent(MPanel.java:79)
    Sur le JRE 1.5.0_07 tout est impec, sur une build recente du JRE 6 le texte Java2D dec@#@ mais la ca vient de ma carte video qui est trop naze (presque tous les autres programmes utilisant Java2D deraillent y compris les demos fournis avec le JDK 6).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    ok je vais voir ca pour la 3eme arme ca doit pas etre grand chose.

    Sur quelle machine a tu testé ?

    J'ai du lag au moment de la 4 ou 5eme vague, quand il a une quinzaine de gros meteore et a peu près 5 vaisseau pirate en face... Avant ca va niquel. et toi ?

    Sinon ca va c'est sympa comme petit jeu non ?

    Moi je tourne sur AMD64 X2 3800, 1Go DDR, 7800Gt le tout sous Windows Xp

    [Edit] L'erreur sur la 3eme arme est corrigée et le fichier re-uploadé

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Il s'agit d'un bi-Xeon 1.4 GHz avec 1Go de RAM et une Matrox G450 avec 32 Mo de VRAM sous Windows XP.
    M'enfin je crève assez rapidement et puis comme je suis au boulot, ce n’est pas forcement top de trop s'exciter sur la souris. Ca soulève de la suspicion sur ses activités…… oups c’est vrai c’est un jeu.

    Sinon tu parles à un très très grand fan de Thunder Force 3 et 4 sur Megadrive ; qui a eut également son heure sur R-Type et Nemesis sur Game Boy voir sur Gradius sur GBA ; alors les side-scrollers : j’aime ça quand ils sont bien fait ! Tu me sembles être sur la bonne voie.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  17. #17
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Ca y'est !!! enfin je crois !

    J'ai totalement annihiler le lag.

    Enfin je crois.

    Ce que j'ai fait c'est qu'au lieu que ca soit ma methode de deroulement du jeu qui repaint le panel, c'est un thread independant qui le fait.

    Raison de l'amélioration:
    -Multithread : sur un Athlon X2 ca doit pas mal jouer.
    -Pas de probleme de synchro, ralentissement de l'affichage a cause de la lenteur des phases de jeu (recherche de colisions etc...).

    Je re-upload le fichier dans un ptit moment.

    (et je pense de temps en temps qu'il est 8h48 et qu'habituellement en france les gens dorment la nuit...)

  18. #18
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Citation Envoyé par bouye
    Il s'agit d'un bi-Xeon 1.4 GHz avec 1Go de RAM et une Matrox G450 avec 32 Mo de VRAM sous Windows XP.
    M'enfin je crève assez rapidement et puis comme je suis au boulot, ce n’est pas forcement top de trop s'exciter sur la souris. Ca soulève de la suspicion sur ses activités…… oups c’est vrai c’est un jeu.

    Sinon tu parles à un très très grand fan de Thunder Force 3 et 4 sur Megadrive ; qui a eut également son heure sur R-Type et Nemesis sur Game Boy voir sur Gradius sur GBA ; alors les side-scrollers : j’aime ça quand ils sont bien fait ! Tu me sembles être sur la bonne voie.
    Merci beaucoup pour tes encouragements et tes conseils ! Ca donne envie de continuer

  19. #19
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    Salut,

    je profite d'avoir essayé ton jeu pour te donner les résultats de mon "analyse" (quel grand mot !! )

    Bon, je l'ai passé au crible avec TPTP (c'est mon nouveau jouet sous Eclipse, il permet de profiler les programmes niveau mémoire, temps d'execution, couverture des méthodes---> c'est achement ben !) et il s'avère que la méthode qui pompe le plus de temps d'execution, c'est DrawHostiles qui prend 51% de temps d'execution (beaucoup d'hommes politiques rêveraient d'avoir ce score )
    Elle est loin devant toutes les autres... c'aurait pu être une piste à suivre pour accélérer ton jeu (qui est ma foi fort sympa )

  20. #20
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Hey hey que de compliments !

    Mais les gars je vous re-upload le jeu et franchement meme moi je suis super supris du resultats des "quelques modifications".

    C'est ici
    (Bon j'avoue c'est un peu gros mais vous aurez en plus des sons qui ne sont pas dans le jeu et les fichiers psd (photoshop) de quelques sprites du jeu super non ?)

    (le lien sur l'autre post renvoie toujours a la "vieille" version, histoire de pouvoir comparer)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [css] Problemes de positionnement et d'affichage
    Par Arnard dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 22/06/2006, 15h46
  2. Réponses: 8
    Dernier message: 08/06/2006, 16h48
  3. [VBA-E]Probleme d'optimisation
    Par sk8bcn dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 30/05/2006, 21h14
  4. [JTable] probleme de constructeur et d'affichage
    Par hby dans le forum Composants
    Réponses: 3
    Dernier message: 01/05/2006, 17h43
  5. [VB]Probleme lecture fichier text et affichage
    Par clochardevobsy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo