Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 17-09-2008, 20:02   #1 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
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)
Wobei der Winkel w der Winkel zwischen den beiden Punkten ist.

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(...)

...
Nun nimmt man das kürzeste r und hat somit die Fläche, die dem Spieler
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
Zum schluss sumiert man einfach alle Teilbeschleunigungen um dem Spieler
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.
Angehängte Dateien
Dateityp: rar Konzept.rar (8,4 KB, 27x aufgerufen)
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (18-09-2008 um 18:36 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 18-09-2008, 12:58   #2 (permalink)
Raven-Kid
 
Benutzerbild von [RK]
 
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)
[RK] ist offline   Mit Zitat antworten
Alt 18-09-2008, 16:01   #3 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
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)
_crypto_ ist offline   Mit Zitat antworten
Alt 18-09-2008, 18:45   #4 (permalink)
Raven-Kid
 
Benutzerbild von [RK]
 
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)
[RK] ist offline   Mit Zitat antworten
Alt 18-09-2008, 18:53   #5 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
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)
_crypto_ ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

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



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele