PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein KS



Pherim
22.12.2003, 19:58
Ich hab mich jetzt auch dazu entschlossen, ein eigenes KS für mein Spiel zu machen, und zwar ein strategisches auf Rundenbasis. Das ist so gedacht, dass man die Chars auch bewegen kann und man die Umgebung taktisch nutzen kann, z.B um Deckung zu suchen oder um von einem erhähten Standpunt zu feuern. Dabei soll jeder Held in jeder Runde eine bestimmte Anzahl Aktionspunkte haben, die er für verschiedene Aktionen nutzen kann, z.B. ein Feld bewegen kostet 1 Punkt.

Da ich damit gerade erst angefangen habe, und schon vor Problemen stehe, hab ich diesen Thread eröffnet, da ich mit Sicherheit in nächster Zeit noch mehr Schwierigkeiten bekomme.
Mein aktuelles Problem: Die Unterscheidung von Nah- und Fernkampf. Nahkampf soll logischerweise nur möglich sein, wenn sich der Hero direkt neben einem Gegner befindet, bloß weiß ich nicht genau, wie ich das amchen soll. Wenn ich über eine variable die Positionen der beiden Events abfrage, kann ich sie leider nicht in der Hinsicht vergleichen, dass sie nur um 1 voneinander abweichen, was ja der Fall wäre, wenn die beiden Events nebeneinander stehen. Wenn das doch geht, sagt mir bitte, wie ,oder gebt mir andere Möglichkeite, wie ich das machen kann! Danke schon mal!

TheByteRaper
22.12.2003, 20:21
Hm das kommt darauf an, mit was du die Positionen der beiden Events abfragst: entweder mit X/Y-Coordinate oder mit Scene-X/Y. Der Unterschied darin liegt, dass die Coordinates nach den Tiles berechnet wird, also auf welchem Tile das Event steht. Scene-X/Y hingegen holt sich die Bildpunkte aus dem Spielfenster heraus (also maximal x: 320 und y: 240).
Ich hoff, du weisst erst mal den Unterschied, ist ein wenig holprig erklärt, ich weiss ^^°

Gut, wie kannst du nun die Entfernung abfragen. Das ist eigentlich sehr einfach.
Du musst dir erst die differenz der jeweiligen X- oder Y-Koordinaten abfragen, also



Set Variable (Event1-X) Set (this Event) SceneX
Set Variable (Event1-Y) Set (this Event) SceneY
//damit holst du dir erst mal X und Y deines aktuellen Events.
//anstatt "this Event" kannst du auch dein gemeintes Event
//hernehmen.
//Zudem bevorzuge ich persönlich "SceneX/Y", wiel du damit viel genauer
// rechnen kannst.

Set Variable (Event2-X) Set (Enemy1) SceneX
Set Variable (Event2-Y) Set (Enemy1) SceneY
//X und Y des Gegners, wiederum kannst du die Variablen
//und das Event nennen, wie du willst.

Set Variable (Event1-X) - (Event2-X)
Set Varialbe (Event1-Y) - (Event2-Y)
//damit rechnest du dir die Distanz der 2 Events aus.

Fork (if Event1-X < 0)
Set Variable (Event1-X) * (-1)
End Case
Fork (if Event1-Y < 0)
Set Variable (Event1-Y) * (-1)
End Case
//damit fragst du ab, ob die Distanz der beiden Events
//negativ ist, es kommt ja darauf an, ob du dich einem Event von
//oben oder von unten, von links oder von rechts näherst.
//Und daher wird "sicherheitshalber" die Zahl invertiert, also
// * -1 gerechnet, so bekommst du auf jeden Fall positive Zahlen.

Fork (if Event1-X <= 15)
Fork (if Event1-Y <= 15)
//das was du machen willst, wenn du ein Feld entfernt bist
//wenn die Distand <= 15 ist, dann bist du genau ein Feld
//von deinem Gegner entfernt.
End Case
End Case


Ich glaube, so müsste es jedenfalls theoretisch stimmen. Hab mal im Pseudocode geschrieben...
Ich hoff mal, dass das für nen Anstoss hilft ^^°

Nachteil bei dieser Methode: Du müsstest eine Prozedur schreiben, die die Entfernung von deinem "Helden" zu JEDEM Gegnerevent ausrechnet, und das können viele Variablen werden mit der Zeit. Stell dir mal vor, du hast 20 Gegner rumlaufen ^^° Also entweder Gegneranzahl pro Map beschränken, oder warten, bis jemand anderer nen besseren Vorschlag postet -_- ... oder du findest einen anderen Weg oder hast shcon eine Idee, wie du das anstellen willst ^^

Pherim
22.12.2003, 21:59
Hmm, so ganz funktionert das nicht, fürchte ich. ich verstehe auch nicht, warum am Ende was mit <=15 rauskommen muss.... Was ist denn eigentlich <= dabei? < ist smaller, ist <= below? Bis jetzt funktioniert das jedenfalls nicht.

TheByteRaper
22.12.2003, 23:18
Das <= ist "below", ja.
Und 15 deswegen, weil du ja was passieren lassen willst, wenn dein Held ein Tile entfernt ist (also ein solches Quadrat halt ^^). Da ein Tile bekanntlich 16x16 Pixel gross ist, ist das die Bedingung für die Distanz:
Ist die Distanz kleiner oder gleich 15 (eigentlich trifft die Bedingung "gleich" mehr zu, wiel wenns kleiner wär, müsstest du schon auf dem Gegner stehen ^^), dann bist du ein Feld von deinem Gegner entfernt.

Naja, warums nicht funktioniert, kann ich auch gerade nicht sagen, 1:1 muss es nicht funktionieren, war ja nur so ein Gedankengang, sollte der Inspiration gelten. Aber warum genau, kann ich per Ferndiagnose nicht feststellen ^^
Ich benutze dieses System jedenfalls erfolgreich ^^°

Maisaffe
22.12.2003, 23:25
du musst die variablen X sowie Y mit dem Wert deines Charakters und des Gegners vergleichen lassen.
Wenn dabei der X Wert des Helden größer ist als der X Wert des Gegner, steht also der Hero rechts vom Gegner.
Dann machst du eine neue Variable die den X Wert des Gegners mit eins verrechnet. ->[ X-Gegner + 1 ]
Jetzt machst du noch eine X Variable die den Wert des Heros minus den Wert des Gegners verrechnte. -> [X-Gegner - X-Hero]
Der Wert von [X-Gegner - X-Hero] sollte 1 Ergeben. Wenn es eine größere oder kleinere Zahl ergibt, steht der Hero entweder links oder rechts vom Gegner entfernt. -> [Fernatacke]

Das ganze musst du dann auch mit Y-Variablen machen.

trifft keine X oder Y Variable zusammen... dann ist der Fernangriff eher Quer ausführbar- also nicht auf der selben "Grundlinie".

Ich hoffe du verstehst was ich meine- ´s kompliziert.

Pherim
23.12.2003, 14:37
Ok, geht jetzt doch mit dem System von Byte-Reaper, hatte die Forks etwas durcheinandergebracht.

Weitere Probleme folgen in Kürze;) !

Nightmares Sphere
26.12.2003, 01:06
Machst du das KS in einen Extra-Bildschirm oder direkt von der Map aus? Letzteres ist nämlich eine ganze Ecke schwerer, ich weiss nicht, ob dir bewusst ist, worauf du dich da einlässt...
Sphere

Pherim
26.12.2003, 13:32
Nein, ich machs in einen Extra-Bildschirm. Und ich bin noch nicht sicher, ob das was wird, will erst nur aml wissen obs überhaupt geht. und bis jetzt klappts ganz gut.

Pherim
29.12.2003, 15:09
Nächstes Problem:

Ich möchte, dass zu Beginn jedes Kampfes jeder Held und jeder Gegner einen "Initiative-Wurf" macht, und dass dann der mit dem höchten Wert anfängt, dann ist der mit dem nächsthöheren Wert dran... und so weiter bis zu dem, der den niedrigsten Wert hat. Das Ermitteln der Werte ist kein Problem, die Reihenfolge allerdings schon. wer kann mir helfen?

Dhan
29.12.2003, 18:11
Du machst ein Script, das prüft, welcher Wert höher ist, anschließend setzt es passend eine Variable, das Event, welches die Angriffe koordiniert, hat mehrere Seiten, die sich nach der Variable richten.

btw, zur vorigen Frage, wieso eigentlich die genaue Position? Die Chip-Position genügt doch?

Pherim
29.12.2003, 22:46
Ach ja, so gehts bestimmt, danke.

Was verstehst du unter Chip-Position?

Pherim
31.12.2003, 14:10
Ähhh... Moment mal, kann es sein, dass dieses Event, wenn ich die vier Heros habe und auch nur einen einzigen Gegner, ungefähr 120 Seiten braucht? Wenn ich mich nicht irre gibts dann nämlich so viele Möglichkeiten für die Reihenfolge... Geht das nicht auch ein bisschen kürzer?

Dhan
31.12.2003, 19:59
Du kannst es folgendermaßen machen: die Reihenfolge ist in Varis gespeichert.

Jede Figur, ob Held oder Monster, hat eine Nummer.
Am Anfang entspricht Reihenfolge der Nummer.
Dann machst du folgendes:

Erst wird der Switch Änderung auf off gesetzt (der Sinn kommt später)
dann werden per Call-Event die Initiativwerte der Figuren auf erstem und zweitem Platz ermittelt, wenn der zweite einen höheren Wert hat, werden die Plätze getauscht und Änderung auf on gesetzt
dasselbe geschieht nun mit allen Plätzen bis du mit vorletztem und letztem Platz gearbeitet hast.
Dann fragt es ab, ob Änderung auf on ist, wenn ja, wird das ganze wieder an den Anfang gesetzt
Dann wird der Switch Reihenfolge auf on gesetzt, wodurch bei diesem Event die zweite Seite aktiviert wird.
diese Seite hat folgendes:
Erst frägt sie ab, ob die Variable des ersten Platzes 0 beträgt, 0 bedeutet keine Figur, wenn ja, ist eine Kampfrunde zuende und die Nächste beginnt (wieder das Ganze von vorne)
Wenn nicht, dann wird die Variable Handelndefigur auf die des ersten Platzes gesetzt
Anschließend bekommt der erste Platz die Figurennummer des zweiten, der zweiten des dritten usw, der letzte Platz bekommt die Nummer 0.

Das Event hat nun für jede Figur eine Seite, die durch die Variable Handelndefigur bestimmt wird und das Script der jeweiligen Figur beinhaltet. Nach dem Script wird Handelndefigur auf 0 gesetzt


Mehr brauchs garnet. Ich hoffe mal, es funktioniert so.

Pherim
01.01.2004, 01:00
Ob deine Idee funktioniert weiß ich nicht, weil ich es noch nicht ausprobiert habe. Mittlerweile hatte ich eine eigene Idee: Am Anfang wird für jeden beteiligten die Initiative-Variable festgelegt. Dann folgt noch eine zusätzliche Variable, die auf einen Wert gesetzt wird,der höher liegt, als die Initiative sein kann. Ein parallel process event regelt dann die reihenfolge: zuerst wird diese variable um 1 verringert, dann werden alle Initiativewert mit ihr verglichen, zum schluss wird überprüft, ob die Variable 0 ist. Dann geht das wieder von vorne los, bis ein Initiativewert der Variable entspricht, wodurch die dazugehörige Person automatisch an der reihe ist. Wenn die Figur seinen zug vollendet hat, geht es weiter, d.h. da kein andeer initiativewert mehr übereinstimmt geht es wieder von vorne los, bis der nächste wert erreicht ist. So kommen alle nacheiander dran. Sobald die Vergleichsvariable 0 erreicht hat, wird sie wieder hochgesetzt und eine neue Runde beginnt.

Dhan
01.01.2004, 01:11
Auch eine gute Möglichkeit ^^

bloody
01.01.2004, 20:33
Man könnte es ja durch eine art sichtfeld lösen in dem per forcs abgefragt wird ob dort ein hinderniss ist.Wäre recht aufwendig zu skripten aber eine möglichkeit!

Dhan
01.01.2004, 22:33
Kann man machen, aber dann ist das Problem, wer als erster angreift, überhaupt nicht gelöst, bloody ^^
Thread ganz lesen, dann posten

Pherim
10.01.2004, 22:25
Die Reihenfolge hab ich jetzt, Nah- und Fernkampf funktionieren auch, jetzt hab ich mal gedacht, ich mach mich mal an die KI. Dazu brauchen meine Monster natürlich zuerst ein ausgefeiltes Routefinding. Mit einem oder zwei Hindernissen pro Kampfschauplatz ist das kein Problem, aber was, wenn ich felsen, Gebäude, Bäume etc. haben will, wie in den normalen Karten auch? Die Kampfschauplätze sollen natürlich genau so aussehen, wie die Umgebung, in der man sich befindet. Gibt es einen etwas einfacheren Weg, als bei jedem Schritt zu überprüfen, ob irgendein Hindernis zwischen dem Monster und dem Char, den es angreift, gibt? Vielleicht Wegpunkte, oder sowas?
Wenn das ganze zu kompliziert und langwierig wird, muss ich wohl aufgeben, denn sonst habe ich keine Chance, das Spiel irgendwann mal fertig zu kriegen. Mir graut es jetzt schon vor solchen Dingen wie Inventar und Fähigkeiten und sowas...

Pherim
15.01.2004, 01:17
Kann mir niemand mit dem Routefinding helfen?

bloody
15.01.2004, 01:28
@Dhan ich wollte nur was zum ersten problem posten ich habe den theadre gelesen und da ich nur auf das erste problem eine antwort wusste habe ich die gepostet da die IMO besser ist als die anderen.

@Problem:Also ich weiss jetzt das leider nicht so genau aber man könnte es so machen das beim auswählen oder wenn die Figur ausgewählt wird die felder aufleuchten welche man betreten kann und natürlich die reichweite wie weit man gehen kann,jetzt wählt man mit einem cursor aus wo die Figur sich hinbewegen soll jetzt fragse die X,Y position des cursors löscht diesen und setzt dort per set event place die Figur hin am besten mit einer kleinen animation,das ist zwar nicht ganz sp hüpsch aber ich finde es gut und auch ansprechend.Oder schau dir das mauskript im tastaturpatch an dort ist sowas eingebaut.:)

Pherim
15.01.2004, 22:54
Danke, ich wollte eigentlich wissen, wie ich die Wegfindung der Gegner machen soll. Die eigenen Figuren bewegt man wie im normalen Spiel, nur dass bei jedem Schritt ein Aktionspunkt verbraucht wird.
Allerdings könnte ich es so probieren, bloß leider würden die Hindernisse dann ihre Bedeutung verlieren.

Pherim
19.01.2004, 20:46
Sorry dass ich schon zum 3. Mal frage, aber ich weiß echt nicht, wie ich das machen soll.

Maisaffe
19.01.2004, 23:57
mache für jeden hero und für jeden emnemy eine x/y abfrage und stelle ein, das wenn zB. [Enemy01] über das Feld [3/6] läuft, das der Enemy automatisch nach oben dirigiert wird.Wenn dieser Weg versperrt ist, stellst du ein, das der [Enemy] nach unten läuft usw.

Hoffe das ich dir damit ein bischen auf die Sprünge geholfen habe ;) ;)

Pherim
20.01.2004, 02:59
Ok, bei Hindernissen die ein Feld groß sind geht das schon gan gut, danke. Mal sehen, wie ich das bei größeren Hindernissen mache.

Maisaffe
20.01.2004, 03:07
Original geschrieben von Pherim
Ok, bei Hindernissen die ein Feld groß sind geht das schon gan gut, danke. Mal sehen, wie ich das bei größeren Hindernissen mache.

dort machst du es am besten auch so, nur das der enemy dann nicht wieder nach oben läuft wenn er von oben kamm ;)

Pherim
20.01.2004, 22:21
Am Besten amche ich ein Move Event, das den gegner schon ganz um das Hindenis bringt, natürlich unter Berücksichtigung der verbliebenen Aktionspunkte.

Pherim
21.01.2004, 22:54
Ja, nächstes Problem: Wen sich ein Gegner oder Hero neben ein Hindernis stellt, kann ein anderer Gegner ihn oder das Hindernis evtl nicht mehr umgehen, weil er nicht weiß ob er nach rechts oder links bzw oben oder unten gehen muss...