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

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

11

09.04.2011, 10:47

passt intersects nicht besser? immerhin sinds zwei rechtecke.
unter umständen muss du das rechteck anpassen oder mehrere verwenden wenn eins nicht genau genug ist.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

12

12.04.2011, 21:21

Hi, da es wieder ne recht kleine Frage ist will ich keinen neuen Thread erstellen...
Es geht darum ein Sprite zu drehen.
Situation:
Eine quadratische Box liegt auf dem Boden. Nun drücke ich nach rechts, dann soll sie über die rechte, untere Kante nach rechts kippen.
Das Kippen an sich ist kein Problem, die Festlegung des Centers/ der Position der Box allerdings schon.

Erster Ansatz:

C-/C++-Quelltext

1
2
Box.SetCenter(Box.GetSize().x,Box.GetSize().y);
Box.SetPosition(BoxPosition.x+Box.GetSize().x,BoxPosition.y+Box.GetSize().y);

Ich setze Center auf rechts unten und die Position um die Breite der Box nach rechts und die Höhe der Box nach unten (die Position muss ja verändert werden, da meine Box ja das Center als Ausanspunks nimmt und dieser sich verändert hat).

So. Nun muss ich dann aber min. vier Fälle (habs noch nicht versucht ganz zum laufen zu bringen, da es mir als zu kompliziert erscheit) haben, da sich das Koordinatensystem des Sprites ja mitdreht. D.h. ich kann das neue Center nicht wieder auf Box.GetSize().x und Box.GetSize().y setzen, sondern muss es beim nächsten Schritt (wenn das nächste Mal nach rechts gedrückt wird) auf Box.GetSize().x, 0 setzen etc.

Zweiter Ansatz:
Bei jedem Klick ein neues Recheck um mein Sprite legen und das Center vom Sprite auf die rechte untere Ecke des Rechtecks legen.
Problem: Woher nehme ich (nicht so umständlich) die obere rechte und untere linke Koordinate um das neue Rechteck zu erstellen?


Also an sich würde ich das Problem bestimmt hinbekommen, aber nur mit sehr viel Code und ich habe das Gefühl, dass es einfacher und schöner gehen könnte. Jemand ne Idee?

€dit:
Oder in kürzer (genau das würde nämlich auch weitere Probleme vermeiden):
Kann man die echte(!) Position einer Ecke eines Sprites abfragen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ronschk« (12.04.2011, 22:16)


Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

13

12.04.2011, 23:28

Bei Sprites , die gedreht werden , würde ich BoundingCircles verwenden.
Im SFML Wiki ist darüber ein Beitrag , in dem nicht nur Funktionen für BoundingCircles sind , sondern ach für BoundingBoxes
und PixelKollisionen.

MfG Stazer

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

13.04.2011, 01:21

Was sollen da BoundingCircles helfen? Ich denke er will einfach bestimmte Punkte abfragen. Wenn seine Sprite nach rechts zeigt, weiß er wo der Punkt rechts in der Mitte ist(Zum beispiel Fadenkreuz) wenn er die Sprite jetzt drehen will, möchte er den gleichen Punkt relativ zur Sprite gesehen im globalen Koordinatensystem haben. Dafür reicht einfache Mathematik. Du hast einen Winkel, um den die Sprite gedreht bist. Du hast den Radius vom Kreis und damit kannst du die Koordinaten schon berechnen. Zur Not nochmal einfach googlen;)
„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.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

15

13.04.2011, 08:28

"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?

16

13.04.2011, 17:23

Warum bin ich nur so sehr am Verkacken?
Also hier einer meine vielen vielen Fehlgeschalgenen Versuche:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(BlockPosition.y+Block.GetSize().y>=App.GetHeight()){
                sf::Vector2f Temp_Pos=Block.GetPosition();
                sf::Vector2f CenterPos=Block.TransformToLocal(Temp_Pos+Block.GetSize());
                Block.SetCenter(CenterPos);
                Block.SetPosition(Block.GetPosition()+Block.GetSize());
                for (int i=0; i<15; i++){
                    Block.Rotate(-6);
                    App.Clear(Black);
                    App.Draw(Block);
                    App.Display();
                    Sleep(40);
                }
                CenterPos=Block.TransformToLocal(Temp_Pos);
                Block.SetCenter(CenterPos.x+Block.GetSize().x,CenterPos.y);
                Block.SetPosition(Block.GetCenter());
                App.Clear(Black);
                App.Draw(Block);
                App.Display()
                }


Also Block ist bei Koordinaten x,y (Center liegt oben links). Die Koordinaten speicher ich in Temp_Pos. Dann sage ich das CenterPos die Koordinaten von Temp_Pos + die Größe des Blocks in Lokale Koordinaten umgewandelt werden sollen. Da das Center ja nun rechts unten liegt muss ich die Position des Blockes noch um Block.Size verschieben. Dann wird gedreht. Funktioniert bis hierhin alles, danach geht es schief (der Block wird plötzlich nach oben gebeamt). An sich dachte ich, dass es so funktionieren sollte: CenterPos ist Temp_Pos in lokale Koordinaten umgewandelt, das ist aber noch eine Blocklänge zu weit links, also wird das neue Center auf CenterPos+Blocklänge gesetzt.

Was ist daran falsch?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

17

13.04.2011, 18:06

ich würd spontan die ecke als center nehmen die sich am weiteren unten befindet und sie auf die höhe der geraden setzen auf der du das quadrat "würfeln" willst.
wofür brauchst du es denn? meine lösung eignet sich natürlich nicht für kompliziertere anwendungen und sieht mit sicherheit auch nicht besonders schön aus^^

edit: blödsinn, das center ist ja center für position und rotation. -.- es würde sich sicher eine einfache lösung finden die zwar funktioniert aber nicht schön aussieht. wenn du es schön haben willst müsstest du mit physik arbeiten. damit kenn ich mich aber leider nicht aus.
deshalb die frage wofür du es brauchst. vielleicht würde sich eine physikengine wie box2d lohnen?
"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?

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »NachoMan« (13.04.2011, 18:17)


18

14.04.2011, 14:06

Also an sich will ich nur ein bisschen rumspielen, hab kein konkretes Spiel im Kopf. Also bisher nur ein Quadrat mit dem man springen kann, das hat rumwürfelt usw.
Mit Physik arbeiten... was meinst Du damit? Also physikalische Formeln, wie die Dinger kippen oder irgendwelche speziellen Klassen, die Physik schon vorgeben?
Zu meinem Prob: Ich hätte schon gerne ne schöne Lösung. Ansonstenwürde ich mit halt mehrere If-Anweisungen machen und jeweils testen, welche Ecke gerade wo liegt. Aber das kommt mir halt ein wenig ungeschickt vor.

Werbeanzeige