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

dev_null

Frischling

  • »dev_null« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Augsburg

Beruf: Application Developer

  • Private Nachricht senden

1

16.05.2009, 20:17

SFML - Pixel zeichnen und Bewegen

Hallo Gemeinde,

ich beschäftige mich gerade mit SFML, jedoch bin ich da auf ein paar kleinigkeiten gestoßen.

Ich möchte eigentlich nur ein paar Pixesl zeichnen und diese dann bewegen. Hier habe ich mal einen Code-Entwurf, dieser funktioniert, jedoch weiß ich nicht ob meine vorgehensweise so richtig ist, desshalb meine frage ob es einen anderen Ansatz gibt oder ob dieser so ok ist.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow app(sf::VideoMode(1000, 1000), "SFML Shapes");

    for (int i=0; i<1000; i++) {
        app.Clear();
        app.Draw(sf::Shape::Circle(i, i, 1, sf::Color::White));
        app.Display();
    }

    return 0;
}


Ich hoffe mir kann jemand einen Tipp geben.

so long
dev_null
Think free!

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

16.05.2009, 20:32

Wenn du die Pixel bewegen willst solltest du sie in eine Liste o.ä. speichern. ;) Außerdem solltest du nach dem Erstellen der Pixel in eine Spielschleife gehen.

Gruß
Marius

dev_null

Frischling

  • »dev_null« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Augsburg

Beruf: Application Developer

  • Private Nachricht senden

3

16.05.2009, 20:43

Ja, sowas habe ich mir auch gedacht, aber da weiß ich das nicht, wie ich in einer spielschleife die Pixel bewegen kann. Desshalb habe ich das so komisch gemacht. Hast du da eventuell einen Anhaltspunkt?

Wenn ich alles innerhalb einer Game-Loop mache sprich sowas hier:

C-/C++-Quelltext

1
2
3
4
while (App.IsOpened())
{
    // Bewege irgendwas

}


Dann müssten ja die Bewegungen zum Zeitpunkt des Programmstarts festlstehen, oder nicht? Kann sein das ich total auf dem Schlauch stehe, daher meine Frage oben.

Danke

so long
dev_null
Think free!

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

4

16.05.2009, 21:03

Naja du kannst die Bewegung ja zB abhängig von Benutzereingaben machen. Hast du schon mal die Tutorials auf der SFML Seite durchgearbeitet?

dev_null

Frischling

  • »dev_null« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Augsburg

Beruf: Application Developer

  • Private Nachricht senden

5

20.05.2009, 19:34

Hallo Gemeinde,

ich habe jetzt mir noch einmal die SFML Docu angeschaut, und was ausprobiert.

C-/C++-Quelltext

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
#include <SFML/Graphics.hpp>
#include <iostream>
#include <windows.h>

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600), "SFML Shapes");

    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }
        sf::Shape tmpShape = sf::Shape::Circle(0, 0, 1, sf::Color::White);
        App.Display();
        for (int i=0; i<200; i++) {
            tmpShape.SetPosition(i, i);
            App.Draw(tmpShape);
            Sleep(1000);
        }
    }

    return EXIT_SUCCESS;
}


Laut code müsste sich jede Sekunde die Linie um 1px verlängen, das macht es aber nicht. Es passiert rein garnichts. Wenn ich das Sleep raus nehmen, dann Baut sich das fenster erst auf wenn die for-schleife beendet ist, sprich is sehe keine Bewegung, die Linie ist dann einfach da und das wars. Kann mir jemand erklären warum das so ist? Ich will eigentlich nur was ganz einfaches haben, ein Pixel (Punkt) der sich bewegt nichts anderes keine komplexen 3D oder 2D grafiken. Hat da jemand eventuell noch ein Tipp für mich?

so long
Think free!

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

6

20.05.2009, 20:17

App.Draw fügt nur Elemente zu den "zu Zeichnenden" hinzu. Das eigentliche Zeichnen kommt erst mit App.Display.

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

7

20.05.2009, 20:32

hallo, laut dem sfml tutorial geht das sogar einfacher. Alle shape objekte lassen sich ueber die Methode ::Move(x,y) bewegen...

Zitat


Like every drawable object in SFML, shape objects inherit the common functions to set their position, rotation, scale, color and blending mode.

Polygon.SetColor(sf::Color(255, 255, 255, 200));
Polygon.Move(300, 300);
Polygon.Scale(3, 2);
Polygon.Rotate(45);

Finally, drawing a shape is also like any other drawable object in SFML :

App.Draw(Polygon);

dev_null

Frischling

  • »dev_null« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Augsburg

Beruf: Application Developer

  • Private Nachricht senden

8

20.05.2009, 21:23

Hi, danke für den Tipp jetzt habe ich nur noch kleines Problem, und zwar die Linie die Zittert die ganze zeit, also es ist kein gerader strich, sondert die zittert ganz komisch, kann das nicht richtig erklären. Wenn die Schleife fertig, sieht das so aus als wenn sich der letzte Punkt immer zurück und wieder forwärts bewegt. Das ganze sieht auch extrem verpixelt aus. Habe das jetzt so gemacht:

C-/C++-Quelltext

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
#include <SFML/Graphics.hpp>
#include <iostream>
#include <windows.h>

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600), "SFML Shapes");

    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }
        sf::Shape tmpShape = sf::Shape::Circle(0, 0, 1, sf::Color::White);
        for (int i=0; i<200; i++) {
            tmpShape.SetPosition(i, i);
            App.Draw(tmpShape);
            App.Display();
            Sleep(25);
        }
    }
    return EXIT_SUCCESS;
}


Kann da jemand was erkennen, warum das so komisch ist? Oder ist mein code korrekt und es ist einfach so?

Hier ist mal ein screenshot:

(Link)

Ich bin über jeden Vorschlag dankbar.
Think free!

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

9

20.05.2009, 21:48

Was genau versuchst du mit so einer for-Schleife innerhalb der eigentlichen Spielschleife zubezwecken? :)

Ich würde dir empfehlen erst noch ein paar Tutorials durch zu arbeiten bevor du an was eigenem arbeitest. Das wird dir helfen ein besseres Gefühl für solche Dinge zu bekommen.

physX

Treue Seele

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

10

20.05.2009, 22:02

hallo, dein Strich zittert, weil du die For-schleife fuer jeden Fame komplett durchläufst.
probier mal stattdessen:
oben in der main

C-/C++-Quelltext

1
2
float fPos;
sf::Shape::Circle(0,0,1,sf::Color::White);

und dann da wo die for-schleife war:

C-/C++-Quelltext

1
2
3
4
5
        fpos+=25.0f*App.GetFrameTime(); //(oder welcher wert auch immer)

        tmpShape.SetPosition(fPos,fPos);
    App.Draw(tmpShape);
    App.Display();
    // Sleep(25); das kannst du dann weglassen



gruss
manfred

Zitat von »"dev_null"«

Hi, danke für den Tipp jetzt habe ich nur noch kleines Problem, und zwar die Linie die Zittert die ganze zeit, also es ist kein gerader strich, sondert die zittert ganz komisch, kann das nicht richtig erklären. Wenn die Schleife fertig, sieht das so aus als wenn sich der letzte Punkt immer zurück und wieder forwärts bewegt. Das ganze sieht auch extrem verpixelt aus. Habe das jetzt so gemacht:

C-/C++-Quelltext

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
#include <SFML/Graphics.hpp>
#include <iostream>
#include <windows.h>

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600), "SFML Shapes");

    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }
        sf::Shape tmpShape = sf::Shape::Circle(0, 0, 1, sf::Color::White);
        for (int i=0; i<200; i++) {
            tmpShape.SetPosition(i, i);
            App.Draw(tmpShape);
            App.Display();
            Sleep(25);
        }
    }
    return EXIT_SUCCESS;
}


Kann da jemand was erkennen, warum das so komisch ist? Oder ist mein code korrekt und es ist einfach so?

Hier ist mal ein screenshot:

(Link)

Ich bin über jeden Vorschlag dankbar.

Werbeanzeige