Autor Beitrag
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Sa 28.07.07 21:26 
Ihr kennt ja möglicherweise das Spiel Achtung die Kurve siehe hier ich will die gleiche Kollisionsabfrage implementieren, bin aber nach verschiedenen Versuchen gescheitert.
Wenn ich nämlich dicke Linien zeichne, kann es sein das zwei parallel laufende linien sich berühren, was natürlich nicht sein sollte.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Sa 28.07.07 21:32 
Wie dein aktueller Code aussieht sollen wir raten, oder was?

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Blawen
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: Sa 28.07.07 21:58 
user profile iconjakobwenze :lol: l hat folgendes geschrieben:
Wie dein aktueller Code aussieht sollen wir raten, oder was?
Wieso raten? Es ist doch ganz eindeutig!
In der 2'543. Zeile gehört statt eines "=" ein '<>' hin... :shock: :lol:
oder war's doch ein "not" statt eines begin's :gruebel:

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 05.08.07 15:35 
Ich habe keinen Code (zumindest keinen funktionierenden), das ist ja das Problem.
Wie gesagt, wenn ich nur einen Punkt der sagen wir 5 Pixel breiten Linie auf Kollision überprüfe, dann kann es sein, dass die linie eine andere streift, ohne dass ich davon etwas merke, es sollten also alle punkte rechts und links der linie auf eine Kollision geprüft werden und ich weiß nicht wie ich das machen soll.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 05.08.07 15:37 
Hi,

Mehr als Dir den Tipp mit LineDDA geben kann ich nicht. Ferner ist selbst nicht funktionierender Code wertvoller als eine funktionierende Glaskugel, da man an kaputtem Source wenigstens rumschrauben kann, um ihn zum Funktionieren zu bringen.

MfG,
BenBE.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
arj
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: So 05.08.07 15:39 
Das du keinen funktionierenden Code hast ist schon klar, sonst würdest nicht fragen.
Aber wie wäre es, wenn du den NICHT funktionierenden Code posten würdest?

Dann könnte man nämlich mal schauen ob man nen Fehler findet.
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 05.08.07 15:43 
LineDDA bringt mir nichts, da ich eine breite linie zeichnen möchte.
Wenn ihr meint, dass euch dieser Code weiter bringt, dann tippe ich ihn gerne schnell ein.

ausblenden Delphi-Quelltext
1:
2:
if canvas.pixels[blub,bla]<>0 then showmessage('jetzt bin ich wohl angestoßen');
else canvas.lineto(blaber,blubi);


ich überprüfe also nur eine koordinate der linie und nicht ob sie irgendwo aneckt, nähmen wir an die linie wäre 20 pixel breit, dann hätte das große auswirkungen :).

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 05.08.07 17:25 
du kannst deine linien folgendermaßen speichern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TLine = record
    from, to: TPoint;
  end;
  TLineArray = array of TLine;
  TPlayer = TLineArray;

den startpunkt setzt du zufällig, dann verlängerst du die linie so lange (endpunkt) wie kein richtungswechsel stattfindet.
ansonsten schreibst du eine neue linie in das array.
diese kannst du dann auf schnitt mit anderen linien prüfen.

andere methode. du zeichnest alle linien direkt und machst ans ende wo du zeichnen möchtest einen vergleich, ob die linie an ihrem endpunkt (wenn die nur 1px dick sind ists schwer) eine andere linie trifft. anonsten kannst du auch mit ner schleife durchgehen und alle pixel vom letzten punkt überprüfen.

die erste ist variante ist aber sicherlich die effizientere.

mfg
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 05.08.07 18:41 
nein das geht in eine ganz andere richtung, erstens ist das viel zu aufwendig ich möchte einfach beim direkten zeichnen, sprich auf niedrigster ebene prüfen ob die pixel welche eingefärbt werden sollten schon eine farbe haben. Deine Idee trifft ja auch wieder nicht auf dicke linien hinzu.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 05.08.07 18:46 
user profile iconklezmor hat folgendes geschrieben:
Ihr kennt ja möglicherweise das Spiel Achtung die Kurve siehe hier ich will die gleiche Kollisionsabfrage implementieren, bin aber nach verschiedenen Versuchen gescheitert.
Wenn ich nämlich dicke Linien zeichne, kann es sein das zwei parallel laufende linien sich berühren, was natürlich nicht sein sollte.


deswegen mein vorschlag, ansonsten was hindert dich daran einfach mit pixels[] zu prüfen, was schon da ist ?


mfg
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 05.08.07 19:04 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
user profile iconklezmor hat folgendes geschrieben:
Ihr kennt ja möglicherweise das Spiel Achtung die Kurve siehe hier ich will die gleiche Kollisionsabfrage implementieren, bin aber nach verschiedenen Versuchen gescheitert.
Wenn ich nämlich dicke Linien zeichne, kann es sein das zwei parallel laufende linien sich berühren, was natürlich nicht sein sollte.



Ich weiß zwar leider nicht wie die Kollisionsabfrage in diesem Spiel funktioniert, aber sie kann nicht nach diesem Prinzip funktionieren, da es auch zur kollision kommt wenn die Linie auch nur eine andere streift, was in obig genannten Szenario unmöglich ist.

Ich würde schon mit pixels bzw. scanline prüfen, bloss weiß ich ja nicht welche pixel alle zu meiner linie gehören.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 28

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 05.08.07 19:38 
eine linie die unendlich dünn ist, kann keine andere linie mal so eben "streifen"


mfg
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 05.08.07 19:46 
Dann mach's anders:
Zeichne auf einem SCHWARZEN Canvas mit der Größe deines Spielfeldes mit WEISSER FARBE deine Linie drauf, die du prüfen willst. Zeichne danach mit einem WEISSEN Stift im AND-Modus ALLE Punkte, die mit deiner Linie kollidieren könnten und daher geprüft werden müssten. Anschließend brauchst Du nur noch nach Pixeln per Scanline suchen, die NICHT schwarz sind.

P.S.: Bei sauberer Implementierung kann man gleichzeitig bis zu 24 Kollisionsabfragen (für 24 verschiedene Linien und Umgebungen) implementieren.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: So 05.08.07 20:05 
Habe absolut keine ahnung wie das funktionieren soll. Wie bekomme ich die Punkte, mit der andere Linien mit meiner Linie kollidieren könnten. Ich weiß zwar dass ich mich öfters umständlich ausdrücke und denke ihr habt mich leider noch nicht ganz verstanden.


DER COMPUTER MUSS WISSEN WELCHE PIXEL ER EINFÄRBEN MUSS UM EINE LINIE ZEICHNEN ZU KÖNNEN, ALL DIE EINZUFÄRBENDEN PIXEL MÖCHTE ICH AUF EINE FARBE ÜBERPRÜFEN, WOBEI THEORETISCH NUR DIE ÄUßEREN PIXEL EINER LINIE ZU ÜBERPRÜFEN SIND.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 05.08.07 20:13 
Probier die Methode für die Kollision doch erstmal aus oder gib eine Demo, oder umfangreicheren Testsource ... Auf die Art kann Dir keiner wirklich vernünftig helfen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
IamZeus
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 21.10.07 14:27 
Wie steht die Sache mit der Leistung und Pixels()?

Ist soetwas in dem Spiel überhaupt machbar?
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Mi 31.10.07 00:25 
ich bin da immer noch nicht weitergekommen, hab mich allerdings auch nicht mehr sonderlich damit beschäftigt, falls du ne lösung implementiert hast kannst sie mir ja sagen.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
neunundzwanzigdreizehn
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 05.11.07 17:52 
Das Ganze ist vektororientiert, nehm ich an. dh fuer die Gerade existiert eine Gleichung. Und fuer alle anderen Objekte existieren auch Gleichungen. Dann muss man die ja nur gleichsetzten und loesen. Wo liegt das Problem ?
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Fr 09.11.07 22:00 
Das problem ist dass, das ganze kein vektor ist und es geht hier auch nicht um eine Gerade(wer auch immer darauf gekommen ist). Ich kann auch keine objekte definieren, welche auf kollision überprüft werden, können.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth