Map Kollisionen und animierte Figuren...

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

mavi

Betreff: Map Kollisionen und animierte Figuren...

BeitragFr, Jan 22, 2010 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo...
Ich wollte euch fragen ob ihr mir helfen könnt mehrere Probleme zu beseitigen, denn ich zum einen möchte ich für meine Figur...ne Collsiionsabfrage machen, aber die haut irgendwie nciht hin und zum zweiten möchte ich ein Bild laden (16 Einzelbilder) woraus die Laufanimation der Figur besteht...
MAIN
Code:
;Map

Graphics 800,600,16,0
SetBuffer BackBuffer()
   
File_map = OpenFile("map.dat")
   
   Dim map(24,18)
      
   For x=0 To 24
      For y=0 To 18
         map(x,y) = ReadByte(File_map)
      Next
   Next
CloseFile File_map

Include "var.bb"
Include "functions.bb"



Repeat
DrawMap()
key()
collision()
DrawHero()

debug()
WaitTimer timer
Flip:Cls
Until KeyHit(1):End

Variablen:
Code:
;Var.bb
   Global timer = CreateTimer(60)   
   Global gras = LoadImage("gras.bmp")
   Global wasser = LoadImage("wasser.bmp")
   Global char = LoadAnimImage("C:\Dokumente und Einstellungen\notebook\Eigene Dateien\BB\Ressources\rogue.png",32,48,0,15)
   Global px = 70
   Global py = 100
   Global move=1;
   
   MidHandle char
   MaskImage char, 255,0,128


Funktionen:
Code:
;====================FUNCTIONS===========================
Function DrawMap()
   For x=0 To 24
      For y=0 To 18
         If map(x,y) = 0 Then
            DrawImage gras,x*32,y*32
         EndIf
         If map(x,y) = 7 Then
            DrawImage wasser,x*32,y*32
         EndIf
      Next
   Next
End Function

Function DrawHero()
DrawImage char,px,py,0
End Function



Function key()

If move=1 Then
   If KeyDown(17)
      py=py-1
   ElseIf KeyDown(30)
      px=px-1
   ElseIf KeyDown(31)
      py=py+1
   ElseIf KeyDown(32)
      px=px+1
   EndIf
EndIf
End Function



Function debug()
   Text 10,10, px
   Text 10,20, py
   Text 10,30, char_direction
End Function



Function collision()
   For x = 0 To 24
      For y = 0 To 18
         If map(x,y) < 0 Then
            move=0
         EndIf
      Next
   Next
End Function



Die Funktion mit der animierten Figur hab ich rausgenommen, denn das hat nicht funktioniert, nur damit ihr wisst das ich das auch schon probiert habe und nicht irgendwelche leute suche, die meine arbeit vollrichten...

Dottakopf

BeitragFr, Jan 22, 2010 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hi mavi,


ich habe von mir einen älteren post gefunden, in dem ich eine pixel by pixel kollision erkläre.
Das dürfte dir den richten anstatz für mehr geben. Der code ist lauffähig!

