 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Hugo
Anmeldungsdatum: 13.11.2005 Beiträge: 32
|
Verfasst am: 18.11.2005, 08:10 Titel: Kollision-aber wie? |
|
|
hallo Leute ich habe mich schon öfter gefragt wie es bei einem Spiel sein kann das die Spielfigur an einer Mauer abprallt, statt durch sie hindurch zu laufen, falls jemand weiß wie man mit opengl eine Kollision erkennen kann soll ers mir bitte erklähren!
mfG. Hugo |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 18.11.2005, 09:36 Titel: |
|
|
OpenGL hat damit so direkt nix zu tun, was du hingegen machen solltest ist dir ein paar Tutorials (Anleitungen) durchzulesen um den Sinn und die Prinzipien der Programmierung im allgemeinen, und von Spielen im speziellen, zu verstehen.
Ich habe vor langer Zeit mal ein Tut zum Thema geschrieben "2D Spiele selber machen". Es ist für QuickBasic und befasst sich mit Spielen im PacMan Stil. Am besten du liest dir das mal durch, vielleicht erklärt das einiges.
zum Tutorial _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 18.11.2005, 10:09 Titel: |
|
|
Zuerst einmal musst man wissen dass so eine
3d Welt aus Dreiecken besteht. Um zum Beispiel
zu erkennen, ob vor der Spielfigur eine Mauer ( als ein Dreieck)
ist, kann man zum Beispiel testen, ob es einen Schnittpunkt
der 3d Welt mit der Linie , die die in Laufrichtung zeigt, gibt,
also ziemlich kompliziert. Da musst du dich schon ziemlich
gut in Mathe auskennen um so was zu lösen. Also ich bin daran
gescheitert, aber hab dann einfach mit einer 3d engine
weiterprogrammiert (Irrlicht), bei der geht das mit der Collision
sogar automatisch. Vielleicht gibt es davon sogar einen Port
für Freebasic, wenn du in die Richtung weiterprogrammieren
willst empfehl ich die auf jeden Fall die Irrlicht Engine
etwas besseres kann man für null Geld nicht bekommen
und ist ideal für 3d Einsteiger. |
|
Nach oben |
|
 |
Hugo
Anmeldungsdatum: 13.11.2005 Beiträge: 32
|
Verfasst am: 18.11.2005, 12:26 Titel: |
|
|
Zu E-P-S Kommentar:
dein Turiotal sieht aus als wärs für Quickbasic ich brauchs aber für Freebasic falls irgendjemand weiß wie des mit der Kollision geht bitte melden!
Zu Heizi:
ich weiß net wo es des Irrlicht gibt vielleicht kannste janen Link machen.
ansonsten Danke für eure tips! |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 18.11.2005, 12:40 Titel: |
|
|
irrlicht.sf.net
openGL in 2D oder 3D? Irrlicht is 3D und die Kollision dabei soll nach entwicklerangaben nur primitiv sein, da müsste man dann noch mit newton oder sonstwas dazuarbeiten, das wird etwas kompliziert.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 18.11.2005, 13:28 Titel: |
|
|
Ja, mein Tut ist für QuickBasic, das hatte ich ja auch geschrieben. Aufgrund deiner anderen Beiträge dachte ich mir nur das es vielleicht Sinn macht wenn du erst einmal anfängst dich mit der Programmiersprache und dem Programmieren im Allgemeinen zu befassen.
FreeBasic ist eine, mehr oder weniger, Weiterentwicklung von QuickBasic und der Art und Weise wie du hier Fragen stellst...
Zitat: | habe mich schon öfter gefragt wie es bei einem Spiel sein kann das die Spielfigur an einer Mauer abprallt, statt durch sie hindurch zu laufen |
...entnehme ich das du noch nicht viel Erfahrung hast was das Programmieren an sich betrifft.
Ergo, würde es durchaus Sinn machen. Sollte das alles nicht zutreffen hab ich wohl falsch vermutet - dann sorry. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 18.11.2005, 13:35 Titel: |
|
|
Moin allerseits,
Wenn man `einfach nur` eine Kollisionsprüfung für ein game braucht, dann kann man natürlich eine fertige engine nehmen.
Ein einfacher Ansatz ist auch in der von TioBit übernommenen `engine` die ich erweiter und hchgeladen habe vorhanden - auf freebasic.de
Ansonsten sollte man sich folgendes überlegen:
1.: wie kann eine Kolision zustandkommen?
arbeite ich als Flugsimulator in 3 Dimensionen oder habe ich real nur 2 Dimensionen (autos auf Straße(nicht abhebend)) oder befinde ich mich sogar nur auf einer Dimension - also theoretisch einem Strahl (BSP: Eisenbahnsimulation und auf Schienen).
2.: Was kann kollidieren
Es ist ansich unsinnig, für jedes Pixel eine Kollisionskontrolle durchzuführen - das dauert ziemlich weil es ziemlich viele Pixel sind und es kann auch daneben gehen, wenn die Pixelpositionen knapp nebeneinander liegen.
Häufig wird - wie oben angegeben - jedes Dreieck mit jedem anderen Verglichen - auch das ist nicht unbedingt nötig - man Bedenke, dass man bei einem Ball, der als ganzes Objekt durch die Gegend hüßft eigentlich ausschließen kann, dass sich die obere und untere Seite bewegt. Und selbst wenn - interessant wäre zu wissen, ob er z.B. an einen Torpfosten(Fußball) oder einem Korbring(Basketball) hängenbleibt. Man muss also nur das Vergleichen, was sich "gegeneinander bewegt".
Man kann dies u.a. auch noch so einschränken, dass man je eine Art Kugelkörper definiert(maximaler Radius) und dann die Radien beider Körper addiert und mit dem Abstand der jeweiligen Mittelpunkte vergleicht - ist der Abstand größer, dann können wir auf den Check verzichten.
3.: Vereinfachen
Meist ist es auch nicht notwendig jedes Dreieck zu checken - vielmehr ist es eine Sache der Definition, wo die Grenzen eines Körpers sind. z.B. kann man bei einer Wandkollision definieren, dass der Abstand zu einer Mittelachse eingehalten werden soll oder zu 3 oder 4 definierten Kugelobjekten.
ebenfalls ist es möglich zu checken, ob sich beide Objekte im gleichen oder in benachbarten Planquadraten befinden - so kann man sich viel rechenarbeit sparen und speed gewinnen.
4.: man sollte auch noch auf folgendes Achten:
- Wenn ein Gegenstand auf eine Wand prallt, bleibt er im allg. dort nicht stehen, sondern ändert seine Richtung. Das kann man durch ermittlung des (virtuellen) abprallpunktes und Änderung der Geschwindigkeitsvektoren ermitteln. Wenn man es gut machen will, kann man noch die Wandverbiegung mt einrechnen im Anfang sollte man sich mit sowas aber nicht unbedingt rumschlagen.
Hierzu ist auch wieder vorsicht geboten:
- Bei einer Bewegung im Computer handelt es sich um Schrittweises Vorangehen. Theoretich ist es also möglich, dass man ein Dreieck `überspringt`. entweder muss der Schritt (und damit die Geschwindigkeit) so klein gewählt werden, dass er kein Dreieck überspringen kann oder es muss mit Abständen gerechnet werden. Man sollte also checken, ob auf der Bahn von Punkt 1 nach Punkt 2 ein Dreieck (oder ein Kugelkörper) einen anderen Körper Schneidet.
Anekdotische Anmerkung:
Es entpricht zwar der Realität, dass man mit viel speed manchmal durch Türen durchkommt, durch die man mit wenig speed nicht durchkommt, aber das ist was anderes: hier würde die Tür 8im gegensatz zur Realität) keinen Schaden nehmen.
- Manchmal sieht man (vornehmlich in älteren oder kostenlosen engienes(Keine Ahnung wie Irrlicht das macht) ) dass teile von Körpern durch die Wand durchkucken(ein Zeichen dafür, dass diese Dreiecke _nicht_gecheckt worden sind - müssen sie auch nciht unbedingt für die Funktione). Das kann man entweder dadurch verhindern, dass die Wand eine Dicke hat oder dass alle `Körperteile`draußen bleiben müssen(größerer Abstand oder Einzelcheck).
Anhang:
Warum Kugelobjekte? Nun sie sind simpel zu definieren: man Vergleicht den Abstand vom Punkt zum Mittelpunkt und sieht nach, ob der Abstand kleiner ist als der zum Rand(->Abstand kleiner Radius)
wir definieren:
r = Radius
_p = position
_m= Mittelpunkt
x,,z = Koordinaten im Kartesischen System
für
Wurzel((x_p-x_m)²+(y_p-y_m)²+(z_p-z_m)²) < r
oder in schnellerer Schreibweise und mit r² nur einmal gerechnet:
(x_p-x_m)²+(y_p-y_m)²+(z_p-z_m)² < r²
gilt :
_p befindet sich im Bereich der Kugel des Radius r(oder auch im Abstand kleiner des Radius) um den Mittelpunkt _m
Vorsicht:
Wenn man nun 2 Vergleicht muss man für die 2. Gleichung natürlich (r1+r2)² nutzen und nicht r1²+r2² !!! (gern gemachter Fehler - aber siehe Binomische Formeln - ist `nich ganz` das gleiche!)
Ich hoffe geholfen zu haben dies etwas zu verstehen
CU2
Tilli
ps:
Sowei ich weis existiert eine Kollisionskontrolle auch in GL. |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 18.11.2005, 16:27 Titel: |
|
|
Also ich bin mir ja nicht sicher...aber angenommen die Figur verhällt sich wie ein Rechteck, dann kannst du doch einfach während der Tastenbewegung testen, ob die neue Position nicht innerhalb der Mauer ist.
Sp z.B.:
Code: |
IF MULTIKEY(&H48) THEN 'Wenn nach oben gedrückt wird...
yneu=y-1 'ist die neue Y Koordinate die alte - 1
IF ABS(yneu-yobjekt)>5 THEN 'Wenn diese dann nicht innerhalt des hindernisses ist
y=yneu 'wird der y koordinate die neue Koordinate zugewiesen
END IF
END IF
|
|
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 18.11.2005, 16:33 Titel: |
|
|
Also der Link
ist http://irrlicht.sourceforge.net/
Wie du dass in Freebasic verwenden kannst weiß
ich nicht, aber die Irrlicht Engine ist eigentlich eine
DLL Datei, irgendwie muss das gehen.
An MisterD:
Die Collision in Irrlicht ist ziemlich gut,z.B.
unterstützt sie Sliding, nicht nur dass man
vor Wänden stehen bleibt, auch,
dass man Schrägen hochlaufen kann....
also genau wie in einem hochwertigen kommerzielen
Spiel. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 18.11.2005, 16:48 Titel: |
|
|
Naja, dann hast du ne schicke Kollisionskontrolle aber sobald du dann irgendwie Ragdolls oder sonst was komplizierteres einbaun willst hörts schon auf, dann is ein komplettes physiksystem doch besser.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 18.11.2005, 16:51 Titel: |
|
|
Hallo.
Im examples ordner unter missing ist ein beispiel. Ich kann jedoch die include datei nicht finden. Das programm heißt "irrlicht.bas". Ich denke mal, dass du nur die irrlicht-c.bi datei suchen musst und es klappt.
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 19.11.2005, 16:23 Titel: |
|
|
Moin
@proggerx
Ausgehend von einem 2dfeld und dass man sich nur nach oben-unten und rechts-links bewegt, und das Kästchenweise, kann man das so machen. Zudemn setzt es voraus, dass immer nur ein Kästchen weit bewegt wird.
Meist ist aber die (moderne ) Steuerung so aufgebaut, dass man mit rechts/links (oder maus) die Richtung wählt und dann die Geschwindigkeit angegeben wird. wenn ich mich dann schneller als ein Kästchen bewege, könnte ich (theoretisch) Mauern überspringen. (Vergleichbar wäre dies: y= y-2, dann würde ich die Mauer bei y-1 überspringen, teste ich nur ob y-2) frei ist. Schwieriger wird es, wenn man dann z.B. den Turmsprung hat (1 Rechts, 2 Hoch) - was soll dann überprüft werden? der darüber, der rechts darüber oder was? Noch schwieriger wird es natürlich bei 3D sachen.
Wie gesagt, bei einem Einfachen System kann man es so machen, ansonsten wird es schwierig. Es wäre vielleicht möglich die Bewegung zu Splitten - eine von vielen Möglichkeiten. Man sollte allerdings auch Bedenken, dass nciht nur die Mauer sondern auch das zu bewegende Objkt i.allg. eine Größe hat - auch hier ist dann auf voller Breit zu überprüfen, was 'abgeht'.
@MrD:
Ein komplettes Physiksystem ist es auch wenn man es selbst programmeirt die Leute kochen doch auch nur mit Wasser... Wenn es zugegebenermaßen ein ziemlicher Aufwand und Umfang ist, alles selbt zu programmieren - aber wo bleibt sonst der Spass vorteil ist es, dass man alles möglich selbst in den ode einprogrammieren kann - das ist sonst nur mit Aufwand möglich. Und noch ein letztes: eigenprogrammierungen ohne Zugriff auf Hardware sind i. allg. recht portabel B)
CU2
Tilli |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 22.11.2005, 11:26 Titel: |
|
|
Das mit Irrlicht und Frrebasic scheint
nicht zu gehen bei mir findet es die bi Datei auch
nicht, hab es stattdessen mal mit der c includedatei versucht,
aber haut auch nicht gefunzt.
Da das Beispiel im Ordner missing ist, nehm ich einfach mal an
dass da noch etwas bei Freebasic fehlt was
für die Kompatibilität mit Irrlicht nötig wäre
vielleicht in einer späteren Version...  |
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 23.11.2005, 23:53 Titel: |
|
|
Moin,
bevor ich weiteren Unsinn quatsche habe ich mir mal eine Einleitung angesehen: http://irrlicht.sourceforge.net/tut001.html
Da ist ziemlich viel C++ drin (OOP zeug).
Kannst du sagen, was nicht funktioniert hat - z.B. nicht Kompiliert, nicht gelaufen, Absturz oder so?
Welche Variablendefinition(zString?), hast du vcerwendet - was hat ... äh ... hätte das Programm getan?
Wie hast du die Namespace sachen bzw. die z.b. GUI::xxx ersetzt?
Ich denke, da könnte das Hauptproblem sein. Neben der Tatsache, dass von FB keine Konstruktoren unterstützt werden...
Für mich spricht das alles nicht - ich kenne zwar OOP, aber es ist definitiv nicht Hardwarerecourcenschonend - halt für Programmierer gemacht, die den ganzen Tag nichts anderes machen. Ich habe etwa 2 Jahre gebraucht, mit anschließendem Kurs, bevor ich überhaupt verstanden habe, was die von einem wollen und WARUM das besser sein soll ...
Nichtsdestotrotz halte ich es für selten aufgerufene Routinen die hochkomplex sind für ganz nett - ob das auf ein einfaches Darstellungsprogramm mit Kollisions-Kontrolle schon zutrifft mag jeder selbst entscheiden (sorry an die Irrlichtbefürworter, aber die aktuelle Aufgabenstellung unterfordert die engine maßlos) .
Wenn du es zum laufen bringen willst, versuch es doch mal mit dem Devcpp System - da gibt es gleich ein Passendes Tutorial unter http://irrlicht.sourceforge.net/tutorials.html
bzw. direkt unter
http://irrlicht.sourceforge.net/tut_devcpp.html
DEVCPP gibt's Kostenlos unter http://www.bloodshed.net/devcpp.html für 13,5Mb
aber darf ich das eigentlich her schreiben (
Vielleicht kann man ja unter Devcpp eine DLL schreiben, die Freebasic dann läd und das eigentliche Programmieren ... )
CU2
Tilli |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 24.11.2005, 11:15 Titel: |
|
|
Das Programm um das es eigentlich ging
ist im Ordner /missing von Freebasic.
Hab schon versucht es zum Laufen zu bringen
hat aber nicht so ganz geklappt. Der Grund
dafür ist mir schleierhaft denn war nicht
dazu in der Lage die kryptischen Fehlermeldungen zu
entziffern, trotzdem danke für deine Tipps. |
|
Nach oben |
|
 |
tilli

Anmeldungsdatum: 10.09.2005 Beiträge: 73
|
Verfasst am: 24.11.2005, 16:23 Titel: |
|
|
Vorab - siehe
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=30
- da geht es um das Thema - im Allgemeinen sieht es so aus, wie ich es oben beschrieben habe, ein wenig mehr in's Deteil gehend.
Moin,
Mich schient ich hab' mal wieder nicht die richtige Version des Pakets auf'm Rechner ... kurz: mir fehlt das Verzeichnis /missing
Ansonsten gehe ich wie gesagt von einem Problem der Einbindung von OOP in freebasic aus.
Nichtsdestotrotz stellt sich mir bei'm näheren Studium der Irrlichtengine die Frage, wass denn da noch programmiert werden soll - Man kann die Abfragen der Berührung anscheinend in mehreren Versionen machen - u.a. auch direkt, aber man muss nicht.
Wenn man aber die Abfrage nicht direkt macht, muss man auch die "Stoßpartner" kennen und hinterher wissen, wie (z.B. in welchem Winkel) sie ineinander eindringen. Da es beliebig viele sein können, kann es sinn machen dies über eine Rückroutine zu organisieren. Das wiederum erfordert i.allg. OOP-Unterstützung, damit die Richtige Person zurückgeschleudert wird ...
Und bei dem Aufwand soll es sich lohnen es nicht gleich selbst zu programmieren? Zudem wo der Standard anscheinend darin besteht fertige Karten zu laden?
Wenn man ein Spiel programmieren will ohne wirklich die Basis zu Programmieren ... nagut - dann sollte aber auch die Spielidee gut sein oder zumindest das eine oder ander I-Tüpferlchen haben, von dem Rest gibt es eigentlich genug...
Und zum Malen? ... gibt es da eigentlich schon ein Freebasicprogramm? Wäre sicher mal was sinnvolles für einen Wettbewerb am besten gleich mit Grafikeditor für 3D
CU2
Tilli |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|