| Autor |
Beitrag |
Bääääär
      
Beiträge: 117
|
Verfasst: So 27.08.06 16:59
Hallo!
Ich habe mir vorgenommen einen "Tabbi-Shooter" zu programmieren. Der soll im Prinzip wie Moorhuhn sein, eben nur mit Teletabbis.
Meine Frage ist nun:
Wenn der Benutzer klickt (schießt) lasse ich mir die Koordinaten vom Cursor auslesen. Ich weiß, wo sich die Tabbis auf dem Bildschirm befinden. Einziges Problem: Der Tabbi ist ja nicht exakt quadratisch. Also wird die Abfrage, ob man getroffen hat sehr schwierig. Ich könnte also für den Tabbi ein "Muster" festlegen, welche Pixel vom Tabbi als getroffen gewertet werden sollen. Quasi ein Arry mit den x & y Koordinaten.
Bsp.: der Tabby steht an punkt 10,10. Im Muster steht, das pixel 22,45 des Tabbis als getroffen gewertet werden soll. Wenn also auf Pixel 32,55 "geschossen" wurde, hat man getroffen.
Geht das nicht irgendwie leichter und mit (möglichst) weniger Rechenaufwand?
Ich hoffe, ich konnte mein Problem (zumindest Ansatzweise) erläutern. Wenn nicht, werde ich natürlich noch mal versuchen, klar zu machen, wo das Problem liegt.
Danke schon mal,
The Bääääär
|
|
reflex
      
Beiträge: 20
Win98,WinME,WinXP, Suse Linux 10.1
D7 Pers, D3 Prof
|
Verfasst: So 27.08.06 17:51
Hey,
du kannst abfragen ob sich der Klick in einem bestimmten Abstand zur Koordinate des Tabbys befindet. Ich denk mal dass geht etwas schneller als dafür extra ein Array zu definieren.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 27.08.06 18:02
Du kannst das Rechteck um den Tubbie herum in einem array ablegen. Dann kannst du mir PtInRect prüfen, ob ein Punkt in einem Rechteck liegt.
HTH, Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: So 27.08.06 18:18
Natürlich kann ich ein Rechteck definieren, aber dann gilt evtl. ein "knapp daneben geschossen" als getroffen und ein "knapp getroffen" als daneben, weil sich dieser Teil des Tabbis nicht im Rechteck befindet.
|
|
Ironwulf
      
Beiträge: 733
Erhaltene Danke: 2
|
Verfasst: So 27.08.06 18:35
was sindn die tabbis? images sprites oder irgendwas ansdres?
z.b. hat delphix die funktion getsprAt(x,y);
und ihc meine so was ähnliches auch schon bei andren komponenten gesehn zuhaben
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: So 27.08.06 18:59
Ich dachte Die Tabbis ganz normal als Bitmap auf die Form zu zeichnen und dann irgendwo (z.B. in einem Arry) ihren Standpunkt, sowie die Art (Tabbi ganz vorne, in der Mitte, ganz hinten) abzuspeichern. Bei einem Schuss wird geschaut, ob ein Tabbi in der Nähe der Cursorposition ist, wenn ja, wird die Art ausgelesen und dann das entsprechende Muster genommen.
|
|
Ironwulf
      
Beiträge: 733
Erhaltene Danke: 2
|
Verfasst: So 27.08.06 20:33
da wirst du wohl doch die variante mit den rechtecken nehmen müssen is die einfachste und schnellste
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: So 27.08.06 21:22
nur leider auch die "unprofessionellste"
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: So 27.08.06 22:35
Das stimmt so nicht. In der Tat sind in den meisten kommerziellen Titeln BoundingBox- oder BoundingSpehre-Verfahren sehr weit verbreitet - eben weil sie sehr wenig "kosten". Zwei Lösungsansätze: 1. Was hindert Dich daran mehre Rechtecke zu verwenden, um z.B. ein exaktere Kollision zu ermitteln? IMAO wurde dieser Ansatz auch beim Orginal-Moorhuhn verfolgt, dass wenn ich mich richtig entsinne keine Pixel basierte Kollision hatte. 2. Da der Rechenaufwand bei Dir überschaubar ist, könnte auch eine pixelgenaue Kollision realisierbar sein. In diesem Fall solltest Du aus Geschwindkeitsgründen zunächst mit Rechtecken überprüfen, ob der Klick in diesem Rechteck erfolgt ist. Ist dies der Fall, kannst Du eine detailliere Überprüfung vornehmen. Sofern Du nicht gerade Bitmaps in Postergröße durch die Gegend schiebst, sollte jeder halbwegs aktuelle Rechner mehre BoundingBoxes und eine detaillierte Berechnung schaffen. Zumal diese nur bei einem seltenen Ereignis eintreten - einem Klick - und nicht für eine ständige Kollision z.B. durch Bewegung von Figuren durchgeführt werden muss.
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: Di 29.08.06 11:54
Womit du natürlich irgendwie Recht hast. Nagut, ich glaube die Frage ist heirmit beantowrtet. Danke an alle!
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: Di 29.08.06 16:36
Mir ist soeben noch eine Möglichkeit eingefallen, die ich aber Aufgrund eines Mangelnden Bildschirms an meinem Pc nicht testen kann:
Wenn man für jeden Tabbi ein TImage nimmt, und dann mithilfe von Transparentcolor die Teile des Bitmaps, wo kein Tabbi ist "unsichbar" macht (was ja eh passieren müsste), reagiert dann das Image auf einen Klick in diesen unsichbaren Bereich?
Damit würde doch die Abfrage wesentlich leichter sein, oder?
Würde das dann zuviel Rechenaufwand benötigen?
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 29.08.06 16:52
ich wollte nur mal anmerken, dass die dinger Teletubbies heißen und rein gar nichts mit Tabbed-Browsing zu tun haben 
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Mi 30.08.06 07:09
Bääääär hat folgendes geschrieben: | | Wenn man für jeden Tabbi ein TImage nimmt, und dann mithilfe von Transparentcolor die Teile des Bitmaps, wo kein Tabbi ist "unsichbar" macht (was ja eh passieren müsste), reagiert dann das Image auf einen Klick in diesen unsichbaren Bereich? |
Das Image reagiert dann trozudem auf den Klick. Was du bei dieser Mathode antürlich machen kannst ist, dass du das OnMouseDown Ereginis des Images auswertest und dann prüfst, ob der Pixel in dem Image auf den geklickt wurde in dem Bitmap das im Image geladen ist, eine transparente Farbe ist.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: Mi 30.08.06 09:26
Achso, du meinst, wenn transparentcolor:=clfuchsia ist, dann prüfe ich, ob der angeklickte Pixel clfuchsia ist, bzw gleich transparentcolor ist.
Damit hätte ich dann auch eine Pixelorientierte Kollision, oder?
Wäre es ratsam, eine andere Komponente zu nehmen, also nicht TImage - des Rechenaufwands wegen?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 30.08.06 09:48
sorry das ich das so sage aber is das nicht egal? bei Moorhuhn ist das Fadenkreuz eh so groß das man theoretisch dar nicht "unter den Flügeln" durchschießen kann.
mfg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Bääääär 
      
Beiträge: 117
|
Verfasst: Sa 02.09.06 20:06
Ich wollte ja Teletubbies nehmen und nicht Moorhühner.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 04.09.06 11:56
dann mach das fandenkreuz so groß das man nicht danebenschießen kann! 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|