Tron

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Tron

Message par Droopy »

J'ai commencé ça.

Comment ajouter des murs / gérer la collision avec les murs / sa trace ?

Code : Tout sélectionner

;/ Déplacement avec la souris

#Largeur=800
#Hauteur=600

InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0, 0, 0, #Largeur, #Hauteur, "Go ...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

x=#Largeur/2
y=#Hauteur/2

h=1
v=0

Enumeration
  #Curseur
EndEnumeration

;/ Création du Curseur
CreateSprite(#Curseur,10,10)
StartDrawing(SpriteOutput(#Curseur))
Circle(5,5,5,RGB(255,255,255))
StopDrawing()

;StartDrawing(WindowOutput(0))

Repeat
  Repeat
    Event = WindowEvent()
    Select Event 
      Case #PB_Event_CloseWindow
        End 
    EndSelect
  Until Event = 0
  
  FlipBuffers() 
  
  ;/ Analyse clavier / quitte si ESC pressé
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  
  If KeyboardPushed(#PB_Key_Left)
    v=0:h=-1
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
    v=0:h=1
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    v=-1:h=0
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)
    v=1:h=0
  EndIf
  
  x+h
  y+v
  
  DisplayTranslucentSprite(#Curseur,x,y,255)
  
  Delay(1)
ForEver
  
merci d'avance
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Tu as une foule de méthode. La plus simple des méthodes s'applique à des murs horizontaux et verticaux uniquement.

Je te fais un petit rajout code que je poste ici dans une vingtaine de minutes...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

En retard!

Code : Tout sélectionner

Enumeration 
  #Curseur 
EndEnumeration 



;-1) création tableau
;->256 murs faisables
n = 255
Dim QttMur(0)
QttMur(0) = 0
Dim MurSens(n)
;->Sens=0 : horizontal
;->Sens=1 : vertical
;-3 variables A, B et C pour chq mur
Dim MurA(n)
Dim MurB(n)
Dim MurC(n)
;->Si sens horizontal
;->A= X1
;->B= X2
;->C= Y
;-Si sens vertical
;->A= X
;->B= Y1
;->C= Y2
Procedure Mort()
  MessageRequester("Bing!", "A la ramasse!", #PB_MessageRequester_Ok)
  End
EndProcedure


Procedure FabriqueMur(sens, a, b, c)
Shared QttMur()
Shared MurSens()
Shared MurA()
Shared MurB()
Shared MurC()
  n = QttMur(0)
  MurSens(n) = sens
  MurA(n) = a
  MurB(n) = b
  MurC(n) = c
  QttMur(0) + 1
EndProcedure

Procedure AfficheMurs()
Shared QttMur()
Shared MurSens()
Shared MurA()
Shared MurB()
Shared MurC()
  nb = QttMur(0) - 1
  If nb > 0
    For i = 0 To nb
      If MurSens(i)
        X = MurA(i)
        Y1 = MurB(i)
        Y2 = MurC(i)
        For Y = Y1 To Y2
          DisplayTranslucentSprite(#Curseur,x,y,255) 
        Next
      Else
        Y = MurC(i)
        X1 = MurA(i)
        X2 = MurB(i)
        For X = X1 To X2
          DisplayTranslucentSprite(#Curseur,x,y,255) 
        Next
      EndIf
    Next i
  EndIf
EndProcedure

Procedure ContactMurs(xx, yy, Dist)
Shared QttMur()
Shared MurSens()
Shared MurA()
Shared MurB()
Shared MurC()
  nb = QttMur(0) - 1
  If nb > 0
    For i = 0 To nb
      If MurSens(i)
        X = MurA(i)
        Y1 = MurB(i)
        Y2 = MurC(i)
        For Y = Y1 To Y2
            If Y = yy
              If Abs(X - xx) < Dist
                Mort()
              EndIf
            EndIf
        Next
      Else
        Y = MurC(i)
        X1 = MurA(i)
        X2 = MurB(i)
        For X = X1 To X2
            If X = xx
              If Abs(Y - yy) < Dist
                Mort()
              EndIf
            EndIf
        Next
      EndIf
    Next i
  EndIf  
EndProcedure

;/ Déplacement avec la souris 

#Largeur=800 
#Hauteur=600 

InitSprite() 
InitKeyboard() 
InitMouse() 
OpenWindow(0, 0, 0, #Largeur, #Hauteur, "Go ...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0) 

x=#Largeur/2 
y=#Hauteur/2 

h=1 
v=0 


;/ Création du Curseur 
CreateSprite(#Curseur,10,10) 
StartDrawing(SpriteOutput(#Curseur)) 
Circle(5,5,5,RGB(255,255,255)) 
StopDrawing() 

;StartDrawing(WindowOutput(0)) 

FabriqueMur(1, 100, 200, 399)
FabriqueMur(1, 700, 200, 399)

FabriqueMur(0, 100, 599, 100)
FabriqueMur(0, 100, 599, 499)

AfficheMurs()

Repeat 
  Repeat 
    Event = WindowEvent() 
    Select Event 
      Case #PB_Event_CloseWindow 
        End 
    EndSelect 
  Until Event = 0 
  
  FlipBuffers() 
  
  ;/ Analyse clavier / quitte si ESC pressé 
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape) 
    End 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left) 
    v=0:h=-1 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Right) 
    v=0:h=1 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Up) 
    v=-1:h=0 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Down) 
    v=1:h=0 
  EndIf 
  
  x+h 
  y+v 
  
  DisplayTranslucentSprite(#Curseur,x,y,255) 
  
  ContactMurs(x, y, 5)
  Delay(1) 
ForEver 
  
  
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

mon petit Tron mis en purebasic 4.10 :D

Code : Tout sélectionner



; Version Purebasic V4.00
; Tron  creé Par Dobro  V3.5.2 avec score (non sauvegardé)
; pour le sens j'ai choisi

; les touches fleché pour jouer
; il y a un mode assistance pour les bords
; si l'on ne touche a rien il ne va pas entrer
; en collision avec les bords du jeu !! :D

;le sens des aiguilles d'une montre en commencant par midi
;sens=1  : monte ver midi
;sens=2  : va a droite vers 3 heures
;sens=3 : descend vers 6 heures
;sens=4 : va a gauche vers 9 heures
;(c'est le langage utilise dans l'aviation)
; "fait gaffe a tes 6 heures"
; veut dire qu vous avez quelqu'un derriere vous !!

; la variable pos c'est pareil mais pour le joueur
;pos=1 en haut ect..
Global xordi,yordi,ymissille,tir
#dobro=1
#Police=1
#ordi=1
#joueur=2
#test=3
#missordih=4
#missordiv=5
#missordihoff=6
#missordivoff=7
missordi=3
InitKeyboard() :; j'espere qu'il y a un clavier au moins !!
vitesse=10
vitessejoueur=10

Declare test_coul(x)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 9 ,#PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, 800, 600, "TRON Par Dobro", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, 800, 600, 1, 0,0)
    SetFrameRate(60)
    
    CreateSprite(#ordi, 10,10 )
    CreateSprite(#joueur, 10,10)
    CreateSprite(#test, 10,10)
    
    CreateSprite(#missordih, 10,10)
    StartDrawing(SpriteOutput(#missordih) )
    Box(0, 4, 10,8, RGB(0,255, 0))
    StopDrawing()
    CreateSprite(#missordihoff, 12,12)
    StartDrawing(SpriteOutput(#missordihoff) )
    Box(0, 0, 12,12, RGB(0,0,0))  :;            METTRE RGB(255,0,255)
    StopDrawing()
    
    
    CreateSprite(#missordiv, 10,10)
    StartDrawing(SpriteOutput(#missordiv) )
    Box(4,0,8,10, RGB(0,255, 0))
    StopDrawing()
    
    CreateSprite(#missordivoff, 12,12)
    StartDrawing(SpriteOutput(#missordivoff) )
    Box(0,0,12,12, RGB(0,0, 0))
    StopDrawing()
    
    CreateSprite(#test, 10,10)
    StartDrawing(SpriteOutput(#test) )
    Box(0,0,10,10, RGB(255,255, 255))
    StopDrawing()
    
    StartDrawing(SpriteOutput(#ordi) )
    Box(0, 0, 10,10 , RGB(255,0, 0))
    StopDrawing()
    StartDrawing(SpriteOutput(#joueur) )
    Box(0, 0, 10, 10 , RGB(0,0, 255))
    StopDrawing()
    
    debut:
    Rouge=50
    Vert=50
    Bleu=50
    score$="HUMAN="+Str(scorehuman)+" TRON ="+Str(scoretron)
    SetWindowTitle(1, score$)
    
    ; dessin du cadre exterieur
    StartDrawing(ScreenOutput())
    Box(0, 0, 800,600 , RGB(255,255,0))
    StopDrawing()
    StartDrawing(ScreenOutput())
    Box(10, 10, 780,580 , RGB(0,0,0))
    FrontColor(RGB(255,255, 0))
    BackColor(RGB(0,0,0))
    DrawingFont(FontID)
    
    
    DrawText(350,-5,"<------------")
    DrawText(350,585,"<------------") 
    DrawText(4,280,"|")
    DrawText(4,290,"|")
    DrawText(4,300,"|")
    DrawText(4,310,"|")
    DrawText(3,320,"v") 
    DrawText(790,280,"^")
    DrawText(792,290,"|")
    DrawText(792,300,"|")
    DrawText(792,310,"|")
    DrawText(792,320,"|")
    StopDrawing()
    Couleurjoueur=0
    xordi=450:; placement du sprite reserve a l'ordi
    yordi=290 :; pareil en y
    xjoueur=400 :; placement du sprite reserve au joueur
    yjoueur=300 :; pareil en y
    de=Random(1000):; ceci va determiner un depart aleatoire,vers le haut,le bas,a droite,a gauche)
    RandomSeed(de)
    pos=Random(3)+1
    de=Random(1000)
    RandomSeed(de)
    sens=Random(3)+1 :; pareil mais pour l'ordi
    ;sens=4
    Repeat
        Delay(40)
        Event=WindowEvent()
        ExamineKeyboard()
        If  pos=1:; monte
            yjoueur-vitessejoueur
            StartDrawing( ScreenOutput())
            Couleurjoueur = Point(xjoueur, yjoueur)
            Couleurjoueurg = Point(xjoueur-4, yjoueur)
            Couleurjoueurd = Point(xjoueur+14, yjoueur)
            
            StopDrawing()
            touche=test_coul(Couleurjoueur)
            If touche=2
                Goto su
            EndIf
        EndIf
        If pos=2:;droite
            xjoueur+vitessejoueur
            StartDrawing( ScreenOutput())
            Couleurjoueur = Point(xjoueur, yjoueur)
            Couleurjoueurg = Point(xjoueur, yjoueur-4)
            Couleurjoueurd = Point(xjoueur, yjoueur+14)
            StopDrawing()
            touche=test_coul(Couleurjoueur)
            If touche=2
                Goto su
            EndIf
        EndIf
        If pos=3:;bas
            yjoueur+vitessejoueur
            StartDrawing( ScreenOutput())
            Couleurjoueur = Point(xjoueur, yjoueur)
            Couleurjoueurg = Point(xjoueur-2, yjoueur)
            Couleurjoueurd = Point(xjoueur+14, yjoueur)
            StopDrawing()
            touche=test_coul(Couleurjoueur)
            If touche=2
                Goto su
            EndIf
        EndIf
        If  pos=4:;gauche
            xjoueur-vitessejoueur
            StartDrawing( ScreenOutput())
            Couleurjoueur = Point(xjoueur, yjoueur)
            Couleurjoueurg = Point(xjoueur, yjoueur+14)
            Couleurjoueurd = Point(xjoueur, yjoueur-4)
            StopDrawing()
            touche=test_coul(Couleurjoueur)
            If touche=2
                Goto su
            EndIf
        EndIf
        ;EndIf
        
        ;***************ASSISTANCE POUR LES PAROIS EXTERIEURs *****************
        Gosub assistance_mur
        
        ;********************************
        
        If KeyboardPushed( #PB_Key_Left  ) And kpl=#False
            touche=test_coul(Couleurjoueur)
            If touche=2
                Goto su
            EndIf
            pos-1:dob=1
            If pos<1
                pos=4
            EndIf
            kpl=#True
        EndIf
        
        If KeyboardPushed(  #PB_Key_Right  ) And kpr=#False
            touche=test_coul(Couleurjoueur)
            If touche=2
                Goto su
            EndIf
            pos+1:dob=1
            If pos>4
                pos=1
            EndIf
            kpr=#True
        EndIf
        
        If KeyboardReleased( #PB_Key_Left  ) And kpl
            kpl=#False
        EndIf
        If KeyboardReleased( #PB_Key_Right  ) And kpr
            kpr=#False
        EndIf   
        
        ; ******************** ordi avance *******************************
        ;sens=Random(4)+1
        
        Select sens
            Case 1 :;  il monte
                StartDrawing( ScreenOutput())
                Couleur1 = Point(xordi+5, yordi-6) :;test en haut
                Couleur2 = Point(xordi-16, yordi+5) :;test a gauche
                Couleur3 = Point(xordi+15, yordi+5) :;test a droite
                
                StopDrawing()
                ;  DisplaySprite(#test, xordi+4, yordi)
                
                If Couleur1>0 And Couleur2>0 And Couleur3>0 :; tout autour c'es colore , donc c'est perdu
                    toucheordi=1
                    Goto su
                EndIf
                ; detection d'une couleur devant mais test si ordi peut passer a droite ou a gauche
                If Couleur1>0 :; ya une couleur devant (donc un mur)
                    If Couleur3=0 And Couleur2=0 :; a droite et a gauche on peut passer
                        dede=Random(2)+1:; on tire a hazard droite ou gauche
                        If dede=1
                            sens=4:; on part a gauche
                            Goto su
                        EndIf
                        If dede=2
                            sens=2:; on part a droite
                            Goto su
                        EndIf
                    EndIf
                    If Couleur3=0 :; il n'y a qu'a droite que c'est libre
                        sens=2:; alors on y va
                        Goto su
                    EndIf
                    If Couleur2=0:;si a gauche ya pas de couleur (c'est libre)
                        sens=4 :;on va a gauche
                        Goto su
                    EndIf
                EndIf
                
                If  yordi>10 :; inverse la coordonee pour inverser le sens de deplacement
                    yordi-vitesse
                Else
                    sens=2
                EndIf
            Case 2:; il va a droite 
                StartDrawing( ScreenOutput())
                Couleur1 = Point(xordi+15, yordi+5) :;test a droite
                Couleur2 = Point(xordi+5, yordi-6) :;test en haut
                Couleur3 = Point(xordi+5, yordi+16) :;test en bas
                StopDrawing()
                
                If Couleur1>0 And Couleur2>0 And Couleur3>0
                    toucheordi=1
                    Goto su
                EndIf
                If Couleur1>0
                    If Couleur2=0 And Couleur3=0
                        dede=Random(2)+1
                        If dede=1
                            sens=3
                            Goto su
                        EndIf
                        If dede=2
                            sens=1
                            Goto su
                        EndIf
                    EndIf
                    If Couleur2=0
                        sens=1
                        Goto su
                    EndIf
                    If Couleur3=0
                        sens=3
                        Goto su
                    EndIf
                    
                EndIf
                If xordi<=780
                    xordi+vitesse
                Else
                    sens=3
                EndIf
            Case 3:; il descend
                StartDrawing( ScreenOutput())
                Couleur1 = Point(xordi+5, yordi+15) :;test en bas
                Couleur2 = Point(xordi+15, yordi+5) :;test a droite
                Couleur3 = Point(xordi-6, yordi+5) :;test a gauche
                StopDrawing()
                If Couleur1>0 And Couleur2>0 And Couleur3>0
                    toucheordi=1
                    Goto su
                EndIf
                If Couleur1>0
                    If Couleur3=0 And Couleur2=0
                        dede=Random(2)+1
                        If dede=1
                            sens=2
                            Goto su
                        EndIf
                        If dede=2
                            sens=4
                            Goto su
                        EndIf
                        
                    EndIf
                    If Couleur3=0
                        sens=4
                        Goto su
                    EndIf
                    If Couleur2=0
                        sens=2
                        Goto su
                    EndIf
                EndIf
                
                If  yordi<580
                    yordi+vitesse
                Else
                    sens=4
                EndIf
            Case 4:; il va a gauche
                StartDrawing( ScreenOutput())
                Couleur1 = Point(xordi-6, yordi+5) :;test a gauche
                Couleur2 = Point(xordi+5, yordi-6) :;test en haut
                Couleur3 = Point(xordi+5, yordi+16) :;test en bas
                StopDrawing()
                
                If Couleur1>0 And Couleur2>0 And Couleur3>0
                    toucheordi=1
                    Goto su
                EndIf
                If Couleur1>0
                    If Couleur2=0 And Couleur3=0
                        dede=Random(2)+1
                        If dede=1
                            sens=3
                            Goto su
                        EndIf
                        If dede=2
                            sens=1
                            Goto su
                        EndIf
                    EndIf
                    If Couleur2=0
                        sens=1
                        Goto su
                    EndIf
                    If Couleur3=0
                        sens=3
                        Goto su
                    EndIf
                EndIf
                If xordi>10
                    xordi-vitesse
                Else
                    sens=1
                EndIf
        EndSelect
        ; Couleur = Point(xordi, yordi)
        ; rouge =255
        ; bleu = 16711680
        ;vert = 65280
        su:
        
        Gosub message_gagne_perdu
        
        DisplaySprite(#ordi, xordi , yordi )
        DisplaySprite(#joueur, xjoueur , yjoueur )
        
        FlipBuffers():; affiche l'ecran
        
        Rouge+1
        ;************** couleur *************
        StartDrawing(SpriteOutput(#ordi) )
        ;If Rouge>255:Bleu+1:EndIf
        ;If Bleu>255:Vert+1:EndIf
        ;If Vert>255:Rouge+1:EndIf
        Rouge=Random(55)+200
        coul= RGB(Rouge, 100, 50)
        Box(0, 0, 10,10 , coul)
        StopDrawing()
        StartDrawing(SpriteOutput(#joueur) )
        ;If Rouge>255:Bleu+1:EndIf
        ;If Bleu>255:Vert+1:EndIf
        ;If Vert>255:Rouge+1:EndIf
        Bleu=Random(55)+200
        coul= RGB(150, 0, Bleu)
        Box(0, 0, 10,10 , coul)
        StopDrawing()
        ;************************************
        
        
    Until Event=#PB_Event_CloseWindow
    End
    
    Procedure test_coul(Couleurjoueur)
        ;255=rouge
        ;16711680=bleu
        ;65280 =vert
        If Couleurjoueur>0 Or Couleurjoueur>0 Or Couleurjoueur>0
            touche=2
        Else
            touche=0
        EndIf
        ProcedureReturn touche
        
    EndProcedure 
    
    
    
    ;{-message_gagne_perdu
    message_gagne_perdu:
    If toucheordi=1
        toucheordi=0
        
        MessageRequester("Tron", "Tron a perdu", #PB_MessageRequester_Ok )
        ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
        scorehuman+1
        Goto debut
    EndIf
    If touche=2
        touche=0
        MessageRequester("Tron", "Tron a Gagné", #PB_MessageRequester_Ok )
        ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
        scoretron+1
        Goto debut
    EndIf
    Return
    ;}
    
    ;{- assistance_mur :
    assistance_mur :
    If xjoueur-vitessejoueur<10 And Couleurjoueurg=0 And pos=4
        pos=3
    EndIf
    If xjoueur-vitessejoueur<10 And Couleurjoueurd=0 And pos=4
        pos=1
    EndIf
    If xjoueur-vitessejoueur>760 And Couleurjoueurg=0 And pos=2
        pos=1
    EndIf
    If xjoueur-vitessejoueur>760 And Couleurjoueurd=0 And pos=2
        pos=3
    EndIf
    ;
    If yjoueur-vitessejoueur<10 And Couleurjoueurg=0 And pos=1
        pos=4
    EndIf
    If yjoueur-vitessejoueur<10 And Couleurjoueurd=0 And pos=1
        pos=2
    EndIf
    If yjoueur-vitessejoueur>560 And Couleurjoueurg=0 And pos=3
        pos=4
    EndIf
    If yjoueur-vitessejoueur>560 And Couleurjoueurd=0 And pos=3
        pos=2
    EndIf
    Return
    ;}


   
Dernière modification par Backup le ven. 06/juil./2007 14:16, modifié 2 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Si si! Excellent!
Comme quoi on s'amuse bien avec peu de chose!

Par contre, les touches, de temps en temps elles se répètent ou sont zappées. ça me fait hurler :?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Dobro, j'ai trouvé le code triche pour transpercer l'ennemis, du moins c'est lui qui a triché !!!

Image

Lio :wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Merci à tous, je vais analyser ça de près :wink:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Grace à vous j'ai réussis à faire le mien :D

Code : Tout sélectionner

#Largeur=800 
#Hauteur=600 
#Title="PB-Tron "
#Window=0

Enumeration
  #Curseur
  #Mur
EndEnumeration
  
Procedure Perdu()
  For n=1500 To 50 Step -20
    beep_(n,10)
  Next
EndProcedure

Procedure Collision(x,y,Direction.s)
  StartDrawing(ScreenOutput())
  Select Direction.s
    Case "h"
      If Point(x+5,y)
        Retour=1
      EndIf
    Case "b"
      If Point(x+5,y+10)
        Retour=1
      EndIf
    Case "d"
      If Point(x+10,y+5)
        Retour=1
      EndIf
    Case "g"
      If Point(x,y+5)
        Retour=1
      EndIf
  EndSelect
  StopDrawing()
  ProcedureReturn Retour
EndProcedure

Procedure Score()
  Start=ElapsedMilliseconds()
  Repeat
    StartDrawing(ScreenOutput())
    DrawText(#Largeur/2-20,10,Str(ElapsedMilliseconds()-Start),RGB(255,255,255),0)
    StopDrawing()
    sleep_(100)
  ForEver
EndProcedure

InitSprite() 
InitKeyboard() 
InitMouse() 
OpenWindow(#Window, 0, 0, #Largeur, #Hauteur, #Title, #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(#Window), 0, 0, 800, 600, 0, 0, 0) 

;/ Création du tron 
CreateSprite(#Curseur,10,10) 
StartDrawing(SpriteOutput(#Curseur)) 
Circle(5,5,5,RGB(255,255,255)) 
StopDrawing() 

;/ Création du Mur 
CreateSprite(#Mur,#Largeur,#Hauteur)
StartDrawing(SpriteOutput(#Mur))
Box(0,0,#Largeur,10,255)
Box(0,#Hauteur-10,#Largeur,10,255)
Box(0,0,10,#Hauteur,255)
Box(#Largeur-10,0,10,#Hauteur,255)
StopDrawing() 

Repeat
  ClearScreen(0)
  DisplayTransparentSprite(#Mur,0,0)
  Tid=CreateThread(@Score(),0)
  
  x=#Largeur/2 
  y=#Hauteur/2 
  
  Direction.s=Mid("gdhb",Random(3)+1,1)
 
  Repeat 
    Repeat 
      Event = WindowEvent() 
      Select Event 
        Case #PB_Event_CloseWindow 
          End 
      EndSelect 
    Until Event = 0 
    
    FlipBuffers() 
    
    ;/ Analyse clavier / quitte si ESC pressé 
    ExamineKeyboard() 
    If KeyboardPushed(#PB_Key_Escape) 
      End 
    EndIf 
    
    ;/ Gestion des touches
    
    If KeyboardPushed(#PB_Key_Left) And Direction<>"d"
      Direction="g"
    ElseIf KeyboardPushed(#PB_Key_Right) And Direction<>"g"
      Direction="d"
    ElseIf KeyboardPushed(#PB_Key_Up) And Direction<>"b"
      Direction="h"
    ElseIf KeyboardPushed(#PB_Key_Down) And Direction<>"h"
      Direction="b"
    EndIf 
    
    ;/ Déplace le tron dans la direction désirée
    Select Direction
      Case "g"
        x-1
      Case "d"
        x+1
      Case "h"
        y-1
      Case "b"
        y+1
    EndSelect
    
    
    If Collision(x,y,Direction)
      Perdu()
      KillThread(Tid)
      Break
    EndIf
    
    DisplayTranslucentSprite(#Curseur,x,y,255) 
    
    Delay(1) 
  ForEver 
ForEver
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Droopy a écrit :Grace à vous j'ai réussis à faire le mien :D
:cry: je joue même pas que je perds d'office !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai une erreur à la ligne 44 (avec le débogueur)
"The specified output is null"
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

comtois a écrit :j'ai une erreur à la ligne 44 (avec le débogueur)
"The specified output is null"
C'est surement du au Thread de gestion des scores
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

flaith a écrit :
Droopy a écrit :Grace à vous j'ai réussis à faire le mien :D
:cry: je joue même pas que je perds d'office !
Bizzare, chez moi ça marche :?:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

lionel_om a écrit :Dobro, j'ai trouvé le code triche pour transpercer l'ennemis, du moins c'est lui qui a triché !!!
Lio :wink:
c'est a cause du "Delay(50)" en ligne 138
si le test de collision est bloqué par le delay, il ne se fait pas !..

en diminuant le delay ont accelere le jeu, et du coup ont accelere aussi les tests !!

mettre une valeur de 40 me semble un bon compromis :D

ps : je vois que dans ton score sur la photo d'ecran Tron t'a mis la paté 5 fois ! :lol:


@Droopy : je pense que ton utilisation intensive des Repeat-Forever
n'est pas judicieuse , il plante chez moi aussi (v 4.10)
a cause de la creation du Tread !!
(meme en ayant activé Tread Safe)

il semblerai que certaine fois le tread est crée plusieurs fois sans avoir ete liberé , ce qui cause un plantage, sur "StartDrawing(ScreenOutput()) "
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

J'ai corrigé en supprimant le thread qui gérait les scores

Code : Tout sélectionner

#Largeur=800 
#Hauteur=600 
#Title="Droopy-PB-Tron" 
#Window=0 

Enumeration 
  #Curseur 
  #Mur 
EndEnumeration 
  
Procedure Perdu() 
  For n=1500 To 50 Step -20 
    beep_(n,10) 
  Next 
EndProcedure 

Procedure Collision(x,y,Direction.s) 
  StartDrawing(ScreenOutput()) 
  Select Direction.s 
    Case "h" 
      If Point(x+5,y) 
        Retour=1 
      EndIf 
    Case "b" 
      If Point(x+5,y+10) 
        Retour=1 
      EndIf 
    Case "d" 
      If Point(x+10,y+5) 
        Retour=1 
      EndIf 
    Case "g" 
      If Point(x,y+5) 
        Retour=1 
      EndIf 
  EndSelect 
  StopDrawing() 
  ProcedureReturn Retour 
EndProcedure 

InitSprite() 
InitKeyboard() 
InitMouse() 
OpenWindow(#Window, 0, 0, #Largeur, #Hauteur, #Title, #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(#Window), 0, 0, 800, 600, 0, 0, 0) 

;/ Création du tron 
CreateSprite(#Curseur,10,10) 
StartDrawing(SpriteOutput(#Curseur)) 
Circle(5,5,5,RGB(255,255,255)) 
StopDrawing() 

;/ Création du Mur 
CreateSprite(#Mur,#Largeur,#Hauteur) 
StartDrawing(SpriteOutput(#Mur)) 
Box(0,0,#Largeur,10,255) 
Box(0,#Hauteur-10,#Largeur,10,255) 
Box(0,0,10,#Hauteur,255) 
Box(#Largeur-10,0,10,#Hauteur,255) 
StopDrawing() 

Repeat 
  Start=ElapsedMilliseconds()
  ClearScreen(0) 
  DisplayTransparentSprite(#Mur,0,0) 
  
  x=#Largeur/2 
  y=#Hauteur/2 
  
  Direction.s=Mid("gdhb",Random(3)+1,1) 
  
  Repeat 
    Repeat 
      Event = WindowEvent() 
      Select Event 
        Case #PB_Event_CloseWindow 
          End 
      EndSelect 
    Until Event = 0 
    
    FlipBuffers() 
    
    ;/ Analyse clavier / quitte si ESC pressé 
    ExamineKeyboard() 
    If KeyboardPushed(#PB_Key_Escape) 
      End 
    EndIf 
    
    ;/ Gestion des touches 
    
    If KeyboardPushed(#PB_Key_Left) And Direction<>"d" 
      Direction="g" 
    ElseIf KeyboardPushed(#PB_Key_Right) And Direction<>"g" 
      Direction="d" 
    ElseIf KeyboardPushed(#PB_Key_Up) And Direction<>"b" 
      Direction="h" 
    ElseIf KeyboardPushed(#PB_Key_Down) And Direction<>"h" 
      Direction="b" 
    EndIf 
    
    ;/ Déplace le tron dans la direction désirée 
    Select Direction 
      Case "g" 
        x-1 
      Case "d" 
        x+1 
      Case "h" 
        y-1 
      Case "b" 
        y+1 
    EndSelect 
     
    If Collision(x,y,Direction) 
      Perdu() 
      Break 
    EndIf 
    
    DisplayTranslucentSprite(#Curseur,x,y,255) 
    StartDrawing(ScreenOutput()) 
    DrawText(#Largeur/2-20,10,Str(ElapsedMilliseconds()-Start),8454143,0) 
    StopDrawing() 
    
    Delay(1) 
  ForEver 
ForEver
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Dobro a écrit :ps : je vois que dans ton score sur la photo d'ecran Tron t'a mis la paté 5 fois ! :lol:
Lol oué :P
En fait je m'assusais à essayer de l'enfermer, mais j'étais un tout petit peu trop moux du clavier... Mais quand j'ai réussis, il m'a mis sur le cu1... :o 8O

Lio :wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre