Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

22.01.2011, 16:49

SFML Image Copy Problem

Sehr geehrtes Forum, ich habe mal wieder ein Problem :
Ich möchte eine kleine Animation machen, bei der, wenn ein Fenster geschlossen wird der Bildschirm in Stücke gerissen wird, und dann die Fetzen aus dem Sichtbereich fliegen, doch wenn ich ein ScreenShot mache, und dann die Teile ausschneide, sind die Teile leer, sie enthalten gar nicht den Screenshot Teil, warum?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    sf::Image capture = window->Capture(); // Screenshot machen
    // screenParts-Vector füllen mit den einzelnen Teilen
    vector<sf::Image> screenParts;
    sf::Image p;
    for(int x = 0;x<capture.GetWidth();x+=capture.GetWidth()/10)
    {
        for(int y = 0;y<capture.GetHeight();y+=capture.GetHeight()/10)
        {
            p.Create(WIDTH/10,HEIGHT/10,sf::Color::Blue);
            p.Copy(capture,x,y,sf::IntRect(x,y,capture.GetWidth()/10,capture.GetHeight()/10),false);
            screenParts.push_back(p);
        }
    }


M.f.G. Developer-X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

2

22.01.2011, 17:47

Hey,

1. Hast du mal deine Images als Dateien abgespeichert und dort mal reingeschaut?! Insbesondere dein Screenshot?! (capture)

2. Bist du dir sicher, dass der zweite und dritte Parameter bei deinem Copy-Funktionsaufruf stimmt?! Damit setzt du die Position des kopierten Ausschnitts in deinem neuen Image. Sollte also - wenn mich nicht alles täuscht - beides 0 sein. (Ein Blick in die Dokumentation hilft.)

3. Nur ein Hinweis, nicht das du dich nachher über Performance-Probleme beschwerst.
Ein Auszug aus der Dokumentation zur Funktion Copy :

Zitat

This function does a slow pixel copy and should only be used at initialization time
Gruß
SaRu_

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

3

22.01.2011, 17:51

1. Den Screenshot habe ich mir schonmal in ne Datei geschrieben, die einzelnen Images, lasse ich auf dem Bildschirm ausgeben

2. Ich habe die Dokumentation zu dieser Methode schon aufgerufen, doch habe leider nicht verstanden, was ich falsch mache, den destination Point heißt ja zielpunkt, ich verstand da aber den kontext nicht

3. Ja, ich weiß dass das etwas langsam sein soll, aber es ist im Programm kein Problem, da es am Ende verwendet wird, wenns da ne Sekunde braucht ist es ja auch kein Problem, (bei mir dauert das fast nichts^^)

So nun habe ich den zweiten und dritten Parameter auf null gestellt doch :
Jetzt ist jedes der Bilder mit dem Inhalt der unteren rechten ecke des Screenshots versehen, ... :pinch:

Was kann ich denn dagegen machen, die schleife sollte doch super funktionieren, oder?

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

4

22.01.2011, 18:23

Schau dir doch mal an, wie sf::IntRect aussieht. Du gibst zwar richtig die Position (linke, obere Ecke) an, aber dann gibst du die Breite und Höhe des Ausschnitts an. Die Klasse bzw. das Template sf::Rect möchte aber die rechte, untere Ecke des Ausschnitts und nicht Breite und Höhe. ;)

Also so:

C-/C++-Quelltext

1
p.Copy(capture,0,0, sf::IntRect(x,y,x + capture.GetWidth() / 10, y + capture.GetHeight() / 10));


Gruß
SaRu_

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

5

22.01.2011, 18:27

Achso, ok, danke, aber wenn ich das so mache:
Copy(capture,0,0,sf::IntRect(x,y,x+capture.GetWidth()/10,y+capture.GetHeight()/10),false);
Gehts trotzdem nicht wieso?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

6

22.01.2011, 18:51

Was bedeutet "geht trotzdem nicht" ?

Bei mir funktioniert das soweit. Ich hab's mal getestet und einfach all die Ausschnitte aus dem Vektor in Dateien gespeichert. Kannst du ja auch mal probieren um sicherzustellen, dass es halbwegs funktioniert und nicht vielleicht an deiner Methode die Ausschnitte zu rendern liegt bzw irgendwas anderes schief geht.

Gruß
SaRu_

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

7

22.01.2011, 19:14

Ah, ok, es liegt an was anderem
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige

Ähnliche Themen