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

1

30.12.2018, 19:54

Vector in SFML

Hallo zusammen,
ich habe mich mittlerweile mal an einfache graphische Experimente mit SFML gewagt.
Aktuell versuche ich Snake zu programmieren.
Leider scheitere ich irgendwie an der aktualisierung der einzelnen Elemente der Schlange / des Vektors.
Prinzipiell funktioniert alles(Kollisionsabfrage, Anhängen neuer Elemente etc.), nur die Nachführung der Vektorelemente bekomme ich nicht hin.

Habt ihr einen Tipp für mich?

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void Game::update_game()
{
    // Neues Item zum aufsammeln generieren
    if (ptrItem == NULL)
    {
        ptrItem = new Food;
    }


    // Spieler um increment bewegen
    Head.set_last_position();   // Bisherige Position speichern
    increment_Spieler = window.get_increment_Spieler();
    Head.set_new_position(sf::Vector2f(Head.get_position().x + increment_Spieler.x, Head.get_position().y + increment_Spieler.y));


    if (Body.size() == 1)
    {
        Body[0].set_last_position();
        Body[0].set_new_position(Head.get_last_position());
    }

    if (Body.size() >= 2)
    {
        for(int i = 1; i < Body.size(); i++)
        {
            Body[i].set_last_position();
            Body[i].set_new_position(Body[i-1].get_last_position());
        }
    }

    // Testen ob Item eingesammelt, wenn ja Items neue Position zuweisen und Schlangenkörper verlängern
    if (Head.segment.getGlobalBounds().intersects(ptrItem->target.getGlobalBounds()))
    {
        ptrItem->set_new_target();

        if (Body.size() == 0)
        {
            Body.push_back(Snakesegment(Head.get_last_position()));
        }

        if (Body.size() >= 1)   // Wenn mindestens ein Element vorhanden 
        {
            Body.push_back(Snakesegment(Body[Body.size()-1].get_last_position()));  // Neues Element hinten an vorherige Position des bis dahin letzten Elements hängen
        }
    }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

30.12.2018, 20:06

Mein Tipp: F9, F5, F10, F11 und mit der Maus über die Variablen hovern. Sprich: Debuggen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

30.12.2018, 20:17

Hi, thanks for your reply.


Debugger shows me this:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
align 16
XmmCopySmallLoop:
        movdqu      xmm0, xmmword ptr [esi]     [color=#ff0000]Here is an exception[/color]
        movdqu      xmm1, xmmword ptr [esi + 10h]
        movdqu      xmmword ptr [edi], xmm0
        movdqu      xmmword ptr [edi + 10h], xmm1
        lea         esi, [esi + 20h]
        lea         edi, [edi + 20h]
        dec         edx
        jne         XmmCopySmallLoop


And to be frank, i got absolutly no idea what it is...


Edit: Warum schreibe ich eigentlich in englisch? ^^

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Herold« (30.12.2018, 20:24)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

30.12.2018, 20:54

Speicherzugriffsfehler. Tja. Im Debugger gibt es einen sogenannten Callstack. Das ist eine Liste, welche Funktion welche aufgerufen hat, immer tiefer geschachtelt, bis Du an die Stelle gekommen bist, an der es scherbelt. Klick dort von oben nach unten die erste Funktion an, die Du selbst geschrieben hast.

Und immer Debug-Build debuggen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

30.12.2018, 22:55

Ich habe das ganze mal etwas vereinfacht:


C-/C++-Quelltext

1
2
3
        Tail.set_new_position(sf::Vector2f(Head.get_position().x, Head.get_position().y));
    increment_Spieler = window.get_increment_Spieler();
    Head.set_new_position(sf::Vector2f(Head.get_position().x + increment_Spieler.x, Head.get_position().y + increment_Spieler.y));



Tail soll die aktuelle Position von Head zugewiesen werden,
Danach wird Head um increment weiterbewegt. Dies funktioniert für sich einwandfrei.
Wenn die beiden Objekte jetzt gerendert/dargestellt werden, müsste Head sich weiterbewegt haben als Tail.
Allerdings sind die Objekte von der Position deckungsgleich(Sind einfache Vierecke, habe sie eingefärbt. Tail überlagert Head zu 100%)

Bin ratlos :pillepalle:

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

6

31.12.2018, 16:53

Enthalten die increment-Variablen die Werte, die du haben willst? Überleg mal was passiert wenn beide 0 sind (kann das passieren?).

Denke auch nochmal die Logik der beiden If-Verzweigungen in Z.16 und Z.22 durch.

7

01.01.2019, 10:54

Enthalten die increment-Variablen die Werte, die du haben willst? Überleg mal was passiert wenn beide 0 sind (kann das passieren?).

Denke auch nochmal die Logik der beiden If-Verzweigungen in Z.16 und Z.22 durch.

Enthalten die increment-Variablen die Werte, die du haben willst? Überleg mal was passiert wenn beide 0 sind (kann das passieren?).

Denke auch nochmal die Logik der beiden If-Verzweigungen in Z.16 und Z.22 durch.



Hi, danke für deine Antwort.

Es war tatsächlich ein Problem mit der increment_variable. Auch wenn ich noch nicht ganz verstehe warum.
Ich habe diese jetzt umgangen indem ich bei jeder Wiederholung einfach feste Werte aufschlage. Es funktioniert jetzt einwandfrei.
:thumbsup:

Werbeanzeige