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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

06.10.2012, 10:56

[C++] Builder Dash Klon - Steine rollen lassen

Hey,
ich bin derzeit dabei ein kleinen Builder Dash Klon zu machen, leider sitze ich seit c.a 1 Tag daran fest.
Bei Builder Dash ist es ja üblich das übereinander liegende Steine zur Seite weg Rollen wenn diese nicht von irgendwelchen anderen Steinen bzw Dreck blockiert werden.

Hier ein kleines Bild zur Verdeutlichung:

(Link)



Mein Code:

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
void Map::collision(sf::Clock &windowClock)
{
    timerGravity += windowClock.getElapsedTime().asSeconds();
    if(timerGravity >= 0.5)
    {
        timerGravity = 0;
        for(std::vector<Stone>::iterator itr1=stones.begin(); itr1!=stones.end(); ++itr1)
        {
            bool allowGravity = true;

            // collision with tiles
            for(std::vector<Tile>::iterator itr2=tiles.begin(); itr2!=tiles.end(); ++itr2)
            {
                if(itr1->getPosition().x == itr2->getPosition().x && itr1->getPosition().y+32 == itr2->getPosition().y)
                {
                    allowGravity = false;
                }
            }

            // collision with stones
            for(std::vector<Stone>::iterator itr2=stones.begin(); itr2!=stones.end(); ++itr2)
            {
                if(itr1->getPosition().x == itr2->getPosition().x && itr1->getPosition().y+32 == itr2->getPosition().y)
                {
                    allowGravity = false;
                    // side rolling - right
                    if(itr1->getPosition().x+32 != itr2->getPosition().x && itr2->getPosition().x+32 != itr2->getPosition().x)
                    {
                        itr1->setPosition(itr1->getPosition().x+32, itr1->getPosition().y);
                    }
                }
            }

            // gravity
            if(allowGravity == true)
            {
                itr1->setPosition(itr1->getPosition().x, itr1->getPosition().y+32);
            }
        }
    }
}


Ich würde mich sehr um eure Hilfe freuen, gruß Raidenkk

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.10.2012, 11:04

Box2D

Oder Du prüfst eben ganz simpel, ob rechts von beiden nichts liegt. Wieso du da iterieren musst, das ist mir allerdings nicht ganz klar. Wieso verwendest Du keine entsprechende Datenstruktur zum Repräsentieren der Felder? Dann hast Du direkten Index-Zugriff auf alle Positionen.

Außerdem meinst Du vermutlich "Boulder Dash", oder?
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]

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

3

06.10.2012, 11:08

Stimmt das ist wohl die einfachste Lösung bei meinem Problem, ich setze mich mal ran danke^^

__Stdcall

Frischling

Beiträge: 18

Beruf: Schüler(Klasse 11)

  • Private Nachricht senden

4

06.10.2012, 14:20

Vielleicht habe ich nicht dein Problem verstanden, doch ich würde für die Felder ein Array aus einer Klasse mit den Variablen Position und ob ein Stein darauf liegt.
Dann sollte die Abfrage doch leichter fallen...

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

5

06.10.2012, 14:41

Klappt ;)

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
void World::collision(sf::Clock &windowClock)
{
    for(int y=0; y!=mapHight; ++y)
    {
        for(int x=0; x!=mapWidth; ++x)
        {
            if(tiles[x+y*mapWidth].getID() == ID::stone)
            {
                tiles[x+y*mapWidth].setTimerGravity(tiles[x+y*mapWidth].getTimerGravity() + windowClock.getElapsedTime().asSeconds());
                if(tiles[x+y*mapWidth].getTimerGravity() >= 0.4)
                {
                    tiles[x+y*mapWidth].setTimerGravity(0);
                    // gravity
                    if(tiles[x+(y+1)*mapWidth].getID() == ID::none)
                    {
                        tiles[x+y*mapWidth].setID(ID::none);
                        tiles[x+(y+1)*mapWidth].setID(ID::stone);
                        tiles[x+y*mapWidth].setAllowGravity(true);
                    }
                    else
                    {
                        tiles[x+y*mapWidth].setAllowGravity(false);
                    }

                    // side rolling
                    if(tiles[x+(y+1)*mapWidth].getID() == ID::stone || tiles[x+(y+1)*mapWidth].getID() == ID::diamond)
                    {
                        int randomSide = ((rand()%Side::right)+Side::left);
                        if (randomSide == Side::left)
                        {
                            if(tiles[(x+1)+y*mapWidth].getID() == ID::none && tiles[(x+1)+(y+1)*mapWidth].getID() == ID::none && tiles[x+y*mapWidth].getAllowGravity() == false)
                            {
                                tiles[x+y*mapWidth].setID(ID::none);
                                tiles[(x+1)+y*mapWidth].setID(ID::stone);
                            }
                            else if(tiles[(x-1)+y*mapWidth].getID() == ID::none && tiles[(x-1)+(y+1)*mapWidth].getID() == ID::none && tiles[x+y*mapWidth].getAllowGravity() == false)
                            {
                                tiles[x+y*mapWidth].setID(ID::none);
                                tiles[(x-1)+y*mapWidth].setID(ID::stone);
                            }
                        }
                        else if(randomSide == Side::right)
                        {
                            if(tiles[(x-1)+y*mapWidth].getID() == ID::none && tiles[(x-1)+(y+1)*mapWidth].getID() == ID::none && tiles[x+y*mapWidth].getAllowGravity() == false)
                            {
                                tiles[x+y*mapWidth].setID(ID::none);
                                tiles[(x-1)+y*mapWidth].setID(ID::stone);
                            }
                            else if(tiles[(x+1)+y*mapWidth].getID() == ID::none && tiles[(x+1)+(y+1)*mapWidth].getID() == ID::none && tiles[x+y*mapWidth].getAllowGravity() == false)
                            {
                                tiles[x+y*mapWidth].setID(ID::none);
                                tiles[(x+1)+y*mapWidth].setID(ID::stone);
                            }
                        }
                    }
                }
            }
            else if(tiles[x+y*mapWidth].getID() == ID::diamond)
            {
                tiles[x+y*mapWidth].setTimerGravity(tiles[x+y*mapWidth].getTimerGravity() + windowClock.getElapsedTime().asSeconds());
                if(tiles[x+y*mapWidth].getTimerGravity() >= 0.4)
                {
                    tiles[x+y*mapWidth].setTimerGravity(0);
                    // gravity
                    if(tiles[x+(y+1)*mapWidth].getID() == ID::none)
                    {
                        tiles[x+y*mapWidth].setID(ID::none);
                        tiles[x+(y+1)*mapWidth].setID(ID::diamond);
                        tiles[x+y*mapWidth].setAllowGravity(true);
                    }
                    else
                    {
                        tiles[x+y*mapWidth].setAllowGravity(false);
                    }
                }
            }
        }
    }
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

06.10.2012, 15:16

Kleiner Tipp: Verwende mehr Methoden. Das Monster da hat 79 Zeilen! Da weiß doch jetzt kein Mensch, was das macht und Du in 2 Wochen auch nicht mehr. Speziell wenn ich solche Kommentare lese wie "Gravity", warum machst Du aus so einem Block nicht gleich eine eigenständige Methode, dann kannst Du Dir die Duplizierung und den Kommentar schenken.
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]

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

7

07.10.2012, 12:06

Danke für den Tipp, ich finde das eine gute Idee und wird umgesetzt.

Sollte ich in meine neuen Methode ne eigene 2D for schleife machen?, oder doch lieber einfach die X, Y werte als Parameter übergeben?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

07.10.2012, 14:20

Das kommt doch darauf an was die Methode genau macht;) Irgendwo musst du natürlich über alle Tiles iterieren. Das sollte aber an einer Stelle im Code ausreichen. Die anderen Funktionen muss dann natürlich je nachdem auch die Koordianten der aktuellen Kachel kennen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

07.10.2012, 19:27

Eigentlich muss er nicht unbedingt über alles drüber iterieren. Nur bei seinem aktuellen Entwurf scheint er das zu müssen. Würde ich allerdings ändern an seiner Stelle. Es gibt eine feste Map und bewegliche Objekte. Das sollte für das Design schon genug gesagt sein.
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]

Werbeanzeige