2012-04-04 9 views
0

Ich habe ein einfaches Beispiel erstellt: Hintergrund-Oberflächenschicht und 10 kleine "Punkte" darauf (10 Oberflächenschichten 10x10 px, die jeweils mit fillRect() gefüllt sind). Methode Paint bewegt einfach die Punkte um periodisch:Soll ich SurfaceLayer auf jedem Frame neu zeichnen?

private SurfaceLayer background; 
private List<Layer> dots = new ArrayList<Layer>(); 

@Override 
public void init() 
{ 
    background = graphics().createSurfaceLayer(graphics().width(), graphics().height()); 
    background.surface().setFillColor(Color.rgb(100, 100, 100)); 
    background.surface().fillRect(0, 0, graphics().width(), graphics().height()); 
    graphics().rootLayer().add(background); 

    for (int i = 0; i < 10; i++) 
    { 
     SurfaceLayer dot = graphics().createSurfaceLayer(10, 10); 
     dot.surface().clear(); 
     dot.surface().setFillColor(Color.rgb(250, 250, 250)); 
     dot.surface().fillRect(0, 0, 10, 10); 
     dot.setDepth(1); 
     dot.setTranslation(random()*graphics().width(), random()*graphics().height()); 
     dots.add(dot); 

     graphics().rootLayer().add(dot); 
    } 
} 

@Override 
public void paint(float alpha) 
{ 
    for (Layer dot : dots) 
    { 
     if (random() > 0.999) 
     { 
      dot.setTranslation(random()*graphics().width(), random()*graphics().height()); 
     } 
    } 
} 

Irgendwie Java-Version alle Punkte Spiele endeten unentschieden, html und Android-Version zeichnen nur 1.

Handbuch nicht eindeutig sagen, ob ich sollte alle diese Punkte wieder ziehen in jedem Aufruf von paint(). Und soweit ich das verstanden habe, ist SurfaceLayer für Fälle gedacht, in denen Sie Layer nicht für jeden Frame ändern (damit der gleiche Puffer wiederverwendet werden kann?), Aber das funktioniert nicht.

Also können Sie mir helfen, mit der richtigen SurfaceLayer-Nutzung? Wenn ich gerade ein Rechteck auf SurfaceLayer gefüllt habe - würde es auf dieser Ebene für immer ramin oder sollte ich es in jedem Farbanruf füllen? Wenn ja - unterscheidet sich das von ImmeadiateLayer?

Antwort

1

Sie müssen keine Oberflächenschicht bei jedem Aufruf neu zeichnen. Wie Sie gezeigt haben, zeichnen Sie es nur, wenn Sie es vorbereiten, und die Textur, in die Sie gezeichnet haben, wird in jedem Bild gerendert, ohne dass Sie weitere Maßnahmen ergreifen müssen.

Wenn das Android- und HTML-Back-End nicht alle Oberflächenebenen zeichnen, muss ein Fehler vorliegen. Ich werde versuchen, Ihren Test zu reproduzieren und zu sehen, ob es für mich funktioniert.

Ein Hinweis: Erstellen einer riesigen Oberfläche der Größe des Bildschirms und Zeichnen einer festen Farbe in es ist eine riesige Verschwendung von Textur-Speicher. Erstellen Sie einfach einen ImmediateLayer, der fillRect() für jeden Frame aufruft, was weitaus effizienter ist als das Erstellen einer massiven Bildschirmtextur.

+0

Ich habe einen Test wie deinen zu den PlayN-Oberflächentests hinzugefügt und sie funktionieren gut für mich auf Java, HTML und Android. Vielleicht stimmt etwas anderes nicht? – samskivert

+0

Hier ist ein Test-Spiel: http://speedy.sh/Q56mx/test-game.tar.gz ich starten Sie es mit: mvn sauber mvn Test installieren -Ptest-html Dann öffnen localhost: 8080 in FF oder Chrome - es zeigt schwarzen Bildschirm mit einem einzelnen weißen Punkt. Vielleicht können Sie einen Blick auf den Code werfen und schnell einen Fehler finden? Oder teilen Sie Ihren Test, damit ich das Problem selbst herausfinden kann. – user1312030

Verwandte Themen