Post( https://www.blitzforum.de/foru...php?t=5286 ) erklärt prinzipell die Bewegung auf einer Tilemap

Ich muss mich entschuldigen, leider hat der code nen bug: geht man genau an die ecken springt es manchmal seltsam. Wie gesagt.. "hier ein ansatz"

Code:


;infos
;Verantwortlich für den kas= Dottakopf
;tile size = 32
;map size 12x12
;Pixel to Pixel bewegung


Graphics 800,600,16,2
SetBuffer BackBuffer()
timer = CreateTimer(60)


;globals
Global hero_px = 64
Global hero_py = 64
Global hero_speed = 2



;arry
Dim tile_map(20,20)
For y = 0 To 11
   For x = 0 To 11
      Read tile_map(x,y)
   Next
Next



;//////////////////////////////////////////////////// MAIN LOOP \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Repeat
Cls


      draw_map()
      update_hero()


WaitTimer(timer)
Flip
Until KeyHit(1)
;//////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




Function update_hero()

     
         ;ermittelt welche umliegenden tiles der spieler besetzt
         ty1 = Floor(hero_py/Float(32)) ;tile abgerundet
         ty2 = Ceil(hero_py/Float(32))  ;tile aufgerundet
         
         tx1 = Floor(hero_px/Float(32)) ;tile abgerundet
         tx2 = Ceil(hero_px/Float(32))  ;tile aufgerundet
         
         

         ;OBEN
         If KeyDown(200) Then
            If tile_map( tx1 , (hero_py-hero_speed) /32) = 0 And  tile_map( tx2 , (hero_py-hero_speed) /32) = 0  Then
               hero_py = hero_py - hero_speed
            Else
               hero_py = hero_py + hero_speed
               hero_py = (hero_py/32)*32
            End If     
         End If
         
         ;UNTEN
         If KeyDown(208) Then
            If tile_map( tx1 , (hero_py+hero_speed)/32+1) = 0 And  tile_map( tx2 , (hero_py+hero_speed)/32+1) = 0 Then
               hero_py = hero_py +hero_speed
            Else
               hero_py = hero_py - hero_speed
               hero_py = (hero_py/32+1)*32
            End If   
         End If
         
         ;links
         If KeyDown(203) Then
            If tile_map( (hero_px -hero_speed)/32 , ty1) = 0 And tile_map( (hero_px-hero_speed)/32 , ty2 ) = 0 Then
               hero_px = hero_px -hero_speed
            Else
               hero_px = hero_px+hero_speed
               hero_px = (hero_px/32)*32
            End If
         End If
         
         ;rechts
         If KeyDown(205) Then
            If tile_map( (hero_px+hero_speed  )/32+1 , ty1) = 0 And  tile_map( (hero_px+hero_speed)/32+1 , ty2 ) = 0
               hero_px = hero_px +hero_speed
            Else
               hero_px = hero_px - hero_speed
               hero_px = (hero_px/32+1)*32
            End If


         End If
         
         ;hero malen
         Color 0,0,255:Rect hero_px,hero_py,32,32,1

End Function
;----------------------------------------------------------------------------------------------------------------------------



Function draw_map()
   Color 200,200,200
   For x = 0 To 11
      For y = 0 To 11
         If tile_map(x,y)<>0 Then Rect x*32,y*32,32,32,tile_map(x,y)
      Next
   Next
End Function
;----------------------------------------------------------------------------------------------------------------------------



.level
Data 1,1,1,1,1,1,1,1,1,1,1,1
Data 1,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,1,0,0,1,0,0,0,1
Data 1,0,0,0,0,1,1,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,0,0,1
Data 1,0,0,0,0,0,0,0,0,1,0,1
Data 1,0,0,1,1,1,0,0,0,1,1,1
Data 1,0,0,0,0,1,0,0,0,1,0,1
Data 1,0,0,0,0,1,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,1,1,1,1



gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
  • Zuletzt bearbeitet von Dottakopf am Fr, Jan 22, 2010 14:10, insgesamt 3-mal bearbeitet

Midimaster

BeitragFr, Jan 22, 2010 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, normalerweise steht dein Spieler ja auf irgendeinem der Felder map(x,y). Das bekommst du durch SpielerX=Px/32 und SpielerY=PY/32 raus. Nun hast Du zwei Möglichkeiten:

Du kannst Du den Wert checken, den dieses Feld hat und darauf reagieren

BlitzBasic:
Select Map(SpielerX,SpielerY)
Case 7
;wasser spieler töten

Case 1
; Geldsack einsammeln
....
End Select



Um zu verhindern, das er manche Felder betritt würde ich direkt in die Lauf-Funktion reinschreiben:
(pY-1)/32 ) ist dabei das zukünfige Feld, dass den Schritt schon vorwegnimmt.
BlitzBasic:
Function key()

If KeyDown(17)
If map( SpielerX, (pY-1)/32 ) < 7 Then
; z.b. nie aufs wasser
py=py-1
EndIf
ElseIf KeyDown(30)
If map( (PX-1)/32 , SpielerY ) < 7 Then
px=px-1
.....


Oder du könntest die Images die auf einem dieser Felder sind mit dem Image des Spielers auf Collision testen. Dabei müsstest du das Image "Grass" natürlich auslassen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group