Blitz Basic Funktionen in PB

Anfängerfragen zum Programmieren mit PureBasic.
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Re: Blitz Basic Funktionen in PB

Beitrag von Crawler »

Code: Alles auswählen

Structure Feld
  begehbar.i
  tile.i
EndStructure

Dim MAPinit.Feld(5,1)

MAPinit(0,0)\begehbar = 1
mapinit(0,0)\tile = 1
MAPinit(1,0)\begehbar = 0
mapinit(0,0)\tile = 0
Ich würde das so machen, dass ich jedem Tile noch einen Status zuweisen würde.
PB 4.41 | Win7 64bit
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Blitz Basic Funktionen in PB

Beitrag von c4s »

NathanielBlack hat geschrieben:gar nicht, soweit war ich mit der demo nicht gekommen:P

ich brauche auch keine Pixel genaue Kollision, sondern einfach nur, dass man über tiles net laufen kann;)

mfg
Nathaniel
Auf das nötige Hintergrundwissen bzw. Verständnis musst du dann schon selbst kommen. Es macht ja sonst keinen Sinn, oder?
Und notfalls wird dir sicherlich die Suche auch das ein oder andere Häppchen an Wissen vermitteln können.

Außerdem wird es mal Zeit für dich - wenn überhaupt - ein neues Thema zu starten, denn etwas was zu "Blitz Basic Funktionen in PB" gehören könnte, sehe ich auf den letzten 5 Seiten nicht.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: Blitz Basic Funktionen in PB

Beitrag von hörmi »

Code: Alles auswählen

Global Dim MAPinit.l(5,5)

Procedure Darf_Laufen(px,py)
  px=Round(px/50,#PB_Round_Down)
  py=Round(py/50,#PB_Round_Down)
  If px>=0 And px<=5 And py>=0 And py<=5
    If MAPinit(px,py)=0
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

If InitSprite() And InitKeyboard() And UsePNGImageDecoder()
  
  If OpenScreen(800,600,32,"Tilemap")
    
    ScrollX=400
    ScrollY=300
    
    For i = 0 To 2
      CreateSprite(i,50,50)
      StartDrawing(SpriteOutput(i))
        Select i
          Case 0
            Box(0,0,49,49,$00FF00)
          Case 1
            Box(0,0,49,49,$FF0000)
          Case 2
            Box(0,0,49,49,$0000FF)
        EndSelect
      StopDrawing()
    Next
    Player=CreateSprite(#PB_Any,11,11)
    StartDrawing(SpriteOutput(Player))
      Circle(5,5,5,$FFFFFF)
      Circle(5,5,4,$FF0000)
    StopDrawing()
    
    
    CopyMemory(?TileMap,@MAPinit(),4*6*6)
    
    Repeat
      ClearScreen(RGB(0,0,0))
      
      
      
      For x = 0 To 5
        For y = 0 To 5
          PosX = x * 50 + ScrollX
          PosY = y * 50 + ScrollY
          
          DisplaySprite(MAPinit(x,y),PosX,PosY)
          
        Next
      Next
      DisplaySprite(Player,PlayerX+ScrollX-5,PlayerY+ScrollY-5)
      
      StartDrawing(ScreenOutput())
        FrontColor($000000)
        BackColor($FFFFFF)
        DrawText(0,200,"PlayerX= " + Str(PlayerX))
        DrawText(0,220,"PlayerY= " + Str(PlayerY))
        DrawText(0,240,"ScrollX= " +Str(ScrollX))
        DrawText(0,260,"ScrollY= " +Str(ScrollY))
      StopDrawing()
      
      FlipBuffers()
      ExamineKeyboard()
      If KeyboardPushed(#PB_Key_W) And Darf_Laufen(PlayerX,PlayerY-1)
        PlayerY = PlayerY - 1
        ScrollY = ScrollY + 1
      EndIf
      
      If KeyboardPushed(#PB_Key_S) And Darf_Laufen(PlayerX,PlayerY+1)
        PlayerY = PlayerY + 1
        ScrollY = ScrollY - 1
      EndIf
      
      If KeyboardPushed(#PB_Key_D) And Darf_Laufen(PlayerX+1,PlayerY)
        PlayerX = PlayerX + 1
        ScrollX = ScrollX - 1
      EndIf
      
      If KeyboardPushed(#PB_Key_A) And Darf_Laufen(PlayerX-1,PlayerY-1)
        PlayerX = PlayerX - 1
        ScrollX = ScrollX + 1
      EndIf
    Until KeyboardPushed(1)
    
  EndIf
EndIf

End

DataSection 
  TileMap:
  Data.l 0,1,1,0,0,0
  Data.l 0,0,1,1,0,2
  Data.l 0,0,0,0,0,0
  Data.l 0,2,1,0,2,0
  Data.l 0,1,1,0,0,0
  Data.l 1,1,2,2,0,0
  
EndDataSection
BildBild Bild
NathanielBlack
Beiträge: 63
Registriert: 25.12.2009 18:48

Re: Blitz Basic Funktionen in PB

Beitrag von NathanielBlack »

Danke euch vieeeeelmals.

Die Constante #PB_Round_Down gibt es scheinbar in 4.00 nicht:( Bis ich mein Update hab dauert es noch, Was kann ich als alternative nehmen?

mfg
euer Nathaniel


edit:
nOchmals danke. Ich habe die Const. durch 0 (in beiden fällen eretzt und nun klappte es.
Juhu!

Thx a lot!
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: Blitz Basic Funktionen in PB

Beitrag von hörmi »

Anstatt Round(px/50,#PB_Round_Down) kannst du auch Int(px/50) nehmen

Dann solltest du aber aufpassen das px und py nicht unter null kommen dürfen
BildBild Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Blitz Basic Funktionen in PB

Beitrag von Kaeru Gaman »

also, hier findest du zwei kleine tileengines
http://www.purebasic.fr/german/viewtopi ... 34#p116634
im ersten beispiel eine Basisengine.
im nächsten mit Mausover, was du auch als Beispiel für eine Kollision nehmen kannst, da berechnet wird, über welcher Tile die Maus gerade ist.
das kannst du für jeden beliebigen virtuellen punkt berechnen.
und ganz grundsätzlich solltest du dich mit dem Koordinatenproblem auseinandersetzen,
also der Unterschied zwischen Weltkoordinaten, Mapkoordinaten und Bildschirmkoordinaten muss verstanden worden sein.

wie andere Kollegen auch schon sagten, lies dir erst mal die Help durch, es ist wirklich nicht elegant, wegen jedem pup zu fragen.
und ja, mach ruhig mal ein neues Thema auf, solange du nicht zwei pro tag aufmachst geht das schon.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten