2016-11-03 4 views
-1

J'ai travaillé sur une simulation d'évolution cellulaire en Java. Juste pour que tout le monde le sache, je suis un programmeur Java débutant/intermédiaire. Je connais à peu près toutes les bases, puis un peu, mais je n'ai pas les compétences pour écrire du code à partir de rien. Le code que j'ai ici est à peu près basé sur une source que j'ai trouvée en ligne, j'ai ajouté mes propres touches et d'autres pièces trouvées en ligne. Il semble fonctionner très bien, sauf l'écran scintille. Il semble que chaque fois que le repaint() est appelé il scintille, probablement effacer et redessiner. Cela crée quelque chose qui est pratiquement impossible à regarder. Il n'y a pas d'erreurs dans mon code. Je ne connais pas encore les applets, donc s'il y a une meilleure façon de le faire, s'il vous plaît faites le moi savoir. Comment puis-je empêcher l'écran de scintiller? Y at-il un moyen facile de tamponner les images pour éviter cela? Voici la classe qui attire l'appletJava Applet paint() méthode scintillant

/* <!-- Defines the applet element used by the appletviewer. --> 
<applet code='CellLife.java' width='1920' height='1080'></applet> */ 

import java.applet.Applet; 
import java.awt.Event; 
import java.awt.Graphics; 
import java.util.Enumeration; 
import java.util.Vector; 

public class CellLife extends Applet implements Runnable { 
// ======================================================================== 
// VARIABLES 
// ======================================================================== 

// Data 

/** Thread object for CellLife applet */ 
private Thread m_cellLife = null; 

// Static constants 

/** 
* the maximum number of creatures in the world. When the number of 
* creatures alive drops below half this, a new one is created to bring the 
* numbers back up. 
*/ 
protected static final int MAX_CREATURES = 60; 

// Data 

/** 
* A list of the creatures currently alive. Stores CLCreature references. 
*/ 
protected Vector creatures; 

/** The world is a rectangle from (0,0) to (limit.x,limit,y) */ 
protected CL2dVector limit; 

/** 
* The number of creatures that have been born since the simulation started 
*/ 
protected long generations; 

/** A test creature controllable by the user to allow response testing */ 
private CLCreature testCreature; 

/** space-partitioning structure to speed collision detection */ 
protected CLBuckets buckets; 

// ======================================================================== 
// METHODS 
// ======================================================================== 

public CellLife() { 
    creatures = new Vector(); 
    limit = new CL2dVector(500.0F, 500.0F); 
    generations = 0; 

    // initilaize our bucket structure 
    float bucketScale = CLCell.RADIUS; // could stretch to root-two times 
             // this 
    buckets = new CLBuckets(bucketScale, (int) Math.ceil(limit.x/bucketScale), (int) Math.ceil(limit.y/bucketScale)); 
} 

public String getAppletInfo() { 
    return "Name: Cell Evolution\r\n" + "Author: Josh Marchand\r\n" + "Made in Eclipse"; 
} 

// first time initialazion 
public void init() { 
    resize((int) limit.x, (int) limit.y); 

    for (int i = 0; i < MAX_CREATURES; i++) { 
     CLCreature new_creature = new CLCreature(); 
     new_creature.InitSimple(limit, buckets); 
     creatures.addElement(new_creature); 
    } 
} 

public void destroy() { 
    // TODO: Place applet cleanup code here 
} 

public void paint(Graphics g) { 
    g.drawString("No. creatures: " + creatures.size(), 0, 11); 
    g.drawString("Births: " + generations, 0, 22); 

    // draw cells 
    for (int i = 0; i < creatures.size(); i++) { 
     ((CLCreature) creatures.elementAt(i)).Draw(g); 
    } 

    // DEBUG: also indicate the contents of the buckets 
    // buckets.Draw(g); 

    // get all creatures to do their stuff 
    CLCreature creature; 
    for (int i = 0; i < creatures.size(); i++) { 

     creature = (CLCreature) creatures.elementAt(i); 

     if (creature.DoTimeStep(g, buckets, limit) && creatures.size() < MAX_CREATURES) { 
      // inherit new creature from current 
      CLCreature newCreature = new CLCreature(); 
      newCreature.InheritFrom(creature, buckets, limit); 
      creatures.addElement(newCreature); 
      generations++; 
     } 
    } 

    // delete the ones that died doing it 
    for (Enumeration e = creatures.elements(); e.hasMoreElements();) { 
     creature = (CLCreature) e.nextElement(); 
     if (creature.hasDied) creatures.removeElement(creature); 
    } 

    // breed nwe creatures if pop. is low 
    if (creatures.size() < MAX_CREATURES/2) { 
     // just add one for now,fix later 
     CLCreature newCreature = new CLCreature(); 
     newCreature.InheritFrom((CLCreature) creatures.elementAt((int) Math.random() * creatures.size()), buckets, limit); 
     creatures.addElement(newCreature); 
     generations++; 
    } 

} 

public void start() { 
    if (m_cellLife == null) { 
     m_cellLife = new Thread(this); 
     m_cellLife.start(); 
    } 
    // TODO: place any additional startup code here 
} 

public void stop() { 
    if (m_cellLife != null) { 
     m_cellLife.stop(); 
     m_cellLife = null; 
    } 
} 

public void run() { 
    while (true) { 
     try { 
      repaint(); 

      // quick nap here to allow user interface to catch up 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      stop(); 
     } 
    } 
} 

public boolean mouseDown(Event e, int x, int y) { 
    // create a single celled creature at specific loc 
    testCreature = new CLCreature(); 
    testCreature.rootCell.location.x = x; 
    testCreature.rootCell.location.y = y; 
    testCreature.rootCell.type = CLGene.RED; 
    creatures.addElement(testCreature); 
    buckets.PutCell(testCreature.rootCell); 
    return true; 
} 

public boolean mouseDrag(Event e, int x, int y) { 
    testCreature.rootCell.location.x = x; 
    testCreature.rootCell.location.y = y; 
    return true; 
} 

public boolean mouseUp(Event evt, int x, int y) { 
    creatures.removeElement(testCreature); 
    buckets.RemoveCell(testCreature.rootCell); 
    return true; 
} 
} 

Merci à tous pour l'aide, et je suis désolé de mon « noobiness », je fais de mon mieux pour me enseigner!

Répondre

0

Je voudrais envisager d'utiliser la technique appelée double tampon, où vous créez un objet graphique hors écran lié à et Image, effectuer tout le dessin sur que puis peindre le résultat à l'écran. Vous pouvez trouver un didacticiel pratique sur la création de graphiques à partir de l'image here. Échantillon plus complet peut être trouvé here.

+0

Merci beaucoup pour ça! Cela fonctionne parfaitement et ne retarde pas l'application du tout. Heureusement, je travaille avec une très petite fenêtre, je peux voir un problème possible si nous travaillons avec de grandes images. Ne changerait-il pas constamment une très grande image de l'applet? –

+0

@JoshMarchand Alors que le double-tampon supprime parfois un peu de performance, ce n'est pas un problème avec le matériel d'aujourd'hui. Si vous rencontrez des problèmes de performances, ce sera ailleurs. – Durandal