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

Nicorotom

Frischling

  • »Nicorotom« ist der Autor dieses Themas

Beiträge: 38

Wohnort: 127.0.0.1

Beruf: Schüler

  • Private Nachricht senden

1

25.05.2010, 08:19

Maus-Event

Tag Leute,
ich bin gerade dabei, ein 2d Hack n' Slay Spiel zu programmieren.
Nun habe ich mein Hauptmenü so erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
//Menü erstellen
    sf::Image Image;
    if(!Image.LoadFromFile("background.jpg"))
    {
        return 1;
    }
    sf::Sprite Sprite(Image);


Und nun soll die Schrift da rein(Neues Spiel usw.):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
//Schrift erstellen
    sf::Font Font;
    if(!Font.LoadFromFile("UnrealT.ttf"))
    {
        return 1;
    }
    sf::String String("Neues Spiel",Font,50);
    String.SetColor(sf::Color::Black);
    String.SetStyle(1<<1);


Nun wollte ich in meine Spiele-Schleife ein Event reinmachen, dass wenn man auf den Text klickt(in dem Fall "Neues Spiel"), das er dann irgendwas macht(das kann ich ja dann selber einbauen), also mir geht es momentan nur um das raufklicken.

Ich weiß zwar wie das mit dem klicken geht:

C-/C++-Quelltext

1
2
3
4
5
6
7
if(Event.Type==sf::Event::MouseButtonPressed)
            {
                if(Event.MouseButton.Button==sf::Mouse::Left)
                {
                    
                }
            }


Aber wie gebe ich nun ein Ziel an, worauf man geklickt hat.

Meine derzeitige Schleife:

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
//Programm-Schleife
    while(Window.IsOpened())
    {
        sf::Event Event;
        while(Window.GetEvent(Event))
        {
            if(Event.Type==sf::Event::Closed)
            {
                Window.Close();
            }

            if(Event.Type==sf::Event::KeyPressed)
            {
                if(Event.Key.Code==sf::Key::Escape)
                {
                    Window.Close();
                }
            }

            if(Event.Type==sf::Event::MouseButtonPressed)
            {
                if(Event.MouseButton.Button==sf::Mouse::Left)
                {
                    
                }
            }
        }

        Window.Clear(sf::Color::Black);
        Window.Draw(Sprite);
        Window.Draw(String);
        Window.Display();
    }


Ich hoffe ihr könnt mir weiterhelfen ;)

Gruß,
Nicorotom

2

25.05.2010, 09:20

Stichwort Kollisionserkennung. Hol dir die Mausposition und prüfe, ob sie im Bereich des Textes ist, wenn ja, wird halt der entsprechende Code ausgeführt.
Alternativ kannst du aber auch auf andere GUI's zurückgreifen, die es dir einfacher machen. (CEGUI, usw.) Wobei du damit als Anfänger sicherlich noch etwas Probleme bekommen könntest.
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

Nicorotom

Frischling

  • »Nicorotom« ist der Autor dieses Themas

Beiträge: 38

Wohnort: 127.0.0.1

Beruf: Schüler

  • Private Nachricht senden

3

25.05.2010, 09:23

Muss ich das dann direkt mit ihn die Schleife packen oder wann muss ich die Position prüfen?

4

25.05.2010, 09:31

Naja ich denke es reicht, wenn du es prüfst, wenn eine Maustaste gedrückt wurde. :P
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

Nicorotom

Frischling

  • »Nicorotom« ist der Autor dieses Themas

Beiträge: 38

Wohnort: 127.0.0.1

Beruf: Schüler

  • Private Nachricht senden

5

25.05.2010, 09:42

Ja, die Funktion ist, wie man sieht in der Schleife enthalten ;)
Hm, unter welche Klasse finde ich denn die Mausposition abfrage?
Habe sie noch nicht gefunden.

6

25.05.2010, 10:01

Hast du mal in die Dokumentation geschaut?? Oo
Unter Input gibt es 2 Funktionen für die Mausposition und es gibt noch ein Event (sf::Event::MouseMoveEvent) mit der du die Mausposition abfragen kannst.
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

Nicorotom

Frischling

  • »Nicorotom« ist der Autor dieses Themas

Beiträge: 38

Wohnort: 127.0.0.1

Beruf: Schüler

  • Private Nachricht senden

7

25.05.2010, 10:15

Ich hab gerade mal etwas kleines probiert, aber das funktioniert nicht so ganz:

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
//Programm-Schleife
    while(Window.IsOpened())
    {
        sf::Event Event;
        while(Window.GetEvent(Event))
        {
            if(Event.Type==sf::Event::Closed)
            {
                Window.Close();
            }

            if(Event.Type==sf::Event::KeyPressed)
            {
                if(Event.Key.Code==sf::Key::Escape)
                {
                    Window.Close();
                }
            }

            if(sf::Input::IsMouseButtonDown(sf::Mouse::Button::Left))//HIER
            {
                Window.Close();
            }//BIS HIER
        }

        Window.Clear(sf::Color::Black);
        Window.Draw(Sprite);
        Window.Draw(String);
        Window.Display();
    }


Folgende Fehler:

C-/C++-Quelltext

1
2
3
1>c:\users\nowakowski\documents\visual studio 2008\projects\spiele programmierung\erstes2dspiel\erstes2dspiel\erstes2dspiel.h(59) : warning C4482: Nicht dem Standard entsprechende Erweiterung: Enumeration "sf::Mouse::Button" wird im qualifizierten Namen verwendet.
1>c:\users\nowakowski\documents\visual studio 2008\projects\spiele programmierung\erstes2dspiel\erstes2dspiel\erstes2dspiel.h(59) : error C2352: 'sf::Input::IsMouseButtonDown': Unzulässiger Aufruf einer nicht statischen Memberfunktion
1>        e:\spiele programmierungs software\sfml\include\sfml\window\input.hpp(72): Siehe Deklaration von 'sf::Input::IsMouseButtonDown'

8

25.05.2010, 10:40

Du brauchst ja auch das Input Objekt...

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
    const sf::Input& input = Window.GetInput();

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

            if(Event.Type==sf::Event::KeyPressed)
            {
                if(Event.Key.Code==sf::Key::Escape)
                {
                    Window.Close();
                }
            }
        }

        if(input.IsMouseButtonDown(sf::Mouse::Left))
        {
            int mouseX = input.GetMouseX(); // Die Variablen müssen natürlich woanders hin
            int mouseY = input.GetMouseY();
            Window.Close();
        }

        Window.Clear(sf::Color::Black);
        Window.Display();
    }
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

Nicorotom

Frischling

  • »Nicorotom« ist der Autor dieses Themas

Beiträge: 38

Wohnort: 127.0.0.1

Beruf: Schüler

  • Private Nachricht senden

9

25.05.2010, 10:46

Funktioniert ;)

C-/C++-Quelltext

1
const sf::Input& input = Window.GetInput();
Was sagt dieser Code aus/was bewirkt er?

Müssen es bei den Positionen nicht float's sein?

10

25.05.2010, 11:07

Zur 1. Frage: Dort bekommst du eine konstante Referenz des Input Objektes. Es darf nicht verändert oder kopiert werden, deshalb konstant und als Referenz.
Zur 2. Frage: Das ist generell richtig, allerdings liefert SFML die Werte als int zurück. Da die Textposition aber floats sind, kannst du natürlich auch die Rückgabewerte der beiden Mausfunktionen in floats konvertieren. Hatte ich vorhin nur nicht nachgeschaut. :P Wobei es bei einer solch einfachen Kollisionserkennung eigentlich auch Integer ausreichen würden.
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

Werbeanzeige