Wie mach ich ne Stinknormale Kollision *nichtweiterkann*
Übersicht

VirusBetreff: Wie mach ich ne Stinknormale Kollision *nichtweiterkann* |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also mal angenommen in der Mitte von einem Raum (2D) ist ein Quadrat
das man nicht betreten kann. Der Spieler soll davor einfach anhalten. Ich will kein RPG machen, nehmen wir auch an, der Spieler ist ein Fahrzeug. Soll ich das vielleicht mit Tiles lösen? Aber ich will eine Pixel/Pixel bewegung haben... Wie mach ich das? Danke |
||
www.legacy.de |
![]() |
Blitzard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also wenn du eine kollision haben möchtest guck dir die befehle
ImagesCollide ImagesOverlap an. |
||
User posted image |
Virus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
und was soll ich dann mit den befehlen?
If RectsCollide(das quadrat,das auto) then auto\X = rand(100) |
||
www.legacy.de |
![]() |
Yankee |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi,
vielleicht hilft dir ja der code weiter mit deinen collisionen. [diese kollisionsart könnte man auch bei einem RPG benutzen...(denke ich)] Code: [AUSKLAPPEN] Graphics 640,480 Global x_back = 0 Global y_back = 0 Global ich_x = 100 Global ich_y = 200 ;das "ich" bild erstellen Global ich = CreateImage(49,49) SetBuffer ImageBuffer(ich) Color 255,0,100 Rect 0,0,50,50,1 ;das viereck in der mitte bild erstellen Global viereck = CreateImage(49,49) SetBuffer ImageBuffer(viereck) Color 0,255,100 Rect 0,0,50,50,1 SetBuffer BackBuffer() While Not KeyHit(1) Cls x_back = 0 y_back = 0 tasten() kollision() DrawImage ich,ich_x,ich_y DrawImage viereck,300,200 Flip Wend Function tasten() If KeyDown(200) Then ich_y = ich_y - 5: y_back = -1 If KeyDown(208) Then ich_y = ich_y + 5: y_back = 1 If KeyDown(203) Then ich_x = ich_x - 5: x_back = -1 If KeyDown(205) Then ich_x = ich_x + 5: x_back = 1 End Function Function kollision() If ImagesCollide(ich,ich_x,ich_y,0,viereck,300,200,0) Then Repeat ;so lange die werte zurück gehen, die man erst bei der funktion "tasten()" gedrückt hat... ich_x = ich_x -x_back ich_y = ich_y -y_back ;wenn sich die vierecke noch berühren, bleibt "weiter" bei null If ImagesCollide(ich,ich_x,ich_y,0,viereck,300,200,0) = False Then weiter = 1 Until weiter = 1 EndIf End Function schau dir lieber nicht den Befehl "CreateImage()" bei mir an, weil ich denke/glaube das dies bei mir nur aus zufall richtig ist...^^ hoffe ich konnte dir weiter helfen mit deiner kollision mfg Yankee |
||
Um so kleiner der code, um so schwieriger den Fehler zu finden:
Siehst du den Fehler? Klick mal hier drauf... hehehe |
Virus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke, das hat mir geholfen. und wenn ich jetzt ein spiel mit
360° drehung habe, wie mache ich das dann da? ![]() |
||
www.legacy.de |
![]() |
Yankee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja mach es wie BladeRunner gesagt hat
also so ungefähr: Code: [AUSKLAPPEN] ;hier die werte setzten Global ich_x = 320 Global ich_y = 240 Global x_alt = 0 Global y_alt = 0 While Not KeyHit(1) Cls ;hier x_alt und y_alt auf die alten werte setzten, also von dem letzten durchlauf der schleife x_alt = ich_x y_alt = ich_y tasten() kollision() Flip Wend Function tasten() If KeyDown(200) then... ... ... End Function Function kollision() If ImagesCollide(viereck,ich_x,ich_y,0,mitte_viereck,300,240,0) then ich_x = x_alt ich_y = y_alt EndIf End Function hoffe der code hilft dir etwas weiter wenn du die ganzen bilder drehen willst, mach einfach einen Dim(360) und so... mfg Yankee |
||
- Zuletzt bearbeitet von Yankee am Sa, Jul 15, 2006 12:10, insgesamt einmal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schau, wenn Du deine Figur vorbewegst und Dir die Befehle eine Kollision melden, setzt Du den Player einfach an die Position an der er vor der Kollisioin war. Das funktioniert universell für alle Richtungen.
Du musst Dir einfach nur merken von wo der Player kam. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Virus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ok, habe verstanden, einfach dahinsetzen wo der player vor der
klolision war ![]() |
||
www.legacy.de |
Lukas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du eine 360° Drehung machen willst, würde ich das so machen:
Erstmal lädst du ein Bild 360 mal in ein Array, für jeden Winkel ein Bild. Code: [AUSKLAPPEN] GfxPlayerbild = LoadImage("Player.bmp") Dim gfxPlayer(360) MidHandle GfxPlayerbild For Winkel = 0 To 360 GfxPlayer(Winkel) = CopyImage(GfxPlayerbild) RotateImage Gfxplayer(Winkel),Winkel Next In deiner Schleife kannst du dann mit den Pfeiltasten den Winkel verändern, und den Spieler zeichnen: Code: [AUSKLAPPEN] If KeyDown(205) Then Playerwinkel = Playerwinkel + 3 If Playerwinkel > 360 Then Playerwinkel = Playerwinkel - 360 EndIf If KeyDown(203) Then Playerwinkel = Playerwinkel - 3 If Playerwinkel < 0 Then Playerwinkel = 360 + Playerwinkel EndIf DrawImage gfxPlayer(Playerwinkel),Playerx,Playery Jetzt kann man den Spieler schon drehen. Wenn du ihn nach vorne bewegen willst, brauchst du Cos&Sin: Code: [AUSKLAPPEN] If KeyDown(200) Then
Playerx = Playerx + Cos(Playerwinkel) *5 Playery = Playery + Sin(Playerwinkel) *5 EndIf Alternativ kannst du anstatt "*5" eine Variable verwenden, dann kannst du die Geschwindigkeit noch im Spiel ändern. mfg |
||
![]() |
Fleamor |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab ein ähnliches Problem und wollte deshalb nicht umbedingt einen neuen thread aufmachen.
Ich hab eine tileengine und weiß nicht wie ich Kontroliere ob der Charakter mit einem tile Kollidiert ist das den wert 1 beträgt. Ich hab schon folgendes versucht. Code: [AUSKLAPPEN] For zählx=0 to 20
For zähly=0 to 20 If imagescollide (Player(winkel),336,336,0,map(zählx,zähly),zählx*32,zähly*32,1) ;Der Spieler ist immer in der mitte des Bildschirms ;zurücksetzen Next Next aber es wird angezeigt das das Bild nicht existiert edit:sry hab den fehler schon gefunden aber er überprüft die Kollision nicht richtig hier der quelltext: Code: [AUSKLAPPEN] Graphics 672,672,0,2
AutoMidHandle 1 TFormFilter 0 SetBuffer BackBuffer() Global posx=0 Global posy=0 Global win=0 Dim Player(360) Dim tile(20,20) For i=0 To 359 Player(i)= LoadImage("gfx/Player.bmp") RotateImage Player(i),i Cls Rect 171,600,360,70,0 Rect 171,600,i,70 Flip Next Dim map(20,20) Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 For y=0 To 20 For x=0 To 20 Read map(x,y) If map(x,y) = 0 Then tile(x,y)=LoadImage("gfx/Boden.bmp") If map(x,y) = 1 Then tile(x,y)=LoadImage("gfx/Wand.bmp") Next Next While Not KeyHit (1) If KeyDown(203) Then win=win-3 If KeyDown(205) Then win=win+3 : If win<0 Then win=359 If win>359 Then win=0 If KeyDown(200) For x=0 To 20 For y=0 To 20 If ImagesOverlap (Player(win),336,336,tile(x,y),x*32,y*32)=1 If map(x,y)=1 hallo=1 End If End If Next Next posx=posx+Cos(win+90)*5 posy=posy+Sin(win+90)*5 End If Cls For x=0 To 20 For y=0 To 20 DrawImage Tile(x,y),x*32+posx+16,y*32+posy+16 Next Next DrawImage Player(win),336,336 If hallo=1 Then Text 0,0,"hallo" Flip Wend End Hab den Quelltext sehr verändert. sollte eine Kollision vorliegen so wird hallo ausgegeben aber es passiert nichts |
||
Virus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also kollisionsfunktionen dafür sind schonmal wirklich nicht zu gebrauchen
bei tiles. dazu sind tiles doch eigentlich da ![]() Code: [AUSKLAPPEN] ;also ich habe es so:
For Y = 0 To 50 For X = 0 To 50 If Map(X,Y) = "1" Then If Player\X = X And Player\Y = Y Then ;Player kollidiert mit dem Tile auf der Map, das den Wert 1 ;enthält. Endif Endif Next Next |
||
www.legacy.de |
![]() |
Fleamor |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich hab das jetz so gemacht weil das wenn du dir den Quelltext angeschaut hast nur möglich ist aber es funktioniert wieder nicht.
Code: [AUSKLAPPEN] If KeyDown(200)
For x=0 To 20 For y=0 To 20 If map(x,y)=1 If 10-((posx+Cos(win+90)*5)/32)=x And 10-((posy+Sin(win+90)*5)/32)=y Goto weiter End If End If Next Next posx=posx+Cos(win+90)*5 posy=posy+Sin(win+90)*5 EndIf .weiter aber es funktioniert wieder nich ![]() edit: so jetz hab ich das ganze viel einfacher in ne funktion gesteckt die dann wieder hallo ausgeben soll: Code: [AUSKLAPPEN] Function check_collisions()
For x=0 To 20 For y=0 To 20 If map(x,y) = 1 If 0-posx+336 > x*32 And 0-posx+336 < (x+1)*32;das0-posx+336 ergibt sich aus If 0-posy+336 > x*32 And 0-posy+336 < (x+1)*32;der berechnung der tiles text 0,100,"hallo" End If End If End If Next Next End Function Und nach wie vor Funktioniert es nicht. ![]() edit:weiß keiner eine lösung? ![]() ![]() womöglich letztes edit:so hab jetzt selbst eine lösung gefunden ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group