Wie mach ich ne Stinknormale Kollision *nichtweiterkann*

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Virus

Betreff: Wie mach ich ne Stinknormale Kollision *nichtweiterkann*

BeitragSa, Jul 15, 2006 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 15, 2006 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn du eine kollision haben möchtest guck dir die befehle

ImagesCollide
ImagesOverlap

an.
User posted image
 

Virus

BeitragSa, Jul 15, 2006 10:23
Antworten mit Zitat
Benutzer-Profile anzeigen
und was soll ich dann mit den befehlen?

If RectsCollide(das quadrat,das auto) then auto\X = rand(100)
www.legacy.de

Yankee

BeitragSa, Jul 15, 2006 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 15, 2006 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
danke, das hat mir geholfen. und wenn ich jetzt ein spiel mit
360° drehung habe, wie mache ich das dann da? Rolling Eyes
www.legacy.de

Yankee

BeitragSa, Jul 15, 2006 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragSa, Jul 15, 2006 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jul 15, 2006 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, habe verstanden, einfach dahinsetzen wo der player vor der
klolision war Smile
www.legacy.de
 

Lukas

BeitragSa, Jul 15, 2006 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

[/quote]



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

BeitragSo, Jul 16, 2006 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 17, 2006 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
also kollisionsfunktionen dafür sind schonmal wirklich nicht zu gebrauchen
bei tiles. dazu sind tiles doch eigentlich da Laughing
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

BeitragMo, Jul 17, 2006 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad
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. Crying or Very sad

edit:weiß keiner eine lösung? Question Crying or Very sad
womöglich letztes edit:so hab jetzt selbst eine lösung gefunden Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group