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

xxendlessxx

Treue Seele

  • »xxendlessxx« ist der Autor dieses Themas

Beiträge: 230

Wohnort: Bad Schussenried

Beruf: Full Stack Developer

  • Private Nachricht senden

1

11.06.2010, 01:08

SFML / Gitternetz das sich hinter einem TowerDefense versteckt

Hallo Leute,

was ich mit dem Gitternetz meine ist folgendes, ihr wisst doch das man in TowerDefense Spielen immer ein Spielfeld hat auf dem ein Gitternetz gezeichnet ist. Und darauf kann man Türme setzen. Nun hab ich mich gefragt wie man heraus bekommt in welches Feld die Maus geklickt hat.

Ich hab das auf die schnelle so gelöst -> http://codepad.org/eXE8vCyG

Mir geht es grade nicht um die ganze defines und auch nicht darum das ich jetzt nichts mit OOP gelöst hab :D mir geht es gerade nur um die Technik selbst.
Kann man das irgendwie besser lösen oder wird das bei einem TowerDefense wirklich so gemacht wie ich es da gemacht hab?

Gruß Michi

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

11.06.2010, 09:38

genau so würd ichs auch machen. wie denn sonst?^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

11.06.2010, 10:52

Ich habe mal ein paar kleine Veränderungen dran vorgenommen, aber vom Prinzip her würde ich es auch so machen.

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
int main()
{
    bool Feld[FELDH][FELDW] = {false};

    sf::RenderWindow W(sf::VideoMode(800,600,8),"TD",sf::Style::Close);
    W.SetFramerateLimit(30);
    sf::Event E;
    const sf::Input& Input = W.GetInput();
    sf::Shape Rect = sf::Shape::Rectangle(0,0,50,50,sf::Color::White,1,sf::Color::Black);

    while(W.IsOpened())
    {
        while(W.GetEvent(E))
        {
            if(E.Type==sf::Event::Closed)
                W.Close();

            if(E.Type==sf::Event::MouseButtonReleased)
            {
                unsigned int X,Y;
                X = Input.GetMouseX()-OFFSETX;
                Y = Input.GetMouseY()-OFFSETY;

                unsigned int FieldX = X/TILEW, FieldY = Y/TILEH;
                Feld[FieldY][FieldX]=!Feld[FieldY][FieldX];
            }
        }

        //Grafik
        //******
        W.Clear();
        for(unsigned int y = 0; y < FELDH; y++)
        {
            for(unsigned int x = 0; x < FELDW; x++)
            {
                if(!Feld[y][x])
                    Rect.SetColor(sf::Color(0,200,200));
                else
                    Rect.SetColor(sf::Color(180,100,255));

                Rect.SetPosition(x*50+50, y*50+50);
                W.Draw(Rect);
            }
        }
        W.Display();
    }
    return 0;
}
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

11.06.2010, 11:04

um die optimierung ging es hier ja nicht...
wenn schon, denn schon richtig.
zum beispiel:

C-/C++-Quelltext

1
2
unsigned int X = (Input.GetMouseX()-OFFSETX)/TILEW, Y = (Input.GetMouseY()-OFFSETY)/TILEH;
                Feld[Y][X]=!Feld[Y][X];
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

11.06.2010, 11:57

Wah sowas geht? Find ich aber nicht so schön.
Klar Wertzuweisung gleich beim Definieren das ist gut :).
Aber in einer Zeile 2 Defintionen+Wertzuweisungen ist ja nicht so feine Art imho.

6

11.06.2010, 12:08

Ja kommt drauf an, ich finde so wie ich es gemacht habe ist es noch in Ordnung, aber ganz ohne Variablen ist auch etwas übertrieben und unübersichtlich finde ich.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

11.06.2010, 13:40

Aber in einer Zeile 2 Defintionen+Wertzuweisungen ist ja nicht so feine Art imho.


spricht ja nichts dagegen das in zwei zeilen aufzuteilen. aber die zwei anderen uint waren ja überflüssig oder nicht?
endless wusste, dass sein (pseudo)code nicht perfekt war und ich bin mir sicher er hätte ihn vor der benutzung auch noch optimiert.
wenn man dann scho vorschläge zur optimierung macht und dafür den ganzen quellcode kopiert und ändert dann sollte man auch wirklich an das optimum gehen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

8

11.06.2010, 14:01

Was ist daran optimal, wenn man etwas nicht mehr auf Anhieb erkennen kann?
Das Wichtigste, was ich verbessert habe ist die Mausabfrage. Das mit den Variablen habe ich gemacht, damit das Ganze nicht so lang ist für so eine Tastenabfrage. Alles in eine Zeile zu quetschen so wie du es gemacht hast ist alles andere als optimal. Wenns danach ginge könnte man auch gleich Leerzeilen, usw. weglassen.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

11.06.2010, 14:05

nochmal für alle die nicht lesen können :D

C-/C++-Quelltext

1
2
3
unsigned int X = (Input.GetMouseX()-OFFSETX)/TILEW;
unsigned int Y = (Input.GetMouseY()-OFFSETY)/TILEH;
                Feld[Y][X]=!Feld[Y][X];
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

10

11.06.2010, 18:58

Solche Kleinigkeiten auf Ebene einer Hochsprache zu optimieren bringt nichts. Zum einen können die Rechnungen nicht in einem Schritt durchgeführt werden. Daher muss es auf jeden Fall ein Zwischenergebniss geben, egal ob dort im Code Variablen sind, oder nicht. Zum anderen entscheidet der Compiler ob und wie Variablen umgesetzt werden. Da ist besser lesbarer Code eindeutig vorzuziehen.

Beim folgenden Beispiel liefert der gcc ab -O2 den gleichen Maschinencode für beide Funktionen. Das rand() ersetzt die zur Laufzeit bestimmten Variablen, da diese sonst wegoptimiert werden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void f1() {
    unsigned int X = (rand()-rand())/rand();
    unsigned int Y = (rand()-rand())/rand();
}

void f2() {
    unsigned int X = rand()-rand();
    unsigned int Y = rand()-rand();

    unsigned int X2 = X / rand();
    unsigned int Y2 = Y / rand();
}

Werbeanzeige