Die gute alte Kollision...-.-*JUHU CLOSED!!!!!!!*

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

5k41

Betreff: Die gute alte Kollision...-.-*JUHU CLOSED!!!!!!!*

BeitragMo, Jan 02, 2006 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Sry das ich euch in letzter Zeit soviel nerv aber ich glaub das is echt die letzte Thread...
Ich hab wie gesacht ein Problem mit der Kollision kurz das Spielprinzip:
Fighters for Glory (das is der Name des Spiels) ist ein Splitscreengame in dem es darum geht den Gegner zu erledigen. Der erste Spieler wird per w,a,s,d gesteuert mit w und s bewegt man sich mit a und d dreht man sich... nun weiss ich nicht wie man eine Kollision dafür programmiert ich habs probiert indem ich einfach die gleiche Formel die ich bei der bewegung dazu rechne abzieh aber das problem ist nun das wenn ich mich drehe die Formel die per Sin und Cos errechnet wird sich ändert und eine schöne schlitterpartie durch alle erdenklichen wände anfäng...nun hab ich versuch alle drehungen in die mauer zu blocken aber irgendwie haut auch das nicht wirklich hin...nun weiss ich echt nicht wie ich das machen soll...
hier der codeausschnitt:Code: [AUSKLAPPEN]

If feld(x,y,i)=1 Then
    If ImagesCollide(tileset,x*64,y*64,1,player1(p1\winkel/2),(p1\x*(-1)+p1xpos),(p1\y*(-1)+ypos),0)=True Then
       If p1\richtung=0 Then
           p1\x=p1\x+(Sin(p1\winkel)*2)*(-1):p1\y=p1\y-(Cos(p1\winkel)*2)
        Else
            p1\x=p1\x+(Sin(p1\winkel)*2):p1\y=p1\y-(Cos(p1\winkel)*2)*(-1)
        EndIf
    EndIf
EndIf

Die Richtungsvariablen sind nur: 0 = vorwärts;1= rückwärts

DANKE FÜR ALLE ANTWORTEN!

PS: So war es bei einem Freund nun hab ich noch das Problem das er bei mir garnicht erst zu schlittern anfäng sondern gleich einen memory acess violation (oder wie das heiß) sagt...aber ich denke das eigentlich logischere wär das schlittern
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
  • Zuletzt bearbeitet von 5k41 am So, Jan 08, 2006 19:10, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jan 02, 2006 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Kollision auf die Tileset? Du musst erstmal prüfen auf wievielen Tiles sich die Spielfigur gleichzeitig befinden kann. Meistens sind es 4 Tiles... Diesen Umgebungsbereich musst du auf Kollision überprüfen und bei einer entsprechend darauf reagieren (Beispielsweise XPos=XPos-XGesch:YPos=YPos-YGesch:XGesch=-XGesch:YGesch=-YGesch).

/EDIT: Um Drehungen in die Mauer die nicht mit der Bewegung zu tun haben zu unterbinden, kann man auch die Drehung bei einer Kollision rückkängig machen...

5k41

BeitragMo, Jan 02, 2006 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
jo soweit bin ich auch schon nur die sache ist das ich ja oben meine lösung geschrieben hab und nicht weiss wieso oder was ich falsch gemacht hab...

~Edit~

Jo das mit der drehung hatte ich auch schon angefangen nur das problem ich ja das wenn schon nur das mit dem gegenlaufen nicht wirklich funktioniert der rest dann ja wohl auch nicht besser funzen wird...

~Edit 2~

Achso das hätte man jetzt missverstehen können...man soll sich wenn man vor einer wand steht sich immer noch drehen können halt nur nicht durch die wand gehen können...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 03, 2006 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem bei Tileskollision ist das man bei einer nicht genau weiß, aus welchem Winkel die Spielfigur auf das Tile getroffen hat. Somit kann man nicht so einfach eine Eintrittswinkel=Austrittswinkel programmieren. Bei einem alten Thrustklon habe ich bei einer Kollision die ursprünglichen Koordinaten und Winkel zurrück geschrieben und alle Geschwindigkeiten negiert und geviertelt. Somit sah es nicht so aus als würde das Raumschiff wie ein Flummi von der Wand abprallen falls es nicht schon kaputt war. Wenn man es aber schafft die Levelgestalltung so zu machen, daß jedes Tile nur von einer Seite 'getroffen' werden kann, dann kann man hinter jedem Tile eine weitere Winkelzahl eintragen nach welcher dann der Abprallwinkel berechnet wird. Ansonste fällt mir da keine andere Lösung zu ein...

/EDIT: zu ~Edit 2~ Die Drehung muß nach einer Kollision auch zurrückgeschrieben werden und eine eventuelle Geschwindigkeitvariable negiert werden.

5k41

BeitragDi, Jan 03, 2006 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das gefühl mein problem ist immer noch nicht ganz klar...desswegen nochmal:
Stell dir vor du läufst gegen eine wand...dann kannst du nicht mehr weiter nach vorne, aber du kannst dich noch solange drehen bis deine schulter die wand berührt in dem fall kannst du dich dann nur noch in die entgegengesetzte richtung drehen...und das ganz muss natürlich vorwärts wie rückwaärts klappen...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 03, 2006 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es sein, daß du bei einer Kollision die Bewegung nur stopst aber nicht rückgängig machst? Also nach einer Kollision muß erstmal die komplette Bewegung rückgängig gemacht werden, so das es eigendlich nie zu einer sichtbaren Kollision kommt. Dann kann der Spieler sich auch drehen, bis seine Schulter wieder die Wand beim wegdrehen berührt.

5k41

BeitragDi, Jan 03, 2006 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
wiebitte`? sry das hab ich jetzt nicht verstanden kannst du mir vielleicht ein kleines beispiel (mit beiden möglichkeiten) schreiben? glaube das is das einfachste...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 03, 2006 2:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist nicht optimiert, aber es funzt schon mal...Code: [AUSKLAPPEN]
Graphics 320,320,0,2
SetBuffer BackBuffer()
TFormFilter 0

Dim xy(9,9) ;Map

xp#=64 ;X-Position des Spielers
yp#=64 ;Y-Position des Spielers
gg%=0  ;Temporäre Spielergeschwindigkeit
rp%=90 ;Rotationsposition des Spielers
rg%=0  ;Temopräre Spielerrotationsgeschwindigkeit

;Map lesen
For y=0 To 9
 For x=0 To 9
  Read xy(x,y)
 Next
Next

Data 1,1,1,1,1,1,1,1,1,1
Data 1,0,0,1,0,0,0,0,0,1
Data 1,0,0,1,0,0,0,0,0,1
Data 1,0,0,1,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,1,0,0,1
Data 1,0,0,0,0,0,1,0,0,1
Data 1,0,0,0,0,0,1,0,0,1
Data 1,1,1,1,1,1,1,1,1,1

;Mapgrafik
Color 255,255,255
Rect 32,0,32,32,1
bg=CreateImage(32,32,2)
GrabImage bg,0,0,0
GrabImage bg,32,0,1
Cls

;Spielergrafik
Color 255,0,0
Rect 2,10,28,12,1
Color 255,255,0
Rect 14,4,4,10,1
sp=CreateImage(32,32,180)
spt1=CreateImage(32,32)
GrabImage spt1,0,0
MidHandle spt1
For q=0 To 179
 spt2=CopyImage(spt1)
 RotateImage spt2,90+q*2
 DrawBlock spt2,16,16
 GrabImage sp,0,0,q
Next
Cls




;Hauptschleife
While Not KeyHit(1)

 rg=0
 gg=0
 If KeyDown(203) Then rg=-2
 If KeyDown(205) Then rg=+2
 If KeyDown(200) Then gg=+1
 If KeyDown(208) Then gg=-1
 rp=rp+rg
 If rp>358 Then rp=0
 If rp<0 Then rp=358
 xp=xp+Cos(rp)*gg
 yp=yp+Sin(rp)*gg

 For y=0 To 9
  For x=0 To 9
   If xy(x,y)=1 Then
    DrawImage bg,x*32,y*32,1
    If ImagesCollide (bg,x*32,y*32,1,sp,xp,yp,rp/2) Then
     rg=-rg
     gg=-gg
     rp=rp+rg
     If rp>358 Then rp=0
     If rp<0 Then rp=358
     xp=xp+Cos(rp)*gg
     yp=yp+Sin(rp)*gg
    End If
   End If
  Next
 Next

 DrawImage sp,xp,yp,rp/2

 Flip
 Cls
Wend
End

5k41

BeitragDi, Jan 03, 2006 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
mh ok ich versteh was du meinst...ich glaub so hab ich das auch gemacht wobei ich nur halt (in deinem fall) das normal rg genommen hab und *(-1) dahinter gesetzt hab...ich werd nu erstmal versuchen den teil mit der kollision bei dem ich bin fertig zu schreiben und dabei deine idee zu bercksichtigen...ich meld mich wenn ich soweit bin...danke schonmal!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

5k41

BeitragDi, Jan 03, 2006 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
so...ich bin nun schon ein bisschen weiter jetzt wäre es mir nur noch eine große hilfe wenn ihr mir sagen könntet wo der fehler bei dieser abfrage liegt...er sagt immer einen fehler wenn der winkel der figur auf 24 oder 336(-360 = -24) ist (auch wenn die figur mit nichts kollidiert...-.-)
Code: [AUSKLAPPEN]

   If ImagesCollide(tileset,x*64,y*64,z,player1(p1\winkel/2),(p1\x*(-1)+p1xpos),(p1\y*(-1)+ypos),0) Then

zur erläuterung: x,y sind variablen aus for schleifen, um die position des tiles festzustellen z ist die variable die alle kollisionsbilder der tilesets durchgeht p1\winkel ist der winkel der figur, welcher durch 2 geteilt werden muss da ich die figur um nur 180° dafür aber in 2° schritten drehen lass ( er rechnet aber auch bei einem tastendruch immer 2 dazu damit keine zahl rauskommt, welche nicht durch 2 teilbar ist) p1\x + p1\y sind die map positionen (da sich ja die map und nicht der player bewegt) joa glaub das war alles^^

~Edit~
HILFE! Nun wird das immer komischer...als ich eben nur mal so aus jucks den dubugger deaktivierte konnte ich mich auf einmal nach links über 336° hinaus drehen und er verreckte erst etwas später (bei wieviel grad genau kann ich net sagen hatte ja den debugger aus) nach rechts war alles wie immer als ich ihn wieder anschaltete wars wieder normal er verreckte bei 336° wieso?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

5k41

BeitragDi, Jan 03, 2006 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh eingentlich hat ich nicht vor selbstgespräche zu führen aber mir ist grad noch aufgefallen das es irgendwas mit dem winkel zutun haben muss ich hab da grad mal einfach ne 0 hingeschrieben und (zumindest mit dem frame) funtze alles gut...

~Edit~
Was mir grad noch einfällt...ich hab ein midhandle auf die player-grafik kann das daran liegen?och leute meldet euch *heul*...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 03, 2006 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi 5k41, probiere mal den Winkel nicht über 360° und unter 0° zusteuern. Das geht zum Beispiel mit...

Winkel = Winkel Mod 360

oder auch...

If Winkel > 360 then Winkel = Winkel - 360
If Winkel < 0 then Winkel = Winkel + 360

Wenn der Winkel drüber/drunter ist dann kann keine Kollision durchgeführt werden, da es das Frame dazu nicht gibt...

5k41

BeitragDi, Jan 03, 2006 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal DANKE FÜR DIE ANTWORT ! ich verzweifel hier schon...^^ der winkel wird generell nur on 0 bis 360 benutzt... das mit dem -24 war nur ein beispiel um zuzeigen das es genau bei der gleichen gradzahl nur in der andern richtung auch so is...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jan 04, 2006 2:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Lege dir mal die p1\winkel -Variable vor der ImagesCollide-Abfrage mit Text dar. Ich würde mal darauf tipen, daß die Variable über den gewünschten Wert kommt. Ausserdem muß keine Ganzzahl zur Auswahl eines Bildes aus AnimImage gegeben sein. Du kannst ruhig auch Float-Variablen dazu benutzen wenn es für dich von Vorteil ist. Die Umrechnung macht BB dann von alleine. Wichtig ist nur das beispielsweise aus 360.004/2 nicht 181 wird. Da es dieses Bild nicht gibt, nehme ich an. Folgendes habe ich aus einem uraltem Thrust-Klon entnommen...Code: [AUSKLAPPEN]
 If rrp>360 Then rrp=rrp-360
 If rrp<0 Then rrp=rrp+360
 rzp=Floor(rrp/2)
Code: [AUSKLAPPEN]
If ImagesCollide(tiles,x*64-dvx,y*64-dvy,blk,raums,488,360,rzp) Then
rrp = Raumschiff Rotations Position
rzp = Raumschiff Zeichen Position (Image aus AnimImage)
Alle Variablen sind Float, da man mit dem Raumschiff beschleunigen kann wie mit der Geschwindigkeit als auch mit dem Drehimpuls. Der Energieerhaltungssatz wird hierbei berücksichtigt. Die If-Abfragen könnten bei 'Bedingung erfüllt' den Wert 360° bzw 0° auch festlegen, würde aber ein hacken bei einer fliessender Rotationsbewegung hervorrufen können. //EDIT: Der Code funzt einwandfrei!

5k41

BeitragDo, Jan 05, 2006 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit text mach ich und es is immer die gleiche gradzahl und sowieso muss ich es net anzeigen lassen, da ich eine recht neue BB version hab, welche einen Debugger hat in dem man wenn ein Fehler kommt alles Variabel angucken kann...und zu der winkelberechnung: es gibt bei mir NUR integer beim winkel und nicht mehr als 360° und net weniger als null das heißt das ist auch ausgeschlossen...nun kommt noch ein neues mysterium dazu und zwar hab ich gestern das ganze mal bei einem freund ausprobiert und bei ihm sinds net 24 und 336 grad sondern 166 und 204 grad...ich versteh echt die welt nichtmehr...ich glaub ich fang mit dem ganzen projekt von vorn an... das macht echt keinen sinn mehr im moment... Crying or Very sad
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

ZorroZ.ch

BeitragDo, Jan 05, 2006 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte eigentlich nicht in diese Thema hereinplatzen. Aber einfach nur zur Ergänzung zu hectic's-Code. Du solltes sehr vorsichtig damit sein, ich würde den Code durch folgendes ersetzten:

Code: [AUSKLAPPEN]
If winkel > 360 Then winkel = 0
If winkel < 0 then winkel = 360


Ansonsten könnte es vorkommen, dass du beim Addieren von einem grösseren Wert als 1 (z.B. 7) auf 367° kommst. Die If-Schlaufe würde auch erfolgreich in die Bahnen geleitet. Am Ende hättest du aber den Wert

Code: [AUSKLAPPEN]
winkel = 7
User posted image

5k41

BeitragDo, Jan 05, 2006 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
lol^^...sry aber langsam kommts mir so vor als würde mir keiner wirklich zuhören..-.-

5k41 hat Folgendes geschrieben:
es gibt bei mir NUR integer beim winkel und nicht mehr als 360° und net weniger als null das heißt das ist auch ausgeschlossen...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

ZorroZ.ch

BeitragDo, Jan 05, 2006 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, sorry. Wink Ich erwähnte ja, dass ich mich nur auf diesen einen Code beziehe und den Rest nur am Rande überflogen habe.
User posted image

5k41

BeitragDo, Jan 05, 2006 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
ne is schon ok ich bin auch ein bisschen gereitzt nun wo alles so komisch kaputt is...ich glaub echt ich fang nochma von vorn an...-.-
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

ZorroZ.ch

BeitragDo, Jan 05, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte dieses Problem auch schon oft. Aber bei mir war der Übeltäter oft der bei mir sehr geringe Ordnungsfaktor. Very Happy Ich ging im Nachhinein noch einmal durch den kompletten Code, setzte bessere Namen für die Variablen und teilte in den besten Fällen noch mehr IF-Bedingungen ein und setzte formatierte den Code auch übersichtlicher mit Tabs. Ich empfehl's dir Wink
User posted image

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group