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

11

25.05.2010, 11:11

Wenn man das in float schreibt, dann kommen 2 Warnungen:

C-/C++-Quelltext

1
2
1>c:\users\nowakowski\documents\visual studio 2008\projects\spiele programmierung\erstes2dspiel\erstes2dspiel\erstes2dspiel.h(59) : warning C4244: 'Initialisierung': Konvertierung von 'int' in 'float', möglicher Datenverlust
1>c:\users\nowakowski\documents\visual studio 2008\projects\spiele programmierung\erstes2dspiel\erstes2dspiel\erstes2dspiel.h(60) : warning C4244: 'Initialisierung': Konvertierung von 'int' in 'float', möglicher Datenverlust


Und wie Frage ich nun die Textposition ab?
Es gibt zwar

C-/C++-Quelltext

1
String.GetPosition();
, allerdings gibt es das nicht extra unterteilt in X und in Y.
Deshalb weiß ich nicht, wie ich das dann in Variablen packen kann.

Danach muss ich doch generell nur so machen:

C-/C++-Quelltext

1
2
3
4
if(x&&y==xm&&ym)
{
blabla
}
, oder?

12

25.05.2010, 11:28

Naja du musst die Werte der beiden Mauspositionsfunktionen wie gesagt konvertieren:

C-/C++-Quelltext

1
2
            float mouseX = static_cast<float>(input.GetMouseX());
            float mouseY = static_cast<float>(input.GetMouseY());

und String.GetPosition() liefert einen Vektor zurück. Guck doch mal in die Dokumentation, dann siehst du das alles auch.

C-/C++-Quelltext

1
2
3
            sf::Vector2f positon = String.GetPosition();

            if(mouseX >= position.x) // ...

Das Problem ist jetzt noch, dass du die Breite des Strings brauchst, deshalb musst du dir das Rect des Strings zurückliefern lassen, da die Klasse leider keine
GetWidth() Funktion o.ä. hat.

C-/C++-Quelltext

1
FloatRect  GetRect () const  // Aus der Dokumentation

Vielleicht schaffst du es ja, wenn du dir mal FloatRect in der Dokumentation anguckst.

EDIT: Ach wegen der Kollisionsabfrage, das ist nicht ganz richtig, du musst auch überprüfen, ob der Mauszeiger auf der anderen Seite des Strings auf dem String ist oder schon drüber hinaus, deshalb brauchst du ja auch die Breite und Höhe des Strings, wie oben erwähnt.
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

13

25.05.2010, 11:32

Jetzt verstehe ich überhaupt nichtsmehr :-o
Gibt es keinen leichten Weg?
Kann man nicht einfach irgendwie ein Button erstellen oder was weiß ich :-/
Ich blicke bei deinem Code überhaupt nichtmehr durch.

//EDIT:
Ich habe es nun so:

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
//Programm-Schleife
    while(Window.IsOpened())
    {
        sf::Event Event;
        const sf::Input& Input=Window.GetInput();
        sf::Vector2f stringposition=String.GetPosition();
        while(Window.GetEvent(Event))
        {
            if(Event.Type==sf::Event::Closed)
            {
                Window.Close();
            }

            if(Input.IsKeyDown(sf::Key::Escape))
            {
                Window.Close();
            }

            if(Input.IsMouseButtonDown(sf::Mouse::Left))
            {
                float mousex=static_cast<float>(Input.GetMouseX());
                float mousey=static_cast<float>(Input.GetMouseY());
                if(mousex==stringposition.x && mousey==stringposition.y)
                {
                    Window.Close();
                }
            }
        }

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


Nun kann ich trotzdem wild umherklicken und den ganzen Text anklicken, aber er schließt das Fenster einfach nicht :-/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nicorotom« (25.05.2010, 11:50)


14

25.05.2010, 11:49

So schwer ist es gar nicht :rolleyes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// Wie du die Mausposition bekommst, weißt du ja jetzt, hoffe du hast zumindest die Sache mit dem casten verstanden :P
// So fragst du die Stringposition inklusive der Breite ab:
sf::FloatRect stringRect = String.GetRect();

// Kollisionsabfrage:
// (Left = normale Position des Strings; Right = Position am Ende des Strings)
// (Top = normale Position des Strings; Bottom = Position am unteren Ende des Strings)
if(mouseX >= stringRect.Left && mouseX <= stringRect.Right &&
   mouseY >= stringRect.Top  && mouseY <= stringRect.Bottom)
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

15

25.05.2010, 11:51

Nee, gerade mit dem static_cast verstehe ich nicht ^-^
Den Rest verstehe ich, wie du das meinst.

Ich habe es nun so:

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
//Programm-Schleife
while(Window.IsOpened())
{
sf::Event Event;
const sf::Input& Input=Window.GetInput();
sf::Vector2f stringposition=String.GetPosition();
while(Window.GetEvent(Event))
{
if(Event.Type==sf::Event::Closed)
{
Window.Close();
}

if(Input.IsKeyDown(sf::Key::Escape))
{
Window.Close();
}

if(Input.IsMouseButtonDown(sf::Mouse::Left))
{
float mousex=static_cast<float>(Input.GetMouseX());
float mousey=static_cast<float>(Input.GetMouseY());
if(mousex==stringposition.x && mousey==stringposition.y)
{
Window.Close();
}
}
}

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


Nun kann ich trotzdem wild umherklicken und den ganzen Text anklicken, aber er schließt das Fenster einfach nicht :-/

//EDIT:
Also brauche ich das mit dem Vektor garnicht mehr oder wie?

16

25.05.2010, 12:02

Genau, das mit dem Vektor kannst du weglassen. Ich habe dir die Lösung bereits geposted. Vielleicht solltest du nochmal versuchen den Sinn dahinter zu verstehen. Wäre von Vorteil.
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

ZIR

Frischling

  • Private Nachricht senden

17

25.05.2010, 12:04

Zitat

if(mousex==stringposition.x && mousey==stringposition.y)
Das ist keine richtige Kollisionserkennung. Du überprüfst nur ob der Cursor direkt auf dem x und dem y Punkt ist, dass heißt das würde nur bei einem einzigen Punkt auslösen. Du musst mit der Funktion getRect dir auch noch die Höhe und die Breite der Schrift holen und das dann damit machen, so wie es in dem Code von -insane- steht.

Nicorotom

Frischling

  • »Nicorotom« ist der Autor dieses Themas

Beiträge: 38

Wohnort: 127.0.0.1

Beruf: Schüler

  • Private Nachricht senden

18

25.05.2010, 12:08

Juhu danke insane ;)
Funktioniert nun prima :D

Noch 3 Fragen habe ich:
1. Wie kann ich die String Position genau(am besten in Prozent) bestimmen?
Ich will ja schließlich die Menü Anzeigen in der Mitte haben und nicht oben links :D
Ich hatte es versucht indem ich von der X und der Y Achse die Hälfte nehme, nur dann steht es natürlich nicht in der Mitte wegen der Breite.

//EDIT:
Selber gelöst:

C-/C++-Quelltext

1
2
3
sf::FloatRect Stringwidth=String.GetRect();
float Stringwidth2=Stringwidth.GetWidth();
String.SetPosition(1024/2-Stringwidth2/2,768/2);


2. Wieso klappt es nur wenn ich das so mache:

C-/C++-Quelltext

1
MouseX>=StringPosition.Left && MouseX<=StringPosition.Right && MouseY>=StringPosition.Top && MouseY<=StringPosition.Bottom
und nicht

C-/C++-Quelltext

1
MouseX>=StringPosition.Left && MouseX>=StringPosition.Right && MouseY>=StringPosition.Top && MouseY>=StringPosition.Bottom
?

3. Woher kommt dieser Error:

C-/C++-Quelltext

1
1>LINK : C:\Users\Nowakowski\Documents\Visual Studio 2008\Projects\Spiele Programmierung\Erstes2dSpiel\Debug\Erstes2dSpiel.exe wurde nicht gefunden oder beim letzten inkrementellen Linkvorgang nicht erstellt; vollständiger Link wird durchgeführt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Nicorotom« (25.05.2010, 12:26)


19

25.05.2010, 12:27

Denk doch mal darüber nach, warum das so nicht geht. Wenn du das herausfindest, kannst du dir auch sicher sein, dass du das Thema auch wirklich verstanden hast, deshalb werde ich dir jetzt keine Lösung dazu geben. Als Tipp kann ich dir nur empfehlen nochmal meinen Beitrag anzugucken:

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
 // Wie du die Mausposition bekommst, weißt du ja jetzt, hoffe du hast zumindest die Sache mit dem casten verstanden :P
// So fragst du die Stringposition inklusive der Breite ab:
sf::FloatRect stringRect = String.GetRect();

// Kollisionsabfrage:
// (Left = normale Position des Strings; Right = Position am Ende des Strings)
// (Top = normale Position des Strings; Bottom = Position am unteren Ende des Strings)
if(mouseX >= stringRect.Left && mouseX <= stringRect.Right &&
   mouseY >= stringRect.Top  && mouseY <= stringRect.Bottom)
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

ZIR

Frischling

  • Private Nachricht senden

20

25.05.2010, 12:28

Zitat

MouseX>=StringPosition.Left && MouseX>=StringPosition.Right && MouseY>=StringPosition.Top && MouseY>=StringPosition.Bottom
Stell dir das einfach mal vor.
Bei einer Kollision muß XWert des Cursor größer sein als das linke Ende aber kleiner sein als das rechte Ende damit der Cursor in dem Rect drin ist.
Bei dieser Version aber müßte der XWert größer als die linke Kante und größer als die Rechte Kante sein, dann würde der Cursor aber nicht auf dem Button drauf sein sodnernd daneben.
Bei dem YWert ist das ebenfalls so.
Nehmen wir an das dies ein Button ist:

| |
*
Und der Stern ist der Cursor, dann würde das so wie du es dort siehst auslösen.

Werbeanzeige