| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 1.573
| Spielekonzept ala Mario Galaxy
Hatte ja schonmal so etwas in der Art hier gepostet. Nun hab ich mich doch schon mal etwas mehr damit beschäftigt und habe ein kleines bisschen rumgespielt. Dachte ich poste vllt mal hier meine Entwicklung des Ansatzes der vllt hilfreich für manch einem ist. Idee: Polygone irgendeiner Art (sei es konvex, konkav etc.) sollen als Massen behanelt werden und eine Anziehung auf den Spieler ausführen. Konzept: Man beschleunigt seinen Spieler in Richtung des Massenschwerpunkts S: Code: dx = S.x - x dy = S.y - y r = sqrt(dx*dx + dy*dy) F ~ 1 / r² F = m * a a.x = F / m * cos(w) a.y = F / m * sin(w) Das Problem: Man bekommt zwar eine radiale Beschleunigung hin und kann Planeten simulieren aber ich wollte irgendeine Art von Polygon nehmen. Also überlegt man sich erstmal wie das Polygon aufgebaut ist: Ein Polygon besteht aus mehreren Ortsvektoren. Anstatt nun zu S zu beschleunigen sucht man sich das S' einer Teilstrecke, nämlich der, die am nächsten zum Spieler liegt Code: A und B sind Ortsvektoren der Punkte: S'.x = (A.x + B.x) / 2 S'.y = (A.y + B.y) / 2 dx = S'.x - x dy = S'.y - y r = sqrt(...) ... am nächsten ist. Zu der soll nun beschleunigt werden. Also nimmt man den Vektor der senkrecht zum Schwerpunkt S', normalisiert ihn und bekommt somit einen Richtungsvektor, in der eine Teilbeschleunigung a' liegt. Code: p = (-S'.y, S'.x) p.x = p.x / |p| p.y = p.y / |p| a' zeigt in richtung p: (f irgendeine Proportionalitätskonstante für das Beschleunigen) a'.x = p.x * f a'.y = p.y * f eine Geschwindigkeit zu geben: Code: a.x = a1.x + ... + an.x a.y = a1.y + ... + an.y v.x += a.x v.y += a.y ![]() Hier nochmal ein Bild damit das ganze visuell auch ein bisschen näher kommt ![]() Das Ergebnis bis jetzt findet ihr im Anhang. Kritik und Verbesserungsvorschläge sind erwünscht, vorallem für Performance oder Berechnungen etc.
__________________ Currently working on: - --- --- ----------------------------------------------------------------- ActionScript 3.0, C++, Java, Delphi Geändert von _crypto_ (18-09-2008 um 18:36 Uhr) |
| | |
| | #2 (permalink) |
| Raven-Kid Registriert seit: Feb 2006
Beiträge: 350
|
Du könntest die Schwerpunkte aller Flächen zusammenfügen die einen bestimmten Winkel zu einander haben um so weniger Objekte durchtesten zu müssen. Sehr coole Sache jedenfalls ... bin gespannt wie es weiter geht €: ![]() So müsstest du nur die Anzahl der roten Punkte und nicht die Anzahl der Flächen durchgehen. Bei entsprechend wilder Oberfläche könnte das auch zu angenehmeren Ergebnissen führen, da die es scheinbar sanftere Übergänge gibt und nicht der Schwerpunkt von Fläche zu Fläche verschieden ist. Vll irr ich mich aber auch :P Geändert von [RK] (18-09-2008 um 13:12 Uhr) |
| | |
| | #3 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 1.573
|
Okay habe mir deine Idee mal angeschaut. Sie ist eigentlich eine gute Verbesserung. Wenn ich 2 benachbarte Flächen nehmen, deren Normale berechne und dann den Schnittpunkt der beiden errechn, bekomme ich den Schwerpunkt beider zusammen. Wenn man sich nun überlegt, wie das bei einem Kreis aussieht, ist klar alle schneiden sich im Mittelpunkt. Somit wird immer radial beschleunig, wie es bei einer Kreisbahn sowieso der Fall ist. Das einzige Problem, was ich sehe: wenn ich ein N-eck nehme, was bis jetzt immer der Fall ist, bleibt die Beschleunigung radial, da die Normalen immer den Schnittpunkt im Mittelpunkt haben. Bei einem 3-Eck wäre dsas aber eben wieder nicht so gut, da ich dann nicht senkrecht beschleunige und somit könnte ich z.b. nicht gerade hoch springen, wenn ich auf einer Fläche stände, sondern würde dann richtung mitte gleiten ...
__________________ Currently working on: - --- --- ----------------------------------------------------------------- ActionScript 3.0, C++, Java, Delphi Geändert von _crypto_ (18-09-2008 um 17:04 Uhr) |
| | |
| | #4 (permalink) |
| Raven-Kid Registriert seit: Feb 2006
Beiträge: 350
|
Hmm,... verstehe. Daran hab ich gar nicht gedacht. Das ist eig. bei jeder Form ein Problem nur beim 3 Eck am auffälligsten. Weil wenn du nun als Spielfigur versuchst an deiner (recht eckigen) Kugel nur entlang zu laufen ohne dabei zu springen sehe das wirklich nicht allzu gut aus. Allerdings doch wirklich nur dann. Sogesehen würde die Idee verschiedene Flächen zusammenzuschließen nur funktionieren, wenn ein gewisser Mindesabstand besteht. Fragt sich halt ob man nun eine elegante Möglichkeit findet das herrauszubekommen ohne den Performancgewinn gleich wieder zu nichte zu machen. Der Mindestabstand pro Fläche wäre ja sofern ich jetzt nicht ganz daneben liege die Strecke Eckpunkt einer Fläche - zu - den Schnittpunkt der Normalen. Welche praktischerweise eine Konstante wäre und nur einmal zu Beginn berechnet werden müsste. Sie ist nicht nur pro Fläche die gleiche sondern sie ist sogar für jeweils alle zusammengefassten Flächen gleich. (Radius eines Kreises) Sogesehen würde es wieder beim Durchgehen der Zusammengefassten Elemente bleiben, nur das zusätzlich geprüft wird wie weit die Figur entfernt ist (muss ja so oder so gemacht werden da ja die Gravitation quadratisch zur Entfernung abnimmt ) und im Fall, dass sie diesen Mindestabstand erreicht hat könnte man die Flächen durchgehen welche zusammengefasst wurden und so behandeln wie du es eben eh schon machst. Allerdings ist der Mindestabstand so gering (sofern das auch alles stimmt was ich mir da jetzt überlege), dass man vll sogar die Gravitationsberechnung sogar ignorrieren kann und nur noch prüfen muss wie der Vektor dieser Fläche läuft um die Spielfigur darauf richtig zu bewegen. €: Was auch recht tückisch dabei ist, dass wenn man recht zueinander flache Flächen zusammenfasst, einen Schnittpunkt der Normalen bekommt der unter umständen extrem weit weg ist, wodurch nat. nicht die Stärke der Gravitation beeinflusst werden darf. Geändert von [RK] (18-09-2008 um 18:52 Uhr) |
| | |
| | #5 (permalink) |
| Neuer User Registriert seit: Mar 2006
Beiträge: 1.573
|
hm aufjedenfall werd ich mich morgen mal dran setzen an ein paar weiteren ideen von wegen: - smootheres laufen auf den teilen (eventuell die ecken durch bezier-curven darstellen, damit man nicht abgehakt von fläche zu fläche läuft) - kollision, sollte mit SAT nicht schwer sein und den push-vektor rauszubekommen ist auch nicht schwer vllt bau ich das ganze auch auf André Michelles Physic Engine auf dann brauch ich mir um Kollision und Resolve erstmal keine Gedanken machen. Vielleicht mach ich mir aber auch eine eigene abgespeckte version, um sie möglichst performant zu tunen ![]() ja das mit den 2. parallelen treffen sich im unendlichen so in etwas ![]() das problem ist, das die kraft eben prop. zu 1/r² ist und damit müsste ich die kraft selber anders berechnen nur die beschleunigung senkrecht zu dem punkt oder so. soweit klapt das ganze ja wie gewollt, das ich auch "abstrakte" formen nehmen kann, die nicht einem runden planeten entsprechen (bei mario galaxy gibt es z.b. auch ulkige dinger )
__________________ Currently working on: - --- --- ----------------------------------------------------------------- ActionScript 3.0, C++, Java, Delphi Geändert von _crypto_ (18-09-2008 um 18:56 Uhr) |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |