collision glissante 2d

Programmation avancée de jeux en PureBasic
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le lun. 10/oct./2005 8:30, modifié 1 fois.
Invité

Message par Invité »

tu n'as qu'à le faire plus gros, il ne passera plus :)
Remets le à 32x32
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu as un framerate de combien ? mets le à 60 , ça devrait suffire .
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

J'ai remis le code en PB4

Code : Tout sélectionner

;-Initialisation
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 16
If InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Demo PlateForme" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf

;/ Structures
Structure sprite
   x.l
   y.l
   Width.l
   Height.l
EndStructure

Structure joueur
   x.f
   y.f
   Width.l
   Height.l
   Sens.w
EndStructure
Global NewList mur.sprite()
Global Joueur.joueur
Global player1_move.f,player1_speed.f

;/Les sprites
;Joueur
CreateSprite(0,16,16)
StartDrawing(SpriteOutput(0))
  Circle(SpriteWidth(0)/2,SpriteHeight(0)/2,SpriteWidth(0)/2,RGB(255,255,55))
StopDrawing()
Joueur\x = 100
Joueur\y = 50
Joueur\Width = SpriteWidth(0)
Joueur\Height = SpriteHeight(0)

;mur
CreateSprite(1,32,32)
StartDrawing(SpriteOutput(1))
  Box(0,0,SpriteWidth(1),SpriteHeight(1),RGB(55,155,155))
StopDrawing()

;- procedures
Procedure InitGameTimer()
   Shared _GT_DevCaps.TIMECAPS
   timeGetDevCaps_(_GT_DevCaps,SizeOf(TIMECAPS))
   timeBeginPeriod_(_GT_DevCaps\wPeriodMin)
EndProcedure

Procedure StopGameTimer()
   Shared _GT_DevCaps.TIMECAPS
   timeEndPeriod_(_GT_DevCaps\wPeriodMin)
EndProcedure

Procedure Readmap()
   Restore map
   For b = 0 To 15
      For a = 0 To 19
         Read c
         If c
            AddElement(mur())
            mur()\Width = SpriteWidth(1)
            mur()\Height = SpriteHeight(1)
            mur()\x = a * mur()\Width
            mur()\y = b * mur()\Height           
         EndIf
      Next a
  Next b   
EndProcedure 

Procedure Affmap()
   ForEach mur()
      DisplaySprite(1,mur()\x,mur()\y)
   Next   
EndProcedure

Procedure collision()
   ForEach mur()
      If SpriteCollision(0,Joueur\x,Joueur\y,1,mur()\x,mur()\y)
         ;corrige la position du perso
         Ecartx = Joueur\x - mur()\x
         Ecarty = Joueur\y - mur()\y
         If Ecartx < 0
            decalX = Abs(Ecartx) - Joueur\Width
         Else
            decalX = mur()\Width - Ecartx
         EndIf   
         
         If Ecarty < 0
            decalY = Abs(Ecarty) - Joueur\Height
         Else
            decalY = mur()\Height - Ecarty
         EndIf 
         
         If Random(1)  ; pas terrible ça saccade , mais je ne sais pas comment faire autrement pour l'instant
            If Abs(decalX)>= Abs(decalY)
               decalX = 0
            Else             
               decalY = 0
            EndIf   
         Else
            If Abs(decalX)> Abs(decalY)
               decalX = 0
            Else             
               decalY = 0
            EndIf
         EndIf   
     
         Joueur\x + decalX
         Joueur\y + decalY
         
         collision()

        Break
      EndIf
   Next
   
EndProcedure
Vitesse = 3
Readmap()
player1_speed.f = 0.250

; timer initialisieren
InitGameTimer()
StartTime = timeGetTime_()
;StartTime = GetTickCount_()
time= StartTime
 
Repeat
   ; calculate multiplicator
   multiplicator.f = StartTime
   StartTime = timeGetTime_()
   ;StartTime = GetTickCount_()   
   multiplicator   = StartTime - multiplicator
   
   ; calc framerate
   If timeGetTime_()-time >= 1000
      ;If GetTickCount_()-time >= 1000   
      time   = timeGetTime_()
      ;time   = GetTickCount_()
      FPS    = Frames-1
      Frames = 1
   Else
      Frames+1
   EndIf
   ClearScreen(0)
   ; show framerate
   StartDrawing(ScreenOutput())
   DrawingMode(1):FrontColor(RGB($80,$FF,$00))
   DrawText(50,50,"FrameRate: "+Str(FPS))
   StopDrawing()
   
   ; calc move-step for player1
   player1_move = player1_speed * multiplicator 
   
   Affmap()
   ExamineKeyboard() 
   If KeyboardPushed(#PB_Key_Up) 
      Joueur\y - player1_move
   ElseIf KeyboardPushed(#PB_Key_Down)
      Joueur\y + player1_move
   EndIf     
   If KeyboardPushed(#PB_Key_Left) 
      Joueur\x - player1_move
   ElseIf KeyboardPushed(#PB_Key_Right)
      Joueur\x + player1_move
   EndIf

   collision()
   DisplaySprite(0,Joueur\x,Joueur\y)

   FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

DataSection
map:
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.l 1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1
Data.l 1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1
Data.l 1,0,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,0,1
Data.l 1,0,0,0,0,0,1,1,1,0,1,1,1,1,0,0,0,1,0,1
Data.l 1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1
Data.l 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1
Data.l 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,0,0,0,1,1,1,0,0,1,0,1,0,1,1,1,0,0,0,1
Data.l 1,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,1
Data.l 1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1
Data.l 1,0,1,1,0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,1
Data.l 1,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,0,0,0,1
Data.l 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
EndDataSection
Répondre