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

18.06.2022, 23:48

SFML C++ Touch Joystick Radius für Bewegung

Hallo zusammen,
ich versuche gerade einen Touch Joystick in sfml/ c++ zu erstellen, also zwei Kreise, ein großer und ein kleinerer der sich in dem großen befindet. Der kleine Kreis ist praktisch der den ich per Finger bewegen kann, der größere soll nur die Grenze darstellen in dem sich der kleinere Bewegen kann. Und genau da fängt das Problem an, dass ich versuche zu lösen. Der kleine, innere Kreis (sf::CircleShape circIn) darf den Radius des gößeren (sf::CircleShape circOut) nicht verlassen dürfen. Hier ist mein bisheriger Code. Ich habe versucht es mit getGlobalBounds() prsktisch wenn der kleinere Kreis den größeren nicht mehr berührt es nicht mehr weiter geht, aber irgendwie ist das Ergebnis unbefriedigend

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
80
81
82
83
84
int main(int argc, char *argv[])
{
    sf::RenderWindow window(sf::VideoMode(1200, 2600), "Hello SFML");
    

    
    // Circle Inside InRect for Origin
    sf::Vector2i circInRectSize( 200, 200);
    sf::Vector2i circInRectPos(200, 200);
    sf::IntRect circInRect( circInRectSize, circInRectPos);
            
    
// Circle Inside Values
sf::Vector2f circInPos(300, 350);
    sf::CircleShape circIn;
    circIn.setRadius(100);
    circIn.setPosition(circInPos);
    circIn.setOrigin(circInRect.width/2, circInRect.height/2);
    
    
    // Circle Out InRect for Origin
    sf::Vector2i circOutRectSize( 400, 400);
    sf::Vector2i circOutRectPos(400, 400);
    sf::IntRect circOutRect( circOutRectSize, circOutRectPos);
    
    
    
    // Circle Out Values
    sf::Vector2f circOutPos(300, 350);
    sf::CircleShape circOut;
    circOut.setRadius(200);
    circOut.setFillColor(sf::Color::Red);
    circOut.setPosition(circInPos);
    circOut.setOrigin(circOutRect.width/2, circOutRect.height/2);
    
    

    sf::RectangleShape recta;
    recta.setSize(sf::Vector2f(300, 300));
    recta.setPosition(500, 1000);
    




    while (window.isOpen())
    {
        
        sf::Event event;
        while (window.pollEvent(event));
        
        sf::Vector2i currPos = sf::Touch::getPosition(0, window);
            sf::Vector2f mapPos = window.mapPixelToCoords(currPos);
            
            
            


        if (sf::Touch::isDown(0) && circIn.getGlobalBounds().intersects(circOut.getGlobalBounds()))
        {
            
            circIn.setPosition(circIn.getPosition().x, mapPos.x);
            circIn.setPosition(circIn.getPosition().y, mapPos.y);
            
            

            }
            else {
                
                circIn.setPosition(circInPos);
                
            }
            
        
    
        window.clear(sf::Color(25, 100, 145));
        window.draw(circOut);
        window.draw(recta);
        window.draw(circIn);
        window.display();

    }
    return 0;
}


Hat jemand ne Ahnung oder eine Idee wie ich für CircIn einen Radius bestimmen kann in der er sich nur bewegen Kann?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

20.06.2022, 07:11

Du willst, dass der kleine Kreis den großen nicht verlassen kann, aber du behandelst die beiden Kreise so, als wären sie Quadrate.
Mal dir das ganze mal auf Papier auf und überlege, wie du anhand der Position der beiden Kreise (Mittelpunkte) und der Radien ermitteln kannst, ob der kleine Kreis außerhalb des großen ist und wenn ja, wie du ihn auf kürzestem Weg wieder zurückbringen kannst.

3

20.06.2022, 10:34

Also der kleine Kreis darf den großen schon überlappen, nur er soll nich über seinen Mittelpunkt hinaus gehen, eigentlich müßte man dem kleinen nur einen Radius geben in dem er sich bewegen kann, der große soll nur die visuelle Grenze darstellen. Aber ich komm nicht drauf, habe in einem Forum gelesen, das man das mit folgender Formel evtl. lösen kann

C-/C++-Quelltext

1
2
x = Origin.x 150 * cos(?);
y = Origin.y + 150 * sin(?);


aber irgendwie steh ich grad auf dem schlauch.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

20.06.2022, 18:32

Eigentlich musst du nur die Distanz zwischen den Mittelpunkten der Kreise bestimmen, und wenn die zu groß ist, den kleinen Kreis so weit in Richtung des Mittelpunkts des großen Kreises bewegen, dass es wieder passt.

5

20.06.2022, 23:20

Die Theorie hab ich verstanden nur ich bekomme das nicht in den Code eingebaut bzw jegliche Versuche scheitern , aber danke für deine Bemühungen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

21.06.2022, 07:26

Du solltest dich mit Vektorrechnung vertraut machen, denn die wirst du immer wieder brauchen.

7

22.06.2022, 12:41

Okay ich habs, weiss jemand wie man den circIn stoppt wenn er die Distanz von 175 verlässt?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(plr.contains(mapPos)){


diff.x =circOutRectPos.x - circIn.getPosition().x;
diff.y =circOutRectPos.y - circIn.getPosition().y;
distance = sqrt(diff.x * diff.x + diff.y * diff.y);

circIn.setPosition(circIn.getPosition().x, mapPos.x);

circIn.setPosition(circIn.getPosition().y, mapPos.y);
 
if(distance >= 175)
????????

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

22.06.2022, 15:57

Eine Idee wäre es den kreis weiter zur Mitte zu schieben. Du kennst die Strecke zwischen den beiden Mittelpunkten. Wenn der Abstand zu groß ist dann verschiebst du den inneren Kreis nach innen, sodass die Strecke zwischen beiden Kreisen gleich deiner maximalen Distanz ist. Hilft dir das soweit weiter?

Guck doch mal hier. Da werden Vektoren erklärt. Das ist eine ziemlich essenzielle Sache wenn du Spiele entwickelst. Auch wenn es irgendwie ohne funktioniert machst du dir das Leben mit Vektoren um einiges leichter.
„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.“

9

22.06.2022, 20:07

Ja du konntest mir ein bisschen weiterhelfen,danke erstmal, ich habe nur probleme das in den code umzuwandeln, ich weiss nicht wie ich das verschieben soll, bzw ich weiss nicht wie ich dem Programm sagen soll das der kleine kreis nicht weitergehen soll, da ich ja auch nicht die move methode anwende. Vektoren muss ich noch mehr lernen :thumbsup:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

23.06.2022, 12:08

Du erkennst ja schon mal dass der Kreis zu weit bewegt wurde. Jetzt berechnest du den Punkt an dem der Mittelpunkt vom Kreis maximal sein darf. Das ist ein Punkt auf der Strecke vom Mittelpunkt des großen Kreises zum Mittelpunkt des kleinen Kreises. Hier kannst du jetzt den Abstand vom Mittelpunkt des großen Kreises berechnen. Das ist eben der Radius vom großen Kreis minus den Radius vom kleinen Kreis. Jetzt hast kennst du die Strecke und den Abstand von dem gesuchten Punkt. Vektorrechnung macht es dir an dieser Stelle relativ einfach. Du kannst aber genau so gut mit Trigonometrie an die Sache ran gehen. Du berechnest den Punkt auf der Strecke der eben genau den passenden Abstand hast und setzt den Mittelpunkt von deinem kleinen Kreis auf diese Position. Das ist alles. Aber guck dir die von mir verlinkte Seite mal an. Vektorrechnung ist nichts wovor man angst haben musst. Das meiste wird dir sicherlich sogar bekannt vorkommen. Wenn du ein paar Dinge davon nicht verstehen solltest kannst du ja gerne hier im Forum fragen.
Viel Erfolg.
„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.“

Werbeanzeige