Scrollen einer WriteableBitmap

7

Ich muss das Scrollen im Hintergrund simulieren, möchte aber vermeiden, dass meine eigentliche Bildsteuerung verschoben wird. Stattdessen möchte ich eine WriteableBitmapund eine Blitting-Methode verwenden. Wie könnte man ein Bild simulieren, das nach oben rollt? Ich habe verschiedene Dinge ausprobiert, die ich nicht verstehen kann:

 //X pos, Y pos, width, height
 Rect src = new Rect(0, scrollSpeed , 480, height);
 Rect dest = new Rect(0, 700 - scrollSpeed , 480, height);

 //destination rect, source WriteableBitmap, source Rect, blend mode 
 wb.Blit(destRect, wbSource, srcRect, BlendMode.None);
 scrollSpeed += 5;

 if (scrollSpeed > 700) scrollSpeed  = 0;

Wenn height10 ist, ist das Bild ziemlich unscharf und mehr, wenn die Höhe ist 1. Wenn die Höhe größer ist, ist das Bild klarer, aber es scheint nur eine Eins-zu-Eins-Kopie zu machen. Wie kann ich das Bild so scrollen, dass es aussieht, als würde es sich in einer Endlosschleife nach oben bewegen? (Die Höhe des Bildschirms beträgt 700).

Skoder
quelle
1
Ich verstehe wirklich nicht, warum Sie dies tun möchten. Was ist falsch daran, die Hintergrundbilder zu verschieben?
aaaaaaaaaaa
@eBusiness - Ich versuche, mehrere Bildlauftexturen zu erstellen. Einige passen auf den Bildschirm, andere sind kleiner. Ich gehe vielleicht falsch vor, aber wie würden Sie in Silverlight eine Bildlauftextur auf einer Oberfläche erstellen?
Skoder
Wir sprechen über einen Hintergrund, oder? Ich würde die Bilder einfach dort positionieren, wo sie sein müssen, um den gewünschten Hintergrund zu erstellen. Sie geben ausdrücklich an, dass Sie dies nicht so tun möchten, geben aber keinen Grund an.
aaaaaaaaaaa
@eBusiness - Um einen scrollenden Hintergrund zu erstellen, benötige ich zwei Bildsteuerelemente. Ich würde einen nach oben bewegen und wenn er sich vom Bildschirm löst, würde ich ihn auf unten zurücksetzen (während der andere dasselbe tut). Dies ergibt einen Bildlaufeffekt. Wenn ich dies mit einem Scroller ohne Hintergrund mache, verschwindet die Bildsteuerung einfach vor den Augen des Benutzers. Ich habe nach einem Hintergrund in der Frage gefragt, nur weil ich daran gearbeitet habe, aber das Prinzip wäre das gleiche für andere Bildlauftexturen.
Skoder
Sagen Sie uns, was Sie wollen, nicht was Sie nicht wollen. In einer 3D-Umgebung können Sie die UV-Koordinaten ändern, um einen Bildlaufeffekt zu erzielen. Ich weiß nicht genau, wie Silverlight funktioniert, aber in jeder vernünftigen 2D-Umgebung können Sie einen Bruchteil eines Bildes auf den Bildschirm zeichnen, ohne Texturpuffer durchlaufen zu müssen.
aaaaaaaaaaaa

Antworten:

1

Sie können einen Puffer nicht "scrollen", ohne irgendwo das Bit zu speichern, das vom Ende verschoben wurde. Es sieht also so aus, als müssten Sie entweder einen separaten Speicher für das Swapping-Blit oder eine separate Quell-Bitmap haben. Ich würde der Einfachheit halber Letzteres wählen, dann können Sie eine Bildlaufposition speichern und damit Ihre Rechtecke generieren.

Sie müssen zwei Rechtecke erzeugen, einen für die Oberseite und einen für die Unterseite. Der eine für die Oberseite muss auf der Höhe Null beginnen und sich erhöhen, bis er den Boden erreicht. Der mit ihm gepaarte Quell-Rechteck wird ebenfalls gestartet auf Nullhöhe, beginnt jedoch am unteren Rand des Quellbilds:

Rect src = new Rect(0, 700-scrollPos, 480, 700);
Rect dest = new Rect(0, 0, 480, scrollPos);

Ihr unterer Rect ist derjenige, mit dem Sie beginnen, und nimmt zu Beginn den gesamten Bildschirm ein. Verringern Sie die Größe, während Sie den Bildschirm nach unten aus dem Weg des oberen Rect bewegen. Der Source-Rect dafür würde das tun das gleiche, aber anstatt sich nach unten zu bewegen, schrumpft es nur.

Rect src = new Rect(0, 0, 480, 700-scrollPos);
Rect dest = new Rect(0, scrollPos, 480, 700);

Und mit diesen beiden Blits haben Sie einen Scroller.

Richard Fabian
quelle
@ Richard Fabian. Sack. Siehe Diskussion oben, vielleicht könnten Sie die Verwirrung beseitigen. Würden Sie die Verwendung einer Zwischentextur als die übliche Methode zur Erzielung eines Bildlaufeffekts betrachten?
aaaaaaaaaaaa
Für fast alle Situationen gibt es eine Quelltextur und einen Zielpuffer. Ich denke, in Silverlight ist die beschreibbare Textur der Zielpuffer, und die Quelle ist alles, was darauf geblendet werden kann. Ich bin nur dann auf bessere Implementierungen gestoßen, wenn der Zielpuffer der Bildschirm ist (in diesem Fall wurde ein Shader zum Scrollen einer Textur verwendet) oder wenn eine Palettenanimation verwendet wurde.
Richard Fabian
Wenn ich Sachen in Pygame blite, würde ich die gleiche Art von Rechtecken verwenden, um ein intern scrollendes Symbol / Sprite zu generieren, aber nicht in einen Zwischenpuffer schreiben, es sei denn, es würde mehrmals verwendet werden (wie wenn das gescrollte Symbol das wäre Symbol für ein Mitglied einer Armee von Bildlaufsymbolen)
Richard Fabian
Das Blitting, wenn es Ihre einzige Lösung für das Problem des Bildlaufs ist, wird normalerweise nur optimiert, indem die Anzahl der Kopien über einen Frame verringert wird. Wenn Sie in Silverlight direkt auf den Bildschirm blitzen können, ist es besser, dies zu tun. Wenn Sie die Beschneidungskante des verwendeten beschreibbaren Puffers anpassen können, können Sie ihn zweimal mit verschiedenen Rechtecken rendern, um das gleiche Ergebnis zu erzielen, das ich in meiner Antwort beschrieben habe. Ich weiß jedoch nicht, ob Sie das können, und konnte es daher in meiner Antwort nicht annehmen.
Richard Fabian
Danke, ich habe die Blitting-Methode angewendet. Es scheint nicht viel von einem Performance-Hit zu geben, und das Spiel ist recht einfach, also sollte es ausreichen.
Skoder