Formeln in VB (Kollisionssystem)

Moderatoren: Asifish, king-pat

Benutzeravatar
Asmodial
MIA Team Member
MIA Team Member
Beiträge: 900
Registriert: 19 Feb 2003, 21:44
Wohnort: Schweiz
Kontaktdaten:

Formeln in VB (Kollisionssystem)

Beitrag von Asmodial »

Morgen MIA,
ich glaube nicht, dass mir hier sehr viele helfen können (ausser Cali, der was zum Knobeln sucht :D), aber hier ist das Problem:

Sub Kollision(X As Double, Y As Double, Richtung As String)
Select Case Richtung
Case "Rechts": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).X - 40 <= Charakters(1).X Then Rechtsaus = True Else Rechtsaus = False
Case "Links": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).X + 40 >= Charakters(1).X Then Kollisi = True Else Kollisi = False
Case "Oben": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).Y + 40 >= Charakters(1).Y Then Kollisi = True Else Kollisi = False
Case "Unten": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).Y - 40 <= Charakters(1).Y Then Kollisi = True Else Kollisi = False
End Select

@Cali: Die Select Case hab ich nur im Moment drin, dass ich den Überblick behalten kann.

Ich erkläre die Formel mal für die anderen, damit sie evtl. auch mitknobeln dürfen ;)
Also, es sieht folgendermassen aus:
An diese Funktion werden Angaben der Charakter-Position und je nach zu prüfender Richtung die Map-Position, also Charakterposition X + 1 z.B.
Machen wir das Beispiel für die rechte Seite:
Die X-Werte werden durch 40 geteilt und abgerundet. Dann wird 1 dazugezählt. Somit hat man die X-Koordinate des Prüfobjiekts. Jetzt sind wir in der Funktion. Zuerst wird geprüft, ob das Objekt überhaupt blockt.
Jetzt würde es eigentlich schon funktionieren, aber es fehlt der Feinschliff, deshalb wird noch geprüft, ob der Abstand zum Objekt kleinergleich 40 ist -> Kollision. An den Unteren Ecken funktioniert das wunderbar, aber durch die oberen Ecken kann man einfach so durchlaufen. Dann füge ich eben noch etwas ein:
If Charakters(1).Y / 40 >= Y Then Kollision
Hier wird geprüft, ob der Abstand von Charakter Y zu Objekt Y kleiner als 40 ist, damit man nicht einfach an der oberen Ecke durchlaufen kann. Funktioniert aber nicht! Ich habe alle möglichen Formeln versucht, aber es geht einfach nicht! (Ach ja, hier wird Charakter Y nicht abgerundet, damit es genau wird.)

In 20 Minuten bin ich 1 Woche weg, nehme Laptop mit, suche nen Hotspot :) Bis denne und danke falls einer Antwortet...
Benutzeravatar
Asmodial
MIA Team Member
MIA Team Member
Beiträge: 900
Registriert: 19 Feb 2003, 21:44
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Asmodial »

Wie würdest du das Koordinatensystem machen? Ich hab nirgendwo was gefunden, dabei sollte sowas doch das einfachste sein...
Benutzeravatar
smashIt
MIA V.I.P.
MIA V.I.P.
Beiträge: 253
Registriert: 08 Mär 2003, 19:21
Spielt gerade: PS0
Mass Effect 1
Wohnort: oberösterreich
Kontaktdaten:

Beitrag von smashIt »

könnts daran liegen das du für rechts die fariable rechtsaus verwendest und bei den anderen kollisi?
außerdem würd ich statt
Objekt(X, Y).X - 40 <= Charakters(1).X
Objekt(X, Y).X - Charakters(1).X <= Mindestabstand
machen, und den mindestabstand irgendwo zentral setzen.

und allen voran: lern lieber ne ordentliche sprache ;)

aber noch n alternativ-weg:
es gibt doch sicher so vorgefertigte methoden und objekte für rechteckige regionen.
die haben dann meist auch ne funktion die die schnittfläche aus beiden zurückgibt. dann brauchst nur noch schaun obs die schnittfläche gibt oder nicht.
Ordnung ist etwas für Kleingeister, das Genie überblickt das Chaos!

Bild
Benutzeravatar
Asmodial
MIA Team Member
MIA Team Member
Beiträge: 900
Registriert: 19 Feb 2003, 21:44
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Asmodial »

Thx, probier ich gleich.
Es gibt vorgefertigte Methoden, aber dann müsste ich in jedem Durchlauf die ganze Map abfragen und das stinkt ;)
Ich bleib bei VB. C++ kann ich zwar auch (wenn auch nicht so gut wie VB) aber VB ist einfacher und bei den Formeln wirds in C++ auch nicht besser. Ausserdem scheint VB in Schweizerfirmen beliebt zu sein.
Ricao

Re: Formeln in VB (Kollisionssystem)

Beitrag von Ricao »

Asmodial hat geschrieben:Sub Kollision(X As Double, Y As Double, Richtung As String)
Select Case Richtung
Case "Rechts": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).X - 40 <= Charakters(1).X Then Rechtsaus = True Else Rechtsaus = False
Case "Links": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).X + 40 >= Charakters(1).X Then Kollisi = True Else Kollisi = False
Case "Oben": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).Y + 40 == Charakters(1).Y Then Kollisi = True Else Kollisi = False
Case "Unten": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).Y - 40 <= Charakters(1).Y Then Kollisi = True Else Kollisi = False
End Select
So?
Ricao

Beitrag von Ricao »

Is jetzt aus ner anderen Engine:

Variable 0001 = CharX
Variable 0002 = CharY

//sind comments

Code: Alles auswählen

<>FORK Optn:Varb[0001:CharX]-47above  //wenn 0001 X  über 47 dann gehe weiter, ansonsten END.
 <>FORK Optn:Varb[0002:CharY]-9above   //wenn 0002 Y über 9 gehe weiter, ansonsten END
  <>FORK Optn:Varb[0001:CharX]-271less  //wenn 0001 X weniger als 271 gehe weiter..
   <>FORK Optn:Varb[0002:CharY]-38less
Müsste ein Feld erschaffen.
Kann sein dass du statt above less und statt less above einsetzen musst.

Müsste/Könnte bei dir dann:
(ich hab meine genommen)

Code: Alles auswählen

Sub Kollision(X As Double, Y As Double, Richtung As String) 
Select Case Richtung 
Case "Rechts": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).X - 271 <= Charakters(1).X Then Kollisi = True Else Kollisi = False 
Case "Unten": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).Y - 38 <= Charakters(1).Y Then Kollisi = True Else Kollisi = False 
Case "Links": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).X + 47 >= Charakters(1).X Then Kollisi = True Else Kollisi = False 
Case "Oben": If Objekt(X, Y).Bild = "G" And Objekt(X, Y).Y + 9 >= Charakters(1).Y Then Kollisi = True Else Kollisi = False 

End Select 
Benutzeravatar
Asmodial
MIA Team Member
MIA Team Member
Beiträge: 900
Registriert: 19 Feb 2003, 21:44
Wohnort: Schweiz
Kontaktdaten:

Beitrag von Asmodial »

Danke für die Antworten.
Ich habe das Problem gefunden, und das wird wohl etwas schwieriger.
Folgendes: Wenn man die ganze Map abfragt, welche Objekte blocken und dann prüft, ob der Charakter neben ihnen steht, funktioniert das nicht. Also habe ich daraus ein Minikoordinatensystem gemacht. Bei jedem Durchgang wird die Position der Charaktere durch die grösse der Texturen (Jetzt: 25 Pixel) geteilt und danach abgerundet. Das Problem liegt darin, dass nur ein Feld abgefragt wird und bei jedem halben Feld der Wert verändert wird.
Daher kann man zur Hälfte durch die Wände laufen... Irgendwelche Vorschläge? Oder Vorschläge wie ich das mit nem anderen Koordinatensystem oder was weiss ich anstellen könnte?
Ricao

Beitrag von Ricao »

Was wirds eigentlich? Ein 2-D oder ein 3-D Game?
Mein Skript is aus dem RPG Maker, also ein 2-D Game.
Antworten