AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Andorra 2d Billardspiel in 2d

Andorra 2d Billardspiel in 2d

Ein Thema von Noobmaster · begonnen am 27. Jul 2010 · letzter Beitrag vom 8. Jul 2011
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#1

Andorra 2d Billardspiel in 2d

  Alt 27. Jul 2010, 17:13
Hallo Leute!
Habe mich in der letzten Zeit ausgiebiger damit beschäftigt, mein eigenes 2d-Billardspiel zu kriieren. Ein kleines Problem, das ich momentan noch habe, ist die Richtung, in der die Kugel laufen soll.
Zum besseren Verständnis: Ich habe einen Geisterball, der die Position des Mauszeigers einnimmt. Wird jetzt die linke Maustaste geklickt, soll der die Weiße in Richtung des Geisterballs laufen. Mein Lösungsansatz war das ganze mit Hilfe der Steigung zu machen, also m=deltaY/deltaX. Allerdings ist die l#Lösung nicht zufreidenstellend, da zum Beispiel Werte wie 117/118 herauskommen können und ich die Kugel ja nicht um 117 und 118 so schnell bewegen lassen kann. Geplant ist nämlich außerdem, dass die Kugel immer nur so weit läuft, wie die Stoßstärke es erlaubt, also bei 50Stoßstärke soll sie nur 50Pixel laufen.
Ich hoffe, dass ihr mein Problem versteht und mir helfen könnt. Ich benutze Andorra2d als Hilfe.
Danke schonmal!
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: Andorra 2d Billardspiel in 2d

  Alt 27. Jul 2010, 18:53
Dazu kommt, dass Du bei deltax=0 rausfliegst. Wie wäre es mit Winkelkoordinaten (grad)?
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Andorra 2d Billardspiel in 2d

  Alt 27. Jul 2010, 21:57
Nur mal als Denkanstoß:
Warum benützt du nicht Vektoren? Hierzu müsstest du zumindest die Grundrechenfunktionen von Vektoren wissen.

Beispielscode:
Delphi-Quellcode:
type
  TPointF = record
    X, Y: Single;
  end;

{...}

var
  weißeKugel: TPointF;
  weißeKugelGEIST: TPointF;

  weißeKugelRichtungsVek: TPointF;
  weißeKugelGeschwindigkeit: Single;

{...}

function PointF(const cX, cY: Single): TPointF;
begin
  with Result do
  begin
    X := cX;
    Y := cY;
  end;
end;

{...}

weißeKugelRichtungsVek := PointF( weißeKugelGEIST.X - weißeKugel.X, weißeKugelGeist.Y - weißeKugel.Y );
weißeKugelGeschwindigkeit := SQRT( SQR(weißeKugelRichtungsVek.X) + SQR(weißeKugelRichtungsVek.Y) );
weißeKugelRichtungsVek.X := weißeKugelRichtungsVek.X / weißeKugelGeschwindigkeit;
weißeKugelRichtungsVek.Y := weißeKugelRichtungsVek.Y / weißeKugelGeschwindigkeit;

{
- Erläuterung:

  weißeKugelRichtungsVek ist ein auf 1 normierter Vektor (dh. die Länge des Vektors (Pfeiles) beträgt 1)
  weißeKugelGeschwindigkeit ist die Länge des Vektors (also die Länge des Pfeiles)

- Hinweis:

  Wenn du jetzt zB. die Position des Balles ändern willst, müsstest du halt ca. so vorangehen:
    weißeKugel := PointF( weißeKugel.X + weißeKugelRichtungsVek.X * weißeKugelGeschwindigkeit, weißeKugel.Y + weißeKugelRichtungsVek.Y * weißeKugelGeschwindigkeit );
}
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Andorra 2d Billardspiel in 2d

  Alt 27. Jul 2010, 22:08
Zudem ist 2D ein Sonderfall von 3D (alles auf einer Ebene). So kannst du spezielle Funktionen von DX/OpenGL verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Andorra 2d Billardspiel in 2d

  Alt 28. Jul 2010, 09:35
Das Problem ist, dass wir in der Schule (Klasse 10) bisher nicht mit Vektoren gearbeitet haben. In Physik zwar schon, aber ich wüsste jetzt nicht, wie ich das auf ein Integer-Koordinatensystem übertragen könnte.
Mit der Vektorrechnung oben kann ich leider nicht besonders viel anfangen, sry.
Was für spezielle Funktionen meinst du denn?
Und inwiefern ist das mit den Winkelkoordinaten zu verstehen?

Geändert von Noobmaster (28. Jul 2010 um 09:38 Uhr)
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#6

Konkretisierung:

  Alt 28. Jul 2010, 17:55
Damit ihr mein Problem noch besser verstehen könnt. Ich habe allgemein ja leider nur ein Integer-Koordinatensystem(oder sehe ich das falsch und kann Kommazahlen als Koordinaten benutzen!?). Wenn ich nun einmal die Gerade durch Weiße und Geisterball ziehe, dann kann ich ja einen Steigungswinkel ausrechnen. Ist dieser Winkel zum Beispiel 2°, dann ist der Tangens(=Steigung) ungefähr 349/10000 groß. Ich kann aber die Kugel sich nicht 349pixel nach rechts und 10000pixel nach oben bewegen lassen. Arbeite ich noch ungenauer mit 350/10000 komme ich immerhin über Kürzen auf 7/200, aber darf die Weiße nur 50 Pixel rollen, kann man einfach mit Pytagoras schon sehen, dass die 50 weit überschritten werden. Ich kann aber nicht weiter kürzen, da ich die Kugel nicht um z.b 3,5 oder 1,12345pixel bewegen kann.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

AW: Andorra 2d Billardspiel in 2d

  Alt 28. Jul 2010, 18:07
Du bist nicht auf Integers festgelegt!
Zum Anzeigen ja, schon.
Aber du kannst intern mit Double-Werten rechnen (Gleitkommawerte) und nur zum Anzeigen runden.
Ach und: Beschäftige dich etwas mit Vektoren. Ich weiß, was mna nicht kennt ist erstmal total kompliziert, aber das macht echt vieles einfacher.

Du kannst zum Beispiel die Differenz zwischen den (Ortsvektoren von) der Weißen und dem Geisterball bilden. (Das ist dann ein Vektor) und wenn du sagst "die Länge soll genau 50 sein" dann normierst du den Vektor und nimmst ihn mal 50. Zum Subtrahieren, Multiplizieren und Normieren kannst du dir im Nu kleine Funktionen schreiben und das war's
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Andorra 2d Billardspiel in 2d

  Alt 28. Jul 2010, 21:18
Danke für die Antwort, aber was ist ein Ortsvektor? Und das mit dem Runden führt zu Ungenauigkeiten, die nicht behebbar sind! So haben es zumindest meine Erfahrungen gezeigt.
Wie normiert man einen Vektor auf 50? Das mit dem Addieren eines Vektors hab ich auf Wikipedia gefunden. Also besteht der Vektor in meinem Fall aus 2 Zahlen? Aus welchen?
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Andorra 2d Billardspiel in 2d

  Alt 28. Jul 2010, 21:34
Du stellst die richtigen Fragen am falschen Ort.
Informiere dich erstens darüber - ich nehme an, wegen Einfachheit der Frage, dass du dies noch nicht getan hast / ansonsten sry.
Das Vektoren "ein mal eins" ist echt einfach.

Normieren bedeutet einen Vektor auf die Länge 1 zu bringen. Dh. du rechnest dir mit dem Pythagoras die Länge aus -- x und y hast du gegeben, x und y wertest du wie Katheten in nem Dreieck aus und rechnest dir halt die Hypotenuse (= Vektorlänge) aus.
http://upload.wikimedia.org/wikibook...henuse.svg.png
Die x und y Komponente dividierst du durch den erhaltenen Wert und schon hast du einen normierten Vektor (Hypotenuse = 1)

Dies tust du, um später mit Faktoren arbeiten zu können. Dh wiederum wenn du zb die Länge des Vektors begrenzen willst (zb 50) dann schaust du eben, ob dein Faktor >= 50 ist, falls ja, dann setzt du es auf 50.

In kürze folgt hier ne kleine Demo-Anwendung...
Edit: Sodale, WUPPDI!

MfG
Angehängte Dateien
Dateityp: rar Wuppdi.rar (168,8 KB, 14x aufgerufen)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (28. Jul 2010 um 22:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

AW: Andorra 2d Billardspiel in 2d

  Alt 28. Jul 2010, 22:33
Danke für die Antwort, aber was ist ein Ortsvektor?
Tja, gute Frage
ich nehme mal an, dass du dich noch nicht tiefergehend mit Vektoren beschäftigt hast (oder das zumindest nicht verstanden hast, sonst würdest du ja nicht fragen...)
Dann probiere ich das mal kurz zu erklären (denn der Wikipediaartikel ist nicht so super gut für Einsteiger)

Ein Vektor ist eine "Liste" von Zahlen die zusammengehören. Und zwar so eng zusammen dass man mit einer einzelnen Zahl nur wenig anfangen kann.
Beispiel Ortsvektor: Um die Position auf einem Lineal zu beschreiben braucht man nur eine Zahl. Wenn man jetzt aber eine Ebene nimmt (z.B. ein Blatt Papier) dann reicht eine Zahl nicht mehr aus. Man braucht zwei Zahlen. (Ist ja auch ein zweidimensionaler Raum)
Die kann man jetzt "X-Wert" und "Y-Wert" nennen, und man kann jedem Punkt auf dem Blatt einen x und einen y wert zuordnen. Als Beispiel "4cm von links und 8cm von oben"
Diese beiden Zahlen kannst du in einen Vektor zusammenfassen. Damit signalisierst du "Diese beiden Zahlen gehören zusammen. immer."
Das nennt man dann einen Vektor. Oder (da ja ein Ort beschrieben wird) einen Ortsvektor.
Dieser Ortsvektor (hier: (4 8)) gibt dir also die Position des Punkts auf dem Blatt an. Damit kannst du weiterrechnen und alle Möglichen sachen anstellen, aber was wichtig ist: Alle Operationen werden auf beide Zahlen in gleichem Maße angewendet. Du kannst also den Vektor verdoppeln und bekommst (8 16) und danach den Vektor (1 -5) addieren und bekommst (9 11)

Also ein Vektor ist wie eine Liste von zahlen die zusammengehören

Zitat:
Und das mit dem Runden führt zu Ungenauigkeiten, die nicht behebbar sind! So haben es zumindest meine Erfahrungen gezeigt.
Ja, das Runden schon. Deshalb rundest du ja nur bei der Ausgabe und rechnest intern mit den genauen Werten weiter
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz