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

![]() |
5k41Betreff: Die gute alte Kollision...-.-*JUHU CLOSED!!!!!!!* |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
Code: [AUSKLAPPEN] If rrp<0 Then rrp=rrp+360 rzp=Floor(rrp/2) 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
ZorroZ.ch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OK, sorry. ![]() |
||
User posted image |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hatte dieses Problem auch schon oft. Aber bei mir war der Übeltäter oft der bei mir sehr geringe Ordnungsfaktor. ![]() ![]() |
||
User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group