Page 2 sur 3

Publié : jeu. 26/juil./2007 23:57
par Ollivier
On a tous droit à not' péché mignon :wink:

Publié : ven. 27/juil./2007 11:11
par Polux
Ecran noir et plantage pour moi ( PIV 3.0Ghz 2Go de RAM ATI FireGl 256Mo )... le debugger se vautre ( et même en le désactivant c pareil ).
ça me fait penser qu'on pourrait lancer un truc: un petit défi aux codeurs chevronnés et passionnés qui passent tous les jours ici ;): coder un jeu avec le minimum de lignes de code :)

hélas, c'est qu'est l'os

Publié : ven. 27/juil./2007 12:06
par beauregard
Polux a écrit :Ecran noir et plantage pour moi ( PIV 3.0Ghz 2Go de RAM ATI FireGl 256Mo )... le debugger se vautre ( et même en le désactivant c pareil ).
y a un os ! ;)

Le moins que l'on puisse dire, c'est que ce n'est pas normal: sur mon vieux PC que ma tante voulait jeter à la poubelle(!) et que j'ai donc récupéré pour me connecter sans crainte que l'on fouille dans mes affaires, mais j'arrête là de raconter ma vie, sur cet ancien PC donc ( Amd athlon xp 1700+ , 512Mo de ram, radeon 7000 serie avec seulement 64Mo), çà tourne sans soucis entre 57 et 59 images par seconde...

... et vu la simplicité du code ( dépourvu de routines ou d'appel de librairie, ou encore d'adressage avec d'obscurs peek truc ou poke machin), je ne pense pas que ce code soit responsable.

Peut être la dernière version beta de pb maltraite les sprites3D ? ( Pour ma part je me contente de la version 4.02, car j'aime bien la stabilité.)

Publié : ven. 27/juil./2007 12:12
par beauregard
Polux a écrit :ça me fait penser qu'on pourrait lancer un truc: un petit défi aux codeurs chevronnés et passionnés qui passent tous les jours ici ;): coder un jeu avec le minimum de lignes de code :)
bon ben, c'est moi le gagnant alors ! ;)
1358 lignes c'est encore trop ? même en virant les commentaires ? ;)

Publié : ven. 27/juil./2007 12:14
par Polux
je me souviens avoir poster un space invader qui devait faire une centaine de lignes ;) ( et sans optimiser )

j'ai moi aussi PB 4.02...

Publié : ven. 27/juil./2007 12:20
par beauregard
Polux a écrit :j'ai moi aussi PB 4.02...
je te suggère de tester ta machine concernant les sprites 3D, heu..., et tiens voilà un ptit code qui tourne à 28 i/s sur mon vieux coucou( le carré blanc se bouge à l'aide des touches fléchés du clavier gauche, droite et haut):

Code : Tout sélectionner

; ------------------------------------------------------------
; droit dans le mur - 2007 - source purebasic 4. et des poussières
;
; Collision sans fonction.
;
; France - Toulouse - H. Philippe - pseudo: beauregard
; ------------------------------------------------------------

;UsePNGImageDecoder () ; oui, toi t'es obligatoire.

If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0 
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf

Enumeration ; ici, on donne un petit nom à nos sprites( non, chuis pas un numéro !):
; tout en sprites3D, même le décor (pourquoi s'embéter ?):
     #fondA 
     #fondA3D
; dirigé par le joueur durand la phase de jeu:
     #champi ; 
     #champi3D 
; bloc solide:
     #blocs
     #blocs3D
   
; permet au progammeur de repèrer les positions des divers objets qu'il teste à l'écran:         
     #repere
     #repere3D          
EndEnumeration

;Global page.w=0,niveau.w=1
;Global placemX=512,placemY=384



; chamcoll-> =1 collision à droite, =2 collision à gauche.
Global champX.w, champY.w,chamcoll.w,champsol.w,champlafond.w
Global champsaut.w,champsautH.w,champsautV.w,champsautM.w

Global nbrebs 

Structure balle
id.l 
x.w
Y.w
sensx.l
sensy.l
sr.w
attract.w
EndStructure

Global NewList bs.balle(); bloc solide, c'est à dire infranchissable des 4 côtés. 
Declare Fchampignon()
Declare Fcloneblocs()





; Si votre PC ne peut pas afficher une haute résoution résolution en 32bit, Alors arrêt du programme.

;If OpenScreen (1440, 900, 32, "droit dans le mur" )=0 
If OpenScreen (1024, 768, 32, "droit dans le mur" )=0 
     MessageRequester ( "Error" , "Can't open a 1024*768 - 32 bit screen !" , 0)
     End
EndIf


; fond:
CreateSprite ( #fondA ,64,64, #PB_Sprite_Texture ) 
 StartDrawing ( SpriteOutput ( #fondA ))
  BackColor ( RGB (0,0,0))
   Box (0,0, 64, 64, RGB (8,8,120))

  LineXY (0, 0, 32, 0, RGB (88,8,88))  
  LineXY (32, 0, 0, 32, RGB (88,8,88)) 
  LineXY (0, 32, 0, 0, RGB (88,8,88)) 

  LineXY (64, 63, 48, 63, RGB (88,8,88)) 
  LineXY (48, 63, 63, 48, RGB (88,8,88)) 
  LineXY (63, 48, 63, 63, RGB (88,8,88)) 
    
 StopDrawing ()
CreateSprite3D ( #fondA3D , #fondA ) ; osons les amis, osons ! 




; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; champignon:
CreateSprite ( #champi ,64,64, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #champi ))
  BackColor ( RGB (0,0,0))
 
  Box (0,0, 128, 128, RGB (255,255,255))
 StopDrawing ()
CreateSprite3D ( #champi3D , #champi )  

; decor blocsolide (objet intéractif car il fait office à la fois de mur, sol et plafond).
CreateSprite ( #blocs ,64,64, #PB_Sprite_Texture )  
 StartDrawing ( SpriteOutput ( #blocs ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 4, 64, RGB (0,104,0))
  Box (4,0, 4, 64, RGB (16,152,16)) 
  Box (8,0, 12, 64, RGB (0,208,0)) 
  Box (20,0, 4, 64, RGB (152,248,168))  
  Box (24,0, 4, 64, RGB (248,248,248))   
  Box (28,0, 4, 64, RGB (152,248,168)) 
  Box (32,0, 8, 64, RGB (80,232,80))
  Box (36,0, 4, 64, RGB (0,208,0)) 
  Box (40,0, 4, 64, RGB (16,152,16)) 
  Box (44,0, 12, 64, RGB (0,208,0))
  Box (56,0, 4, 64, RGB (16,152,16))
  Box (60,0, 4, 64, RGB (0,104,0))
 StopDrawing ()
CreateSprite3D ( #blocs3D , #blocs ) 
     





; repere ( utilisé uniquement par le programmeur):
CreateSprite ( #repere ,4,4, #PB_Sprite_Texture ) 
 StartDrawing ( SpriteOutput ( #repere ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 4, 4, RGB (255,255,255)) 
 StopDrawing ()
CreateSprite3D ( #repere3D , #repere )


Global zutA,zutB,zutC ; pour repère la variable qui n'aurait la bonne valeur.
;MouseLocate(449,62)
tpb=255
; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************


 ExamineMouse():ExamineKeyboard ()

If KeyboardPushed ( #PB_Key_Add ) And tpb<255:tpb+1:EndIf
If KeyboardPushed ( #PB_Key_Subtract ) And tpb>5:tpb-1:EndIf
 
       Start3D ()    

  For a=0 To 15 ; 1024/64=16
   For b=0 To 11 ; 768/64=12  
    DisplaySprite3D(#fondA3D, a*64, b*64, 255) ; 16*12
   Next
  Next    
   
   
   
   
; **********************************************************************************************
; fabrication bloc solide: 
 If nbrebs<1:nbrebs+1:Fcloneblocs():EndIf  

; Affichage clone bloc solide si existe:
 ForEach bs()

  ; chamcoll -> =1 collision à droite, =2 collision à gauche.     
  If champX+64>bs()\x-1 And champX+64<bs()\x+16
   If (champY>bs()\Y+15 And champY<bs()\Y+49) 
       chamcoll=1
   EndIf  
  EndIf
  If champX+64>bs()\x-1 And champX+64<bs()\x+16
   If (champY+16>bs()\Y+15 And champY+16<bs()\Y+49) Or (champY+48>bs()\Y+15 And champY+48<bs()\Y+49)
       chamcoll=1
   EndIf  
  EndIf
  
  If champX>bs()\x+48 And champX<bs()\x+65
   If (champY>bs()\Y+15 And champY<bs()\Y+49)      
       chamcoll=2
   EndIf  
  EndIf
  If champX>bs()\x+48 And champX<bs()\x+65
   If (champY+16>bs()\Y+15 And champY+16<bs()\Y+49) Or (champY+48>bs()\Y+15 And champY+48<bs()\Y+49)     
       chamcoll=2
   EndIf  
  EndIf
       
  ; champsol -> =1 collision avec la partie haute du bloc solide:
  If (champX+8>bs()\x+7 And champX+8<bs()\x+57) Or (champX+56>bs()\x+7 And champX+56<bs()\x+57)
   If (champY+64>bs()\Y-1 And champY+64<bs()\Y+16)    
       champsol=1:champY=(bs()\Y-64)+1
   EndIf     
  EndIf     


  ; champlafond -> =1 collision avec le plafond
  If (champX+8>bs()\x+7 And champX+8<bs()\x+57) Or (champX+56>bs()\x+7 And champX+56<bs()\x+57)
   If champY>bs()\Y+48 And champY<bs()\Y+65    
       champlafond=1
   EndIf     
  EndIf 



     
   DisplaySprite3D ( bs()\id , bs()\x, bs()\Y, tpb)  
 
 Next 
  
  
  
  
  
  
 ; Contrôlé par le joueur:
 If depart=0:depart=1:champX+512:champY+64:EndIf  
 
 Fchampignon()
   
  
   
   
   
   
     Stop3D ()



 ; ligne de test afin de connaître la valeur des variables:    
 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))    
   
    chamcoll$= Str (chamcoll)    
    champsol$= Str (champsol) 
    champlafond$= Str (champlafond)
    
    tpb$= Str (tpb)     
     
    zutB$= Str (zutB) 
    zutC$= Str (zutC)    
    DrawText (50,1+20, "chamcoll: " +chamcoll$)
    DrawText (50,1+40, "champsol: " +champsol$)    
    DrawText (50,1+60, "champlafond: " +champlafond$) 
    
    DrawText (50,1+100, "testX: " +testX$)
    DrawText (50,1+120, "testY: " +testY$)
    
    DrawText (50,1+260, "zutB: " +zutB$);:zutB=0 
    DrawText (50,1+280, "zutC: " +zutC$);:zutC=0
            
    DrawText (350,20, "appuyez sur la touche R pour remise à 0 du code")
    DrawText (350,50, "appuyez sur la touche - ou + du pavé numérique ")
    DrawText (365,70, "niveau transparence des blocs solides: " +tpb$)
 StopDrawing ()

 
 Gosub fps ; nombre d'image par seconde. 
    
 If KeyboardPushed ( #PB_Key_R ):champX=0:champY=0:depart=0:tpb=255:EndIf ; reset
     
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; remise à 0 des variables avertissant d'une collision:
    chamcoll=0:champsol=0:champlafond=0  
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
;FlipBuffers (60) 
    FlipBuffers (): ClearScreen ( RGB (0,0,0))    
; ******************************************************************************************************     
Until KeyboardPushed ( #PB_Key_Escape ): End ; fin de la boucle principale (appuyez sur la touche Esc)
; ******************************************************************************************************   




fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek ; regardez pas là, c'est trop compliqué. Arrêtez j'vous dis! Bon ben, je
     ; vous aurez prévenu...
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
 
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
DrawText (1,1, "FPS: " +FPS$)



StopDrawing ()
Return

; ***********************************************************************************************
; ********************************* ici commence les procedures *********************************
; ***********************************************************************************************
Procedure Fcloneblocs() ; 64*64 fabrication clone bloc solide:

; placement clone bloc solide:

; faisons le sol:
 For a=0 To 15 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=a*64:bs()\y=704
 Next

; faisons 2 autres blocs ( mur):
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=0:bs()\y=640
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=1024-64:bs()\y=640

; faisons un 1er plafond:
 For a=0 To 3 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=a*64:bs()\y=512
 Next
; faisons un 2eme plafond:
 For a=0 To 2 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=(a*64)+192:bs()\y=320
 Next
; faisons un 3eme plafond:
 For a=0 To 1 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=(a*64)+640:bs()\y=192
 Next
  
; et faisont mumuse avec d'autres constructions...
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=448:bs()\y=640    
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=512:bs()\y=640 
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=448:bs()\y=576 
  
EndProcedure
 
Procedure Fchampignon() ; 64*64

; chamcoll-> =1 collision à droite, =2 collision à gauche.

 If KeyboardPushed ( #PB_Key_Right ) And chamcoll<>1
   champX+6
   If champX>1024-64:champX-6:EndIf
 EndIf
 If KeyboardPushed ( #PB_Key_Left ) And chamcoll<>2
   champX-6
   If champX<0:champX+6:EndIf
 EndIf

 If KeyboardPushed ( #PB_Key_Up ) And champsol=1 And champsaut=0:champsaut=1:EndIf
 
 If champsaut=1
 
 
 
   If champsautH<15 ;H comme hauteur du saut
     champsautV=12:champsautH+1
   EndIf
   If champsautH+champsautM>14 And champsautH+champsautM<25 ; M comme modulable
     champsautV=10:champsautM+1
   EndIf
   If champsautH+champsautM>24 And champsautH+champsautM<35
     champsautV=8:champsautM+1
   EndIf

   champY=champY-champsautV; V comme vitesse de la montée lors du saut.

; si (joueur lache touche haut ET saut minimum effectué) OU hauteur saut maximal atteind, alors... 
   If (KeyboardPushed ( #PB_Key_Up )=0 And champsautH>14)  Or champsautH+champsautM=35 Or champlafond=1
     champsautH=0:champsautM=0:champsaut=0
   EndIf 
 EndIf
 
 
 If champsol=0 And champsaut=0 ;  si champignon ne touche plus le sol ET pas de saut, alors...
   champY+8
 EndIf

    DisplaySprite3D ( #champi3D , champX, champY, 255)



EndProcedure 

; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 265
; FirstLine = 245
; Folding = -
:cry:
heu... là il faut demander de l'aide aux anciens qui seront surement là ce soir, et demande aussi à djes de tester peur basique...

Publié : ven. 27/juil./2007 12:30
par Polux
LOL
je fais tourner Two et lethal 4 dessus ( et y a un paquet de sprites 3D )
je les développe dessus.

ps: ton second code fonctionne lui.

en mode fenêtre, c'est aussi possible.

Publié : mar. 15/janv./2008 22:20
par beauregard
...

Publié : mar. 15/janv./2008 22:37
par comtois
très sympa ton jeu :)

Pour info PureBasic libère automatiquement les images et les autres objets quand tu quittes le programme.

Publié : ven. 18/janv./2008 4:49
par Huitbit
Finaliser un jeu (original en plus) ça mérite un gros
BRAVO !


Un autre, un autre !

Publié : ven. 18/janv./2008 12:46
par beauregard
Merci les amis ! :D

Publié : mar. 12/févr./2008 18:51
par beauregard
Merci pour vos compliments ! :D Cela m'a donné de la force pour mettre la touche finale:
contenu-> le joueur a désormais droit a plusieurs vies( gestion de la vie: si la barre d'énergie est pleine, alors vous pouvez obtenir une vie supplémentaire en appuyant sur la barre espace).
contenant-> un autre fond interactif + ajout du son( merci Tonton!).
Dernière version, en mode fenêtre( testé sur un athlon64 3500+ et geforce 7600gs 256Mo avec winXP), et cette foi-ci, je n'ai pas lésiné sur le nombre de sprite à l'écran. code en 2 parties:

Code : Tout sélectionner

; ------------------------------------------------------------
; video game - PC 
; Peur Basique - mode fenêtre - 12/02/2008 - source PureBasic 4.10
; France - pseudo: beauregard
; touche F afin de connaître le nombre d'image par seconde.
; Merci à tout les membres du Forum "non officiel" de pb 
; qui ont pris le temps de répondre à mes interrogations.
; http://www.purebasic.fr/french/index.php
; ------------------------------------------------------------
InitSound()
  ; variable pour la conception de bruitage tout en code:
  ondea.f:ondeb.f:ondec.f:onded.f:ondee.f:brh0.f:brsong.w:choixondee.f
  ;------ conception des bruitages ------
  choixondee=0.00029:Gosub soundconception
    CatchSound(0,?music);on pointe le debut du fi
    SoundVolume(0, 100);volume de 0 a 100
  choixondee=0.00004:Gosub soundconception
    CatchSound(1,?music);on pointe le debut du fi
    SoundVolume(1, 100);volume de 0 a 100

If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf

Enumeration ; ici, on donne un petit nom à nos sprites( non, chuis pas un numéro !):
     #fondA:#fondB:#fondC
     #logotitre:#logotitre3D
; dirigé par le joueur durand l'introduction:
     #pb:#pb3D
; dirigé par le joueur durand la phase de jeu:
     #ghost:#ghost3D
     #oeil:#oeil3D
     #drapA:#drapA3D ; drap animation 1 
     #drapB:#drapB3D ; drap animation 2 
; barre d'énergie:
     #sphoton     
     #photon
     #photonm
; bonbon pour remonter la barre d'énergie ( mais qui fait également grossir ! ):
     #bonbon:#bonbon3D
     #eonbon:#eonbon3D ; enveloppe du bonbon
     #pointA:#pointA3D     
     #pointB:#pointB3D
; vilain:
     #elice:#elice3D
       #pic:#pic3D     
; permet au progammeur de repèrer les positions des divers objets qu'il teste à l'écran:         
     #repere:#repere3D
; intro:     
     #fleche:#fleche3D
     #flechf:#flechf3D
     #ghostB:#ghostB3D
EndEnumeration

Global gposX.w, gposY.w, ybonbon.w, d1fleche.b, Tbeep.w, TTbeep.w, affichagefond.b, nbrevie.b=3, Tinvuln.w
Global nbreis.b ; nombre d'image par seconde ( appuyez sur la touche F).
Global page.w=0, niveau.w=1, etapeanim.w, etanT.w, mange.w, Tniveau.w
Global animdrap.w=0 ; animation du drap
Global ghostv.w=255 ; niveau de visibilité au regard des vilains gloutons.
Global energie.w, energid.b ; utilisé pour se rendre transparent, ou maigrir.
Global Tenergie.w=0 ; tempo pour établir la vitesse d'épuisement de la barre l'énergie.
Global energirmax.b ; si energie est au maximum, alors il faut le signifier visuellement au joueur( peut gagner une vie).
Global gtaille.w=50 ; taille du ghost qui peut aller de 50 à 200.
Global ghostaie.w ; ghost subit contact mortel.
Global testX.w, testY.w ; position X et Y du curseur de la souris.
Global repereX.w, repereY.w
Global possx.w, memsx.w
Global zattract.w ; utilisé pour définir la zone d'attraction du ghost.
; variables globales utilisées pour clone elice:
Global eli_bord.w, eli_taille.w, eli_speed.w, eli_choix.w, eli_sensrot.w
Global tourne.w, tourne2.w=-180, tournf.w, tournf2.w=-180, tournestop.w 

Global pointd.w, pointm.w, pointn.w, pointg.w, pointX.w, pointY.w, pointt.w

Global placemX.w=512, placemY.w=384

Structure objet ; opération de clonage... 
 id.l
 x.w
 x2.w
 Y.w
 sensx.l
 sensy.l
 sr.w
 attract.w
EndStructure
Global NewList bonbon.objet()
Global NewList elice.objet();
Global NewList bfond.objet(); bloc fond

Declare Fclonebfond()
Declare Fcloneb() ; bonbon
Declare Fclonee() ; elice
Declare Fghost(); ghost
Declare Freset() ; remise à 0 en appuyant sur la touche R
Declare Ftestcodeur()
Declare Fintro()
Declare MelodieBeep(melodie.s)
Declare Fin()

If OpenWindow ( 0 , 0, 0, 1024+48, 768+48, "Peur Basique" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_ScreenCentered  ) ; on ouvre une fenetre
 OpenWindowedScreen ( WindowID ( 0 ), 23, 23, 1024, 768, 0, 1, 1) ; un ecran graphique dans la fenêtre.
EndIf
; °°°°°°°°°°°°°°°°°°°°  fonte °°°°°°°°°°°°°°°°°°°°°°°°°°
LoadFont ( 0 , "Comic Sans Ms" ,16,#PB_Font_Bold)
FontID = LoadFont ( 1 , "arial" , 25, #PB_Font_Bold )
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; logotitre
CreateSprite ( #logotitre ,256,256, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #logotitre ))
  DrawingFont ( FontID ( 1 )) 
   BackColor ( RGB (0,0,0))
      FrontColor ( RGB (154,154,154))
      DrawText (0+1,0+1, "PEUR BASIQUE")
      FrontColor ( RGB (224,224,224))
      DrawText (0,0, "PEUR BASIQUE")   
 StopDrawing ()
CreateSprite3D ( #logotitre3D , #logotitre )
; fond:
CreateSprite ( #fondA ,64,64)
 StartDrawing ( SpriteOutput ( #fondA ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 64, 64, RGB (108,119,206)):Box (1,1, 62, 62, RGB (26,45,190)):Box (2,2, 60, 60, RGB (0,17,142)) 
  Box (16,16, 32, 32, RGB (2,11,83)):Box (18,18, 30, 30, RGB (1,8,43))
 StopDrawing ()
CreateSprite ( #fondB ,64,64)
 StartDrawing ( SpriteOutput ( #fondB ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 64, 64, RGB (108,119,206)):Box (1,1, 62, 62, RGB (26,45,190)):Box (2,2, 60, 60, RGB (1,10,62)) 
  Box (22,22, 20, 20, RGB (2,11,83)):Box (24,24, 18, 18, RGB (1,8,43))       
 StopDrawing ()
CreateSprite ( #fondC ,64,64)
 StartDrawing ( SpriteOutput ( #fondC ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 64, 64, RGB (108,119,206)):Box (1,1, 62, 62, RGB (26,45,190)):Box (2,2, 60, 60, RGB (0,13,95)) 
  Box (18,18, 28, 28, RGB (2,11,83)):Box (20,20, 26, 26, RGB (1,8,43))
 StopDrawing () 
; icone souris( en forme de cartouche de jeu pour la console purebasiconsole):
CreateSprite ( #pb ,128,128, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pb ))
  BackColor ( RGB (164,21,21))
    Box (0,0, 128, 9, RGB (158,5,5))
    Box (10,10, 108, 118, RGB (241,224,224))
    FrontColor ( RGB (255,255,255))   
    DrawText (28,22, " purebasic ")
    DrawText (13,55, "PEUR BASIQUE")
  Box (40+15,80, 4*4, 4, RGB (158,5,5))
  Box (24/2+35,82, 4*8, 4, RGB (162,15,15))
  Box (40/2+35,84, 4*4, 4, RGB (164,21,21)):Box (16/2+35,84, 4, 4, RGB (164,21,21)):Box (88/2+35,84, 4, 4, RGB (164,21,21))
  Box (48/2+35,86, 4*2, 4, RGB (168,32,32)):Box (8/2+35,86, 4, 4, RGB (168,32,32)):Box (96/2+35,86, 4, 4, RGB (168,32,32))
  Box (48/2+35,88, 4*2, 4, RGB (172,42,42)):Box (8/2+35,88, 4, 4, RGB (172,42,42)):Box (96/2+35,88, 4, 4, RGB (172,42,42))
  Box (40/2+35,90, 4*4, 4, RGB (176,53,53)):Box (8/2+35,90, 4*2, 4, RGB (176,53,53)):Box (88/2+35,90, 4*2, 4, RGB (176,53,53)) 
  Box (0+35,92, 4*14, 4, RGB (179,61,61))
  Box (0+35,94, 4*14, 4, RGB (185,77,77))
  Box (0+35,96, 4*14, 4, RGB (190,89,89))
  Box (0+35,98, 4*14, 4, RGB (195,102,102))
  Box (0+35,100, 4*14, 4, RGB (200,115,115))
  Box (0+35,102, 4*14, 4, RGB (204,127,127))
  Box (0+35,104, 4*4, 4, RGB (209,140,140)):Box (40/2+35,104, 4*4, 4, RGB (209,140,140)):Box (80/2+35,104, 4*4, 4, RGB (209,140,140)) 
  Box (8/2+35,106, 4*2, 4, RGB (214,152,152)):Box (48/2+35,106, 4*2, 4, RGB (214,152,152)):Box (88/2+35,106, 4*2, 4, RGB (214,152,152))
 StopDrawing ()
CreateSprite3D ( #pb3D , #pb )
; support photon (support pour chaque barre d'énergie du ghost):
CreateSprite ( #sphoton ,32,32)
 StartDrawing ( SpriteOutput ( #sphoton ))
  BackColor ( RGB (0,0,0))
   Box (0,0, 32, 20, RGB (255,255,255)):Box (2,2, 28, 16, RGB (30,58,30))
 StopDrawing ()
; photon (barre d'énergie du ghost):
CreateSprite ( #photon ,32,32)
 StartDrawing ( SpriteOutput ( #photon ))
  BackColor ( RGB (0,0,0))
   Box (2,2, 28, 16, RGB (0,42,13)):Box (3,3, 26, 14, RGB (28,155,40))::Box (4,4, 24, 12, RGB (62,170,72))  
 StopDrawing ()
; photonm (barre d'énergie du ghost au maximum):
CreateSprite ( #photonm ,32,32)
 StartDrawing ( SpriteOutput ( #photonm ))
  BackColor ( RGB (0,0,0))
   Box (2,2, 28, 16, RGB (28,155,40)):Box (3,3, 26, 14, RGB (62,170,72))::Box (4,4, 24, 12, RGB (105,188,112))  
 StopDrawing ()
; ghost:
CreateSprite ( #ghost ,128,128, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #ghost ))
  BackColor ( RGB (0,0,0))
  Box (40,0, 8*4, 8, RGB (48,231,225))
  Box (24,8, 8*8, 8, RGB (64,233,227))
  Box (40,16, 8*4, 8, RGB (80,235,229)):Box (16,16, 8, 8, RGB (80,235,229)):Box (88,16, 8, 8, RGB (80,235,229))
  Box (24,16, 8*2, 8, RGB (255,255,255)):Box (24+(6*8),16, 8*2, 8, RGB (255,255,255))
  Box (48,24, 8*2, 8, RGB (102,237,233)):Box (8,24, 8, 8, RGB (102,237,233)):Box (96,24, 8, 8, RGB (102,237,233))
  Box (16,24, 8*4, 8, RGB (255,255,255)):Box (16+(6*8),24, 8*4, 8, RGB (255,255,255))
  Box (48,32, 8*2, 8, RGB (123,240,236)):Box (8,32, 8, 8, RGB (123,240,236)):Box (96,32, 8, 8, RGB (123,240,236))
  Box (16,32, 8*4, 8, RGB (255,255,255)):Box (16+(6*8),32, 8*4, 8, RGB (255,255,255))
  Box (40,40, 8*4, 8, RGB (146,242,239)):Box (8,40, 8*2, 8, RGB (146,242,239)):Box (88,40, 8*2, 8, RGB (146,242,239)) 
  Box (24,40, 8*2, 8, RGB (255,255,255)):Box (24+(6*8),40, 8*2, 8, RGB (255,255,255))
  Box (0,48, 8*14, 8, RGB (168,245,242))
  Box (0,56, 8*14, 8, RGB (191,248,246))
  Box (0,64, 8*14, 8, RGB (211,250,249))
  Box (0,72, 8*14, 8, RGB (228,252,251))
  Box (0,80, 8*14, 8, RGB (238,253,252))
  Box (0,88, 8*14, 8, RGB (244,254,253)) 
 StopDrawing ()
CreateSprite3D ( #ghost3D , #ghost )
; beauregard du ghost:
CreateSprite ( #oeil ,128,128, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #oeil ))
  BackColor ( RGB (0,0,0))
  Box (24,24, 16, 16, RGB (0,30,255)):Box (72,24, 16, 16, RGB (0,30,255))
 StopDrawing ()
CreateSprite3D ( #oeil3D , #oeil )
; drapA du ghost:
CreateSprite ( #drapA ,128,128, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #drapA ))
  BackColor ( RGB (0,0,0))
  Box (0,96, 8*2, 8, RGB (255,255,255)):Box (24,96, 8*3, 8, RGB (255,255,255))
  Box (64,96, 8*3, 8, RGB (255,255,255)) :Box (96,96, 8*2, 8, RGB (255,255,255))
  Box (0,104, 8, 8, RGB (255,255,255)):Box (32,104, 8*2, 8, RGB (255,255,255))
  Box (64,104, 8*2, 8, RGB (255,255,255)) :Box (104,104, 8, 8, RGB (255,255,255))
 StopDrawing ()
CreateSprite3D ( #drapA3D , #drapA )
; drapB du ghost:
CreateSprite ( #drapB ,128,128, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #drapB ))
  BackColor ( RGB (0,0,0))
  Box (0,96, 8*4, 8, RGB (255,255,255)):Box (40,96, 8*4, 8, RGB (255,255,255)):Box (80,96, 8*4, 8, RGB (255,255,255)) 
  Box (8,104, 8*2, 8, RGB (255,255,255)):Box (48,104, 8*2, 8, RGB (255,255,255)):Box (88,104, 8*2, 8, RGB (255,255,255))
 StopDrawing ()
CreateSprite3D ( #drapB3D , #drapB )
; bonbon:
CreateSprite ( #bonbon ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #bonbon ))
  BackColor ( RGB (0,0,0))
  Circle(12,12, 12, RGB (251,161,194)) 
  Circle(14,7, 4, RGB (255,201,230))
 StopDrawing ()
CreateSprite3D ( #bonbon3D , #bonbon )
; eonbon: ( e comme enveloppe)
CreateSprite ( #eonbon ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #eonbon ))
  BackColor ( RGB (0,0,0))
  Circle(16,16, 16, RGB (251,131,174)) 
 StopDrawing ()
CreateSprite3D ( #eonbon3D , #eonbon )
; +10 --> chaque bonbon récolté rapporte, avec un ghost d'une taille<200, 10 points:
CreateSprite ( #pointA ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pointA ))
  BackColor ( RGB (0,0,0))
  FrontColor ( RGB (255,255,255)):DrawText (0,0, "+10")
 StopDrawing ()
CreateSprite3D ( #pointA3D , #pointA )
; +100 --> chaque bonbon récolté rapporte, avec un ghost d'une taille=200, 100 points:
CreateSprite ( #pointB ,32,32, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #pointB ))
  BackColor ( RGB (0,0,0))
  FrontColor ( RGB (255,255,255)):DrawText (0,0, "+100")
 StopDrawing ()
CreateSprite3D ( #pointB3D , #pointB )
; elice:
CreateSprite ( #elice ,64,64, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #elice ))
  BackColor ( RGB (0,0,0))
  Circle(32,32, 32, RGB (255,236,0)):Circle(32,32, 31, RGB (255,200,0))
  Circle(32,32, 30, RGB (255,164,0)):Circle(32,32, 29, RGB (255,128,0))
  Circle(32,32, 28, RGB (255,92,0)):Circle(32,32, 27, RGB (255,7,0))
 StopDrawing ()
CreateSprite3D ( #elice3D , #elice )
; pale de l'elice:
CreateSprite ( #pic ,16,16, #PB_Sprite_Texture ) ; objet tournant autour du disque
 StartDrawing ( SpriteOutput ( #pic ))
  BackColor ( RGB (0,0,0))
    LineXY (0,1, 16,1, RGB (245,245,245))
    LineXY (16,1, 8,15, RGB (245,245,245))
    LineXY (8,15, 0,1, RGB (245,245,245))
    FillArea (8,4, RGB (245,245,245), RGB (245,245,245)) 
 StopDrawing ()
CreateSprite3D ( #pic3D , #pic )
; repere ( utilisé uniquement par le programmeur):
CreateSprite ( #repere ,4,4, #PB_Sprite_Texture )
 StartDrawing ( SpriteOutput ( #repere ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 4, 4, RGB (255,255,255))
 StopDrawing ()
CreateSprite3D ( #repere3D , #repere )
; grand ghost pour l'animé de l'intro:
CreateSprite ( #ghostB ,128,128, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #ghostB ))
  BackColor ( RGB (0,0,0))
  Box (40,0, 8*4, 8, RGB (255,8,23))
  Box (24,8, 8*8, 8, RGB (255,18,31))
  Box (40,16, 8*4, 8, RGB (255,29,42)):Box (16,16, 8, 8, RGB (255,29,42)):Box (88,16, 8, 8, RGB (255,29,42))
  Box (24,16, 8*2, 8, RGB (255,255,255)):Box (24+(6*8),16, 8*2, 8, RGB (255,255,255))
  Box (48,24, 8*2, 8, RGB (255,43,55)):Box (8,24, 8, 8, RGB (255,43,55)):Box (96,24, 8, 8, RGB (255,43,55))
  Box (16,24, 8*4, 8, RGB (255,255,255)):Box (16+(6*8),24, 8*4, 8, RGB (255,255,255))
  Box (48,32, 8*2, 8, RGB (255,58,70)):Box (8,32, 8, 8, RGB (255,58,70)):Box (96,32, 8, 8, RGB (255,58,70))
  Box (16,32, 8*4, 8, RGB (255,255,255)):Box (16+(6*8),32, 8*4, 8, RGB (255,255,255))
  Box (40,40, 8*4, 8, RGB (255,75,86)):Box (8,40, 8*2, 8, RGB (255,75,86)):Box (88,40, 8*2, 8, RGB (255,75,86)) 
  Box (24,40, 8*2, 8, RGB (255,255,255)):Box (24+(6*8),40, 8*2, 8, RGB (255,255,255))
  Box (0,48, 8*14, 8, RGB (255,93,103))
  Box (0,56, 8*14, 8, RGB (255,113,121))
  Box (0,64, 8*14, 8, RGB (255,142,149))
  Box (0,72, 8*14, 8, RGB (255,176,181))
  Box (0,80, 8*14, 8, RGB (255,209,212))
  Box (0,88, 8*14, 8, RGB (255,238,239))     
 StopDrawing ()
CreateSprite3D ( #ghostB3D , #ghostB)
; fleche pour l'intro:
CreateSprite ( #fleche ,32,32, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #fleche ))
  BackColor ( RGB (0,0,0))
   LineXY (0,0, 16,0, RGB (250,250,250)) 
   LineXY (16,0, 0,16, RGB (250,250,250))
   LineXY (0,16, 0,0, RGB (250,250,250))
   LineXY (12,6, 16,10, RGB (250,250,250))
   LineXY (16,10, 10,16, RGB (250,250,250))
   LineXY (5,11, 10,16, RGB (250,250,250))
 StopDrawing ()
CreateSprite3D ( #fleche3D , #fleche)
; flechf pour l'intro:
CreateSprite ( #flechf ,32,32, #PB_Sprite_Texture ) ; objet dirigé par le joueur si pointe bonbon.
 StartDrawing ( SpriteOutput ( #flechf ))
  BackColor ( RGB (0,0,0))
   LineXY (0,0, 16,0, RGB (255,6,59)) 
   LineXY (16,0, 0,16, RGB (255,6,59))
   LineXY (0,16, 0,0, RGB (255,6,59))
   LineXY (12,6, 16,10, RGB (255,6,59))
   LineXY (16,10, 10,16, RGB (255,6,59))
   LineXY (5,11, 10,16, RGB (255,6,59))
 StopDrawing ()
CreateSprite3D ( #flechf3D , #flechf)

MouseLocate(512-6,600)
Global zutA,zutB,zutC

; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************
 Event= WindowEvent ()

 ExamineMouse():ExamineKeyboard ()

If page=0:Fintro():EndIf

If page=1
    If MouseX ()>992-(gtaille/2):MouseLocate(992-(gtaille/2),testY):EndIf
    testX=MouseX ()
    If MouseY ()>704-(gtaille/2):MouseLocate(testX,704-(gtaille/2)):EndIf
 StartDrawing ( ScreenOutput ())
   AdresseMemoire = DrawingBuffer ()
     Box (512-132,384-72, 264, 264, RGB (241,202,202))
     Box (512-66,384-36, 132, 32, RGB (200,115,115))
     Box (512-66,384-22, 132, 3, RGB (164,21,21))

     Circle(512-94,536, 24, RGB (214,152,152))
     Circle(512-94,536, 23, RGB (200,115,115))
     Circle(512-94,536, 22, RGB (214,152,152))
     Circle(512-94,536, 21, RGB (241,202,202))

     Circle(512+94,536, 24, RGB (214,152,152))
     Circle(512+94,536, 23, RGB (200,115,115))
     Circle(512+94,536, 22, RGB (214,152,152))
     Circle(512+94,536, 21, RGB (241,202,202))
; logo pb:
LineXY (500, 495-50, 524, 500-50, RGB (200,115,115)) 
LineXY (524, 500-50, 512, 512-50, RGB (200,115,115))
LineXY (512, 512-50, 524, 514-50, RGB (200,115,115))
LineXY (524, 514-50, 512, 526-50, RGB (200,115,115))
LineXY (512, 526-50, 500, 524-50, RGB (200,115,115))
LineXY (500, 524-50, 488, 536-50, RGB (200,115,115))
LineXY (488, 536-50, 524, 542-50, RGB (200,115,115))
LineXY (524, 542-50, 512, 554-50, RGB (200,115,115)) 
; souris gauche:
LineXY (175, 400, 275, 400, RGB (200,115,115))
LineXY (275, 400, 275, 550, RGB (200,115,115))
LineXY (275, 550, 175, 550, RGB (200,115,115))
LineXY (175, 550, 175, 400, RGB (200,115,115))
     Box (180,405, 40, 50, RGB (164,21,21))
; souris droite:
LineXY (175+574, 400, 275+574, 400, RGB (200,115,115))
LineXY (275+574, 400, 275+574, 550, RGB (200,115,115))
LineXY (275+574, 550, 175+574, 550, RGB (200,115,115))
LineXY (175+574, 550, 175+574, 400, RGB (200,115,115))
     Box (180+574+51,405, 40, 50, RGB (164,21,21))
 ;StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 
If KeyboardPushed ( #PB_Key_Right ):placemX+1:EndIf
If KeyboardPushed ( #PB_Key_Left ):placemX-1:EndIf
If KeyboardPushed ( #PB_Key_Down ):placemY+1:EndIf
If KeyboardPushed ( #PB_Key_Up ):placemY-1:EndIf

      FrontColor ( RGB (164,21,21)):DrawText (464,552, "FredStation360")
      FrontColor ( RGB (200,115,115))
      DrawText (154,360, "souris, bouton gauche."):DrawText (734,360, "souris, bouton droit.")     
      FrontColor ( RGB (241,202,202))

      DrawText (189,466, "transparent"):DrawText (780,466, "regime")

    placemX$= Str (placemX)
;    DrawText (1,500, "X: " +placemX$)
    placemY$= Str (placemY)
;    DrawText (1,520, "Y: " +placemY$)
      DrawText (150,624, "Si le barre d'énergie est pleine, vous pouvez appuyer sur la barre espace pour gagner une vie( 9 vies maximum).")
 StopDrawing ()

 Start3D ()
    DisplaySprite3D ( #pb3D , MouseX (), MouseY ()+40,255)
      ; Si joueur branche la cartouche, alors le jeu démarre:
      If MouseX ()>430 And MouseX ()<465
        If MouseY ()>180 And MouseY ()<210:page=2:score=0:EndIf
      EndIf
 Stop3D ()
EndIf

If page=2 ; ==============================================================================================

 If niveau<21:Tniveau+1:EndIf
 If Tniveau>600:Tniveau=0:niveau+1:EndIf ; chaque niveau dure 10 secondes.


; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
; fabrication du fond ( sous forme de bloc):
 If nbrefond<1:nbrefond+1:Fclonebfond():EndIf
 
;- Affichage clone fondbloc si existe:
 ForEach bfond()
; fond en mouvement interactif n°1:
;  If repereX>bfond()\x-32 And repereX<bfond()\x+32 And ghostv=210 And gtaille>50
;    If bfond()\x2<(gtaille+gtaille)/10:bfond()\x2+4:EndIf
;  Else
;    If bfond()\x2>0:bfond()\x2-1:EndIf
;  EndIf
;  DisplayTransparentSprite( #fondA , bfond()\x+bfond()\x2, bfond()\Y)

; fond en mouvement interactif n°2:
    affichagefond=0
  If repereX>bfond()\x-128-gtaille And repereX<bfond()\x+128+gtaille And ghostv=210 And gtaille>50
    If repereY>bfond()\Y-128-gtaille And repereY<bfond()\Y+128+gtaille
      affichagefond=2
    EndIf
  EndIf
  If repereX>bfond()\x-64-gtaille And repereX<bfond()\x+64+gtaille And ghostv=210 And gtaille>50
    If repereY>bfond()\Y-64-gtaille And repereY<bfond()\Y+64+gtaille
      affichagefond=1
    EndIf
  EndIf

  If affichagefond=0:DisplayTransparentSprite( #fondA , bfond()\x+bfond()\x2, bfond()\Y):EndIf
  If affichagefond=1:DisplayTransparentSprite( #fondB , bfond()\x+bfond()\x2, bfond()\Y):EndIf
  If affichagefond=2:DisplayTransparentSprite( #fondC , bfond()\x+bfond()\x2, bfond()\Y):EndIf  
 Next
   
   
    Start3D ()
    
;bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
; fabrique de bonbon:
 If ghostaie<2:tempoA+1:EndIf
 If tempoA>150:tempoA=0:Fcloneb():EndIf ; >150

;- Affichage clone bonbon si existe.
 ForEach bonbon()

   If bonbon()\attract=0; Si ghost n'est pas à proximité d'un bonbon, alors ce dernier continu son chemin.
    bonbon()\x=bonbon()\x+bonbon()\sensx
    bonbon()\Y=bonbon()\Y+bonbon()\sensy
   EndIf
           
           
            ;ZoomSprite3D(#eonbon3D, 32+bonzoom, 32-bonzoom) ; 32, 32) 
   DisplaySprite3D ( bonbon()\id , bonbon()\x, bonbon()\Y, 255)
   DisplaySprite3D ( #eonbon3D , bonbon()\x-4, bonbon()\Y-4, 105)
   zattract=(30+10)
   If gtaille>80:zattract=(60+20):EndIf
   If gtaille>120:zattract=(90+30):EndIf
   If gtaille>160:zattract=(120+40):EndIf   
       
   bonbon()\attract=0; remise à 0 variable attraction
 
   If bonbon()\x+8>repereX-zattract And bonbon()\x+8<repereX+zattract And ghostaie<2   
    If bonbon()\Y+8>repereY-zattract And bonbon()\Y+8<repereY+zattract
     bonbon()\attract=1
     If bonbon()\x+8>repereX
      bonbon()\x-4
     Else
      bonbon()\x+4   
     EndIf
     If bonbon()\Y+8>repereY
      bonbon()\Y-4
     Else
      bonbon()\Y+4   
     EndIf
     
     If bonbon()\x+8>repereX-10-(zattract/10) And bonbon()\x+8<repereX+10+(zattract/10)   
      If bonbon()\Y+8>repereY-10-(zattract/10)  And bonbon()\Y+8<repereY+10+(zattract/10)
       mange=1:pointd=1:pointm=0:pointt=255:pointg=gtaille:pointn=niveau:pointX=bonbon()\x+8:pointY=bonbon()\Y+8
      EndIf
     EndIf
    EndIf
   EndIf
     
  ; Si un clone sort de l'écran, alors il faut le supprimer, mais...
  If  bonbon()\x>1024+128 Or bonbon()\x<0-128 Or bonbon()\Y>768+128 Or bonbon()\Y<0-128
   supprbonbon=1 ; ...soyons prudent...
  EndIf
   ; si ghost mange bonbon, alors...
   If mange=1 And ghostaie<2:supprbonbon=1:EndIf ; ...très prudent...
   
   If supprbonbon=1
     supprbonbon=0
     DeleteElement(bonbon()):LastElement(bonbon()); <- ...car ces 2 là, faut pas en mettre partout.
      If mange=1
     
        If energie<20:energie+1:EndIf   
        If gtaille<200:gtaille+10:EndIf 
     
        If gtaille<200:score+(10*niveau):EndIf
        If gtaille=200:score+(100*niveau):EndIf
     
        mange=0
      EndIf
   EndIf   

 
   
 Next
;bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
; plein de variables, afin  d'afficher les points engrangé par le joueur( proportionnel au niveau atteind):
    If pointd=1; d comme départ d'un affichage de point

        For t=1 To pointn ; n comme niveau, le nbre de point est proportionel au nombre de niveau atteind.
         If pointg<200
          ZoomSprite3D(#pointA3D, 50,50)
          DisplaySprite3D ( #pointA3D , pointX, pointY-(t*20),pointt)
         EndIf
         If pointg=200 ; g comme géant ( =gtaille au moment précis où le ghost mange le bonbon).
          ZoomSprite3D(#pointB3D, 75,75)
          DisplaySprite3D ( #pointB3D , pointX, pointY-(t*30),pointt)
         EndIf
        Next 
         
         
      If pointm<100 ; m comme mouvoir: s'élève dans le ciel tout en disparaissant, triste hein ?
        pointm+1:pointY-2:pointt-2
        If pointm=100:pointm=0:pointd=0:EndIf
      EndIf
    EndIf
;eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee   
; fabrique d'elice:

 If ghostaie<2:tempoB+1:EndIf
 If (niveau<6 And tempoB>125) Or (niveau>5 And tempoB>100) Or (niveau>9 And tempoB>75)
   tempoB=0:Fclonee()
 EndIf   
 If (niveau>13 And tempoB>50) Or (niveau>17 And tempoB>40)
   tempoB=0:Fclonee()
 EndIf

 tourne-niveau
 If tourne<-360:tourne=0:EndIf
 tourne2-niveau
 If tourne2<-360:tourne2=0:EndIf
 
 tournf+niveau
 If tournf>360:tournf=0:EndIf
 tournf2+niveau
 If tournf2>360:tournf2=0:EndIf
 
;- Affichage clone elice si existe.
 ForEach elice()
 zutB+1
   elice()\x=elice()\x+elice()\sensx ; fait avancer les elices
   elice()\Y=elice()\Y+elice()\sensy
     
   ; +24= position par rapport à l'elice ; +40 diamètre de la rotation de pic.

  If elice()\sr=0
   RotateSprite3D(#pic3D, -tourne, 0)
   DisplaySprite3D ( #pic3D , elice()\x+24+40*Sin(tourne*0.0174532925), elice()\Y+24+40*Cos(tourne*0.0174532925),255)
   RotateSprite3D(#pic3D, -tourne2, 0)
   DisplaySprite3D ( #pic3D , elice()\x+24+40*Sin(tourne2*0.0174532925), elice()\Y+24+40*Cos(tourne2*0.0174532925),255)
  EndIf
  If elice()\sr=1
   RotateSprite3D(#pic3D, -tournf, 0)
   DisplaySprite3D ( #pic3D , elice()\x+24+40*Sin(tournf*0.0174532925), elice()\Y+24+40*Cos(tournf*0.0174532925),255)
   RotateSprite3D(#pic3D, -tournf2, 0)
   DisplaySprite3D ( #pic3D , elice()\x+24+40*Sin(tournf2*0.0174532925), elice()\Y+24+40*Cos(tournf2*0.0174532925),255)
  EndIf
     
   DisplaySprite3D ( elice()\id , elice()\x, elice()\Y, 255)
   
   ; test collision ( à l'ancienne) avec ghost, accrochez-vous bien:
   ;DisplaySprite3D ( #repere3D , elice()\x+64, elice()\y, 255) ; uniquement utilisé par le codeur.

If Tinvuln>0:Tinvuln-1:EndIf; invulnérabilité durant quelques secondes, suite à la perte d'une vie. 

If ghostaie<2 And Tinvuln=0 
  If gtaille>40 
   If (repereX+20>elice()\x And repereX+20<(elice()\x)+64) Or (repereX-20>elice()\x And repereX-20<(elice()\x)+64)
    If (repereY+20>elice()\Y And repereY+20<(elice()\Y)+64) Or (repereY-20>elice()\Y And repereY-20<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
  EndIf 
  ; heu, oui, là, je vous l'accorde, c'est aussi fastidieu à lire, qu'à mettre au point...et ça continu:   
  If gtaille>80 
   If (repereX+40>elice()\x And repereX+40<(elice()\x)+64) Or (repereX-40>elice()\x And repereX-40<(elice()\x)+64)
    If (repereY+40>elice()\Y And repereY+40<(elice()\Y)+64) Or (repereY-40>elice()\Y And repereY-40<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf

   If repereX>elice()\x And repereX<(elice()\x)+64
    If (repereY+40>elice()\Y And repereY+40<(elice()\Y)+64) Or (repereY-40>elice()\Y And repereY-40<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
   
   If (repereX+40>elice()\x And repereX+40<(elice()\x)+64) Or (repereX-40>elice()\x And repereX-40<(elice()\x)+64)
    If repereY>elice()\Y And repereY<(elice()\Y)+64
     ghostaie=1   
    EndIf
   EndIf   
  EndIf     
         
  If gtaille>120 
   If (repereX+60>elice()\x And repereX+60<(elice()\x)+64) Or (repereX-60>elice()\x And repereX-60<(elice()\x)+64)
    If (repereY+60>elice()\Y And repereY+60<(elice()\Y)+64) Or (repereY-60>elice()\Y And repereY-60<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
   
   If repereX>elice()\x And repereX<(elice()\x)+64
    If (repereY+60>elice()\Y And repereY+60<(elice()\Y)+64) Or (repereY-60>elice()\Y And repereY-60<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
   
   If (repereX+60>elice()\x And repereX+60<(elice()\x)+64) Or (repereX-60>elice()\x And repereX-60<(elice()\x)+64)
    If repereY>elice()\Y And repereY<(elice()\Y)+64
     ghostaie=1   
    EndIf
   EndIf
  EndIf

  If gtaille>160 
   If (repereX+80>elice()\x And repereX+80<(elice()\x)+64) Or (repereX-80>elice()\x And repereX-80<(elice()\x)+64)
    If (repereY+80>elice()\Y And repereY+80<(elice()\Y)+64) Or (repereY-80>elice()\Y And repereY-80<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
 
   If (repereX+80>elice()\x And repereX+80<(elice()\x)+64) Or (repereX-80>elice()\x And repereX-80<(elice()\x)+64)
    If (repereY+40>elice()\Y And repereY+40<(elice()\Y)+64) Or (repereY-40>elice()\Y And repereY-40<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
 
   If (repereX+40>elice()\x And repereX+40<(elice()\x)+64) Or (repereX-40>elice()\x And repereX-40<(elice()\x)+64)
    If (repereY+80>elice()\Y And repereY+80<(elice()\Y)+64) Or (repereY-80>elice()\Y And repereY-80<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
   
   If repereX>elice()\x And repereX<(elice()\x)+64
    If (repereY+80>elice()\Y And repereY+80<(elice()\Y)+64) Or (repereY-80>elice()\Y And repereY-80<(elice()\Y)+64)
     ghostaie=1   
    EndIf
   EndIf
   
   If (repereX+80>elice()\x And repereX+80<(elice()\x)+64) Or (repereX-80>elice()\x And repereX-80<(elice()\x)+64)
    If repereY>elice()\Y And repereY<(elice()\Y)+64
     ghostaie=1   
    EndIf
   EndIf
  EndIf ; If gtaille>160
EndIf   

  ; Si un clone sort de l'écran, alors il faut le supprimer:
;If (elice()\sensy>0 And elice()\Y>768+64) Or (elice()\sensy<0 And elice()\Y<-64) Or
;(elice()\sensx<0 And elice()\x<-64) Or (elice()\sensx>0 And elice()\x>1024+64)
;DeleteElement(elice()):NextElement(elice())
;EndIf
; ça rentre pas dans le forum, bon ben faut que je m'adapte alors :
 elice()\attract=0
 If (elice()\sensy>0 And elice()\Y>768+64) Or (elice()\sensy<0 And elice()\Y<-64):elice()\attract=1:EndIf
 If (elice()\sensx<0 And elice()\x<-64) Or (elice()\sensx>0 And elice()\x>1024+64):elice()\attract=1:EndIf
 If elice()\attract=1:DeleteElement(elice()):EndIf ; NextElement(elice()):EndIf
 
 
 Next

 If ghostv<200 And ghostaie<2:ghostaie=0:EndIf ; Si ghost transparent, alors il faut annuler l'ordre de gameover.

;eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

Publié : mar. 12/févr./2008 18:53
par beauregard
2eme partie:

Code : Tout sélectionner

;- GHOST    
   
If ghostaie=0:Fghost():EndIf ; ghost que l'on déplace fébrilement à la souris.
 If ghostaie>0 ; perd une vie ou game over.
  If ghostaie=1:Tbeep=56:EndIf; signal sonore "perdu une vie".
  ghostaie=2
  gtaille+2
  If ghostv>85:ghostv-2:EndIf
  ZoomSprite3D(#ghost3D, gtaille,gtaille)     
  DisplaySprite3D ( #ghost3D , testX, testY,ghostv)

  ZoomSprite3D(#oeil3D, gtaille,gtaille)
  DisplaySprite3D ( #oeil3D , testX, testY,ghostv)
  ; Animation du drap du fantome
  animdrap+1
  If animdrap=21:animdrap=1:EndIf
  If animdrap<11
    ZoomSprite3D(#drapA3D, gtaille,gtaille)   
    DisplaySprite3D ( #drapA3D , testX, testY,ghostv)   
  EndIf
  If animdrap>10
    ZoomSprite3D(#drapB3D, gtaille,gtaille)
    DisplaySprite3D ( #drapB3D , testX, testY,ghostv)   
  EndIf

  If Tbeep>55:TTbeep+1:EndIf; signal sonore "perdu une vie".
  If TTBeep>5
    If Tbeep=56:SoundFrequency(1, 20000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf
    If Tbeep=58:SoundFrequency(1, 19000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf
    If Tbeep=60:SoundFrequency(1, 18000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf
    If Tbeep=62:SoundFrequency(1, 17000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf  
    TTBeep=0:Tbeep+1
    If Tbeep>62:Tbeep=0:EndIf
  EndIf    
    
  If gtaille>400
    nbrevie-1
    If nbrevie>0
      ghostaie=0:animdrap=0:ghostv=255:energie=0:Tenergie=0:gtaille=50:mange=0
      Tinvuln=300
    EndIf    
    If nbrevie=0:page=3:Freset():EndIf
  EndIf
 EndIf

; GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG   

 Ftestcodeur()

  Freset()     
   
     Stop3D ()
  
  ; support barre d'énergie.
  For a=0 To 19
    DisplayTransparentSprite(#sphoton, 16, 728-32-(a*32))
  Next 
  ;- barre d'énergie:
  If energie=20:energirmax+1:EndIf
  If energirmax>10:energirmax=1:EndIf
  For t=1 To energie 
    If energirmax<6:DisplayTransparentSprite ( #photon , 16, 728-(t*32)):EndIf; de 1 à 5:endif
    If energirmax>5:DisplayTransparentSprite ( #photonm , 16, 728-(t*32)):EndIf; de 6 à 10
  Next
  
EndIf ; il s'agit du Endif de "If page=2" ==============================================================================


If page>0 And ghostaie=0:testX=MouseX ():testY=MouseY ():EndIf

zutA=energie;Tinvuln;gtaille;Tbeep; ; test du codeur...

 ; ligne de test afin de connaître la valeur des variables:   
 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))   
    ghostv$= Str (ghostv)   
    tempoB$= Str (tempoB)
    testX$= Str (testX)
    testY$= Str (testY)
    page$= Str (page)
   
    niveau$= Str (niveau)
    score$= Str (score)

    gtaille$= Str (gtaille)
    ghostaie$= Str (ghostaie)

    tourne$= Str (tourne)   
    pointd$= Str (pointd)   
    eli_sensrot$= Str (eli_sensrot)
    zutA$= Str (zutA)
    zutB$= Str (zutB)
    zutC$= Str (zutC)   
    ybonbon$= Str (ybonbon)
    nbrevie$= Str (nbrevie)    
   
;    DrawText (50,1+260, "zutA: " +zutA$);:zutA=0   
    
  If page=2
    DrawingFont ( FontID (1)) 
    
     FrontColor ( RGB (164,21,21)) :DrawText (900+1,24+1, "Vie: " +nbrevie$)
     FrontColor ( RGB (253,201,255)) :DrawText (900,24, "Vie: " +nbrevie$) 
    DrawingFont ( FontID (0)) 

    If niveau>9
     FrontColor ( RGB (164,21,21)) :DrawText (450+1,735+1, "NIVEAU: " +niveau$)
     FrontColor ( RGB (253,201,255)) :DrawText (450,735, "NIVEAU: " +niveau$)
    EndIf
    If niveau<10
     FrontColor ( RGB (164,21,21)) :DrawText (450+1,735+1, "NIVEAU:   " +niveau$)
     FrontColor ( RGB (253,201,255)) :DrawText (450,735, "NIVEAU:   "+niveau$)
    EndIf
    If niveau=21
     FrontColor ( RGB (164,21,21)) :DrawText (380+1,710+1, "C'est bien toi le meilleur !")
     FrontColor ( RGB (253,201,255)) :DrawText (380,710, "C'est bien toi le meilleur !")
    EndIf   
  EndIf   
  If page>0
      DrawingFont ( FontID (0))
     FrontColor ( RGB (154,154,154)) :DrawText (450+1,1+1, "SCORE:   " +score$)
     FrontColor ( RGB (224,224,224)) :DrawText (450,1, "SCORE:   "+score$)
  EndIf

 StopDrawing ()
 If KeyboardPushed ( #PB_Key_F ) And nbreis=0:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=1:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F ) And nbreis=2:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=3:nbreis=0:EndIf

         Gosub fps ; nombre d'image par seconde ( à placer dans tout vos jolis programmes, jeune étourdis !)
;-Flip
 FlipBuffers(1) 
  If page<2:ClearScreen(RGB(0, 0, 0)):EndIf
  If page=2:ClearScreen(RGB(0, 42, 255)) :EndIf
; ******************************************************************************************************   
 If Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ):Fin():EndIf; si clique coin haut droit ou touche Esc, alors ferme fenêtre.
ForEver

fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek 
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
If nbreis=1 Or nbreis=2:DrawText (1,1, "FPS: " +FPS$):EndIf
StopDrawing ()
Return

soundconception:
  !MOV  dword[add_dat],0 ; ici, c'est compliqué voyez( du son uniquement avec du code...
  ondee=1 ; ... c'est juste pour le fun quoi, çà fait bien plaisir... merci qui ? Merci Tonton! :D )
  For br=0 To 15000;- bruit de 15000 double echantillons
  ondea+0.1;25  ;creation onde sinus 1   
  ondeb+0.2;05;creation onde sinus 2
  ondec+0.1;77;creation onde sinus 3
  onded+0.4;09;creation onde sinus 4
  ondee-choixondee; 0.00029;son regressif
    brh0=((Sin(ondea)+Sin(ondeb)+Sin(ondec)+Sin(onded))*32000/4)*ondee  ;mixe le tout.
  brsong=brh0
   !PUSH eax
   !PUSH ebx
   !PUSH edi
   !MOV  ax,word[v_brsong]
   !LEA  edi,[donne]  ;on place les echantillon a l adresse "donne"
   !ADD  edi,[add_dat]
   !ADD  dword[add_dat],4
   !MOV  word[edi],ax
   !MOV  word[edi+2],ax
   !POP  edi
   !POP  ebx
   !POP  eax
   Next br
Return
; ***********************************************************************************************
; ********************************* ici commence les procedures *********************************
; ***********************************************************************************************
Procedure Fclonebfond()
; placement clone fond sous forme de simple bloc:
For x=0 To 15 
  For y=0 To 11 
    LastElement(bfond())
    AddElement(bfond())
    bfond()\id=#fondA         
    bfond()\x=x*64
    bfond()\Y=y*64
  Next
Next

EndProcedure
Procedure Fcloneb() ; bonbon 32*32

         LastElement(bonbon())
         AddElement(bonbon())
         bonbon()\id=#bonbon3D         

; placement et sens de deplacement du bonbon:
If MouseX ()<448:bonbon()\x=1024+32:bonbon()\sensx=-2:EndIf
If MouseX ()>447:bonbon()\x=0-32:bonbon()\sensx=2:EndIf

If MouseY ()<320:bonbon()\Y=768+32:bonbon()\sensy=-2:EndIf
If MouseY ()>319:bonbon()\Y=0-32:bonbon()\sensy=2:EndIf

EndProcedure
 
Procedure Fclonee() ; elice 64*64

         LastElement(elice())
         AddElement(elice())
         elice()\id=#elice3D         

; placement et sens de deplacement de l'elice:
If eli_sensrot=0
 eli_bord+1; décide de quel bord de l'écran surgira le prochain clone elice.
 If eli_bord=5:eli_bord=1:eli_choix+1:EndIf
EndIf
If eli_sensrot=1
 eli_bord-1; décide de quel bord de l'écran surgira le prochain clone elice.
 If eli_bord=0:eli_bord=4:eli_choix+1:EndIf
EndIf

If eli_choix=2
 eli_choix=0:eli_sensrot=Random(1):elice()\sr=eli_sensrot
EndIf

 
 If eli_bord=1 ; de haut en bas:
   If gtaille<90:elice()\x=MouseX ()-10:EndIf
   If gtaille>80 And gtaille<130:elice()\x=MouseX ()+10:EndIf
   If gtaille>120 And gtaille<170:elice()\x=MouseX ()+20:EndIf
   If gtaille>160:elice()\x=MouseX ()+30:EndIf
   
   elice()\Y=-64:elice()\sensy=1
   If niveau>1:elice()\sensy=2:EndIf
   If niveau>5:elice()\sensy=3:EndIf
   If niveau>9:elice()\sensy=4:EndIf
   If niveau>13:elice()\sensy=5:EndIf
   If niveau>17:elice()\sensy=6:EndIf
 EndIf

 If eli_bord=2 ; droite à gauche:
   If gtaille<90:elice()\Y=MouseY ()+30:EndIf
   If gtaille>80 And gtaille<130:elice()\Y=MouseY ()+40:EndIf
   If gtaille>120 And gtaille<170:elice()\Y=MouseY ()+50:EndIf
   If gtaille>160:elice()\Y=MouseY ()+60:EndIf 
 
   elice()\x=1024:elice()\sensx=-1
   If niveau>2:elice()\sensx=-2:EndIf 
   If niveau>6:elice()\sensx=-3:EndIf
   If niveau>10:elice()\sensx=-4:EndIf
   If niveau>14:elice()\sensx=-5:EndIf
   If niveau>18:elice()\sensx=-6:EndIf
 EndIf

 If eli_bord=3 ; bas en haut:
   If gtaille<90:elice()\x=MouseX ()-10:EndIf
   If gtaille>80 And gtaille<130:elice()\x=MouseX ()+10:EndIf
   If gtaille>120 And gtaille<170:elice()\x=MouseX ()+20:EndIf
   If gtaille>160:elice()\x=MouseX ()+30:EndIf
 
   elice()\Y=768:elice()\sensy=-1
   If niveau>3:elice()\sensy=-2:EndIf 
   If niveau>7:elice()\sensy=-3:EndIf
   If niveau>11:elice()\sensy=-4:EndIf
   If niveau>15:elice()\sensy=-5:EndIf
   If niveau>19:elice()\sensy=-6:EndIf
 EndIf

 If eli_bord=4 ; gauche à droite:
   If gtaille<90:elice()\Y=MouseY ()+30:EndIf
   If gtaille>80 And gtaille<130:elice()\Y=MouseY ()+40:EndIf
   If gtaille>120 And gtaille<170:elice()\Y=MouseY ()+50:EndIf
   If gtaille>160:elice()\Y=MouseY ()+60:EndIf
 
   elice()\x=-64:elice()\sensx=1
   If niveau>4:elice()\sensx=2:EndIf 
   If niveau>8:elice()\sensx=3:EndIf
   If niveau>12:elice()\sensx=4:EndIf
   If niveau>16:elice()\sensx=5:EndIf
   If niveau>20:elice()\sensx=6:EndIf
 EndIf

EndProcedure

Procedure Fghost()
  ; MouseButton(3) ; #PB_MouseButton_Middle <- y a un problème avec le bouton du milieu...bon ben tant pis.
  If nbrevie<9 And energie=20 And KeyboardPushed ( #PB_Key_Space ):nbrevie+1:energie=0:Tbeep=36:EndIf

If Tbeep>35:TTbeep+1:EndIf
If TTBeep>5
  If Tbeep=36:SoundFrequency(0, 18000):PlaySound(0,0):EndIf;:MelodieBeep("180,70"):Tbeep+1:EndIf
  If Tbeep=38:SoundFrequency(0, 20000):PlaySound(0,0):EndIf;:MelodieBeep("200,95"):Tbeep+1:EndIf
  If Tbeep=40:SoundFrequency(0, 24000):PlaySound(0,0):EndIf
  TTBeep=0:Tbeep+1
  If Tbeep>40:Tbeep=0:EndIf
EndIf

    If MouseX ()>992-(gtaille/2):MouseLocate(992-(gtaille/2),testY):EndIf
    testX=MouseX ()
    If MouseY ()>704-(gtaille/2):MouseLocate(testX,704-(gtaille/2)):EndIf

    ghostv=210
    If energie>0 And MouseButton(1) ; Si joueur appui sur bouton gauche, alors transparence du ghost = invulnérable.
      ghostv=100
      Tenergie+1
      If Tenergie>8
        Tenergie=0:energid+1
      EndIf 
    EndIf
   
    If energie>0 And MouseButton(2) ; Si joueur appui sur bouton droite, alors ghost maigri.
     
      Tenergie+1
      If Tenergie>8
        Tenergie=0
        If gtaille>50:energid+1:gtaille-10:EndIf
      EndIf 
    EndIf
   
    If energid>1:energid=0:energie-1:EndIf

    ; corps du ghost:
    If Tinvuln=0 Or (Tinvuln>50 And Tinvuln<100) Or (Tinvuln>150 And Tinvuln<200) Or (Tinvuln>250 And Tinvuln<300)
      ZoomSprite3D(#ghost3D, gtaille,gtaille)     
      DisplaySprite3D ( #ghost3D , MouseX (), MouseY ()+40,ghostv)
    EndIf
    ; yeux du ghost:
    ZoomSprite3D(#oeil3D, gtaille,gtaille)
    possx=MouseX ()
    If memsx<possx:possx+4:EndIf     
    If memsx>possx:possx-4:EndIf
    DisplaySprite3D ( #oeil3D , possx, MouseY ()+40,ghostv)
    memsx=MouseX ()
       
    ; Animation du drap du fantôme ( ghost en anglais):
    animdrap+1
    If animdrap=15
      animdrap=0
    EndIf
    If Tinvuln=0 Or (Tinvuln>50 And Tinvuln<100) Or (Tinvuln>150 And Tinvuln<200) Or (Tinvuln>250 And Tinvuln<300)
      If animdrap<8
        ZoomSprite3D(#drapA3D, gtaille,gtaille)   
        DisplaySprite3D ( #drapA3D , MouseX (), MouseY ()+40,ghostv)   
      EndIf
      If animdrap>7
        ZoomSprite3D(#drapB3D, gtaille,gtaille)
        DisplaySprite3D ( #drapB3D , MouseX (), MouseY ()+40,ghostv)   
      EndIf
    EndIf

EndProcedure

Procedure Freset() ; remise à 0
  If KeyboardPushed ( #PB_Key_R ) Or page=3 ; RESET (retour écran intro)
   MouseLocate(512-6,600)
   page=0:niveau=1:Tniveau=0:tempoA=0:tempoB=0:mange=0:Tbeep=0:nbrevie=3   
   ghostaie=0:animdrap=0:ghostv=255:energie=0:Tenergie=0:gtaille=50
   eli_bord=0:eli_choix=0:eli_sensrot=0:eli_bord=0
   ; supprime clone bonbon si existe.
   ForEach bonbon()
      FirstElement(bonbon())
      DeleteElement(bonbon())
   Next
   ; supprime clone elice si existe.
   ForEach elice()
      FirstElement(elice())
      DeleteElement(elice())
   Next   
     
  EndIf
EndProcedure

Procedure Ftestcodeur()

 ;ghost 128*128
If gtaille=50 Or gtaille=60 Or gtaille=70 Or gtaille=80
 repereX=((MouseX () )+6)+(gtaille/3)
 repereY=((MouseY ()+40 )+6)+(gtaille/3)

repereX=repereX-2:repereY=repereY-2
;    DisplaySprite3D ( #repere3D , repereX-20, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX+20, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY-20, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY+20, 255)
 
EndIf
If gtaille=90 Or gtaille=100 Or gtaille=110 Or gtaille=120
 repereX=((MouseX () )+10)+(gtaille/3)
 repereY=((MouseY ()+40 )+12)+(gtaille/3)

repereX=repereX-2:repereY=repereY-2
;    DisplaySprite3D ( #repere3D , repereX-40, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX+40, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY-40, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY+40, 255)
 
EndIf
If gtaille=130 Or gtaille=140 Or gtaille=150 Or gtaille=160
 repereX=((MouseX () )+16)+(gtaille/3)
 repereY=((MouseY ()+40 )+16)+(gtaille/3)

repereX=repereX-2:repereY=repereY-2
;    DisplaySprite3D ( #repere3D , repereX-60, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX+60, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY-60, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY+60, 255)
 
EndIf
If gtaille=170 Or gtaille=180 Or gtaille=190 Or gtaille=200
 repereX=((MouseX () )+22)+(gtaille/3)
 repereY=((MouseY ()+40 )+18)+(gtaille/3)

repereX=repereX-2:repereY=repereY-2
;    DisplaySprite3D ( #repere3D , repereX-80, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX+80, repereY, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY-80, 255)
;    DisplaySprite3D ( #repere3D , repereX, repereY+80, 255)
 
EndIf

;    DisplaySprite3D ( #repere3D , repereX, repereY, 255)
EndProcedure

Procedure Fintro()

TTbeep+1
If TTBeep>5

  If Tbeep=0:SoundFrequency(0, 9000):PlaySound(0,0):EndIf;MelodieBeep("90,160"):EndIf
  If Tbeep=1:SoundFrequency(0, 18000):PlaySound(0,0):EndIf;:MelodieBeep("180,110"):EndIf
  If Tbeep=2:SoundFrequency(0, 9000):PlaySound(0,0):EndIf;:MelodieBeep("90,160"):EndIf
  If Tbeep=3:SoundFrequency(0, 7000):PlaySound(0,0):EndIf;:MelodieBeep("70,160"):EndIf
  If Tbeep=4:SoundFrequency(0, 19000):PlaySound(0,0):EndIf;:MelodieBeep("190,250"):EndIf
  
  If Tbeep=8:SoundFrequency(0, 15000):PlaySound(0,0):EndIf;:MelodieBeep("150,300"):EndIf

  If Tbeep=12:SoundFrequency(0, 11000):PlaySound(0,0):EndIf;:MelodieBeep("110,160"):Tbeep+1:EndIf
  If Tbeep=13:SoundFrequency(0, 20000):PlaySound(0,0):EndIf;:MelodieBeep("200,110"):Tbeep+1:EndIf
  If Tbeep=14:SoundFrequency(0, 11000):PlaySound(0,0):EndIf;:MelodieBeep("110,160"):Tbeep+1:EndIf
  If Tbeep=15:SoundFrequency(0, 9000):PlaySound(0,0):EndIf;:MelodieBeep("90,160"):Tbeep+1:EndIf
  If Tbeep=16:SoundFrequency(0, 21000):PlaySound(0,0):EndIf;:MelodieBeep("210,250"):Tbeep+1:EndIf

  If Tbeep=20:SoundFrequency(0, 17000):PlaySound(0,0):EndIf;:MelodieBeep("170,300"):Tbeep+1:EndIf

  If Tbeep=24:SoundFrequency(0, 9000):PlaySound(0,0):EndIf;:MelodieBeep("90,160"):Tbeep+1:EndIf
  If Tbeep=25:SoundFrequency(0, 18000):PlaySound(0,0):EndIf;:MelodieBeep("180,110"):Tbeep+1:EndIf
  If Tbeep=26:SoundFrequency(0, 9000):PlaySound(0,0):EndIf;:MelodieBeep("90,160"):Tbeep+1:EndIf
  If Tbeep=27:SoundFrequency(0, 7000):PlaySound(0,0):EndIf;:MelodieBeep("70,160"):Tbeep+1:EndIf
  If Tbeep=28:SoundFrequency(0, 19000):PlaySound(0,0):EndIf;:MelodieBeep("190,250"):Tbeep+1:EndIf

  If Tbeep=32:SoundFrequency(0, 15000):PlaySound(0,0):EndIf;:MelodieBeep("150,300"):Tbeep+1:EndIf


  If Tbeep=36:SoundFrequency(0, 18000):PlaySound(0,0):EndIf;:MelodieBeep("180,70"):Tbeep+1:EndIf
  If Tbeep=37:SoundFrequency(0, 20000):PlaySound(0,0):EndIf;:MelodieBeep("200,95"):Tbeep+1:EndIf
  If Tbeep=38:SoundFrequency(0, 24000):PlaySound(0,0):EndIf;:MelodieBeep("240,220"):Tbeep+1:EndIf;

  If Tbeep=40:SoundFrequency(0, 20000):PlaySound(0,0):EndIf;:MelodieBeep("200,65"):Tbeep+1:EndIf
  If Tbeep=41:SoundFrequency(0, 22000):PlaySound(0,0):EndIf;:MelodieBeep("220,90"):Tbeep+1:EndIf
  If Tbeep=42:SoundFrequency(0, 26000):PlaySound(0,0):EndIf;:MelodieBeep("260,215"):Tbeep+1:EndIf

  If Tbeep=44:SoundFrequency(0, 22000):PlaySound(0,0):EndIf;:MelodieBeep("220,60"):Tbeep+1:EndIf
  If Tbeep=45:SoundFrequency(0, 24000):PlaySound(0,0):EndIf;:MelodieBeep("240,85"):Tbeep+1:EndIf
  If Tbeep=46:SoundFrequency(0, 28000):PlaySound(0,0):EndIf;:MelodieBeep("280,210"):Tbeep+1:EndIf

  If Tbeep=48:SoundFrequency(0, 24000):PlaySound(0,0):EndIf;:MelodieBeep("240,55"):Tbeep+1:EndIf
  If Tbeep=49:SoundFrequency(0, 26000):PlaySound(0,0):EndIf;:MelodieBeep("260,80"):Tbeep+1:EndIf
  If Tbeep=50:SoundFrequency(0, 30000):PlaySound(0,0):EndIf;:MelodieBeep("300,205"):Tbeep+1:EndIf

If Tbeep=56:SoundFrequency(1, 20000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf
If Tbeep=58:SoundFrequency(1, 19000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf
If Tbeep=60:SoundFrequency(1, 18000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf
If Tbeep=62:SoundFrequency(1, 17000):PlaySound(1,0):EndIf;:MelodieBeep("220,380"):Tbeep+1:EndIf


  If Tbeep=68:SoundFrequency(0, 10000):PlaySound(0,0):EndIf;:MelodieBeep("100,180"):Tbeep+1:EndIf
  If Tbeep=70:SoundFrequency(0, 22000):PlaySound(0,0):EndIf;:MelodieBeep("220,190"):Tbeep+1:EndIf
  If Tbeep=72:SoundFrequency(0, 10000):PlaySound(0,0):EndIf;:MelodieBeep("100,180"):Tbeep+1:EndIf
  If Tbeep=74:SoundFrequency(0, 18000):PlaySound(0,0):EndIf;:MelodieBeep("180,360"):Tbeep+1:EndIf

  TTbeep=0
  If Tbeep<83:Tbeep+1:EndIf
EndIf




 StartDrawing ( ScreenOutput ())
   AdresseMemoire = DrawingBuffer ()
 DrawingMode (1)
If KeyboardPushed ( #PB_Key_Right ):placemX+1:EndIf
If KeyboardPushed ( #PB_Key_Left ):placemX-1:EndIf
If KeyboardPushed ( #PB_Key_Down ):placemY+1:EndIf
If KeyboardPushed ( #PB_Key_Up ):placemY-1:EndIf
    DrawingFont ( FontID (0))
      FrontColor ( RGB (18,114,111))
      DrawText (350+1,650+1, "France - pseudo:  beauregard")
      FrontColor ( RGB (35,219,212))
      DrawText (350,650, "France - pseudo:  beauregard")
    placemX$= Str (placemX)
;    DrawText (1,500, "X: " +placemX$)
    placemY$= Str (placemY)
;    DrawText (1,520, "Y: " +placemY$)
 StopDrawing ()
 Start3D ()
     ;zutA=gposX
     ;zutB=etapeanim
     ;zutC=etanT 
 ; ********************** animé ( codé sans grande inteligence): **********************
     d1fleche=0
    If etapeanim<2 Or (etapeanim>5 And etapeanim<8) Or (etapeanim=8 And etanT<65)
     If ybonbon<530:ybonbon+4:EndIf
     DisplaySprite3D ( #bonbon3D , 496, ybonbon, 255)
     If MouseX ()>496-8 And MouseX ()<496+24
      If MouseY ()>ybonbon-8 And MouseY ()<ybonbon+24
      d1fleche=1
      EndIf
     EndIf
    EndIf
  If etapeanim=0;
    testX=1024+50:testY=520:gtaille=50:gposX=1024:gposY=520-44:ybonbon=-64
    etanT+1
    If etanT>150:etanT=0:etapeanim=1:EndIf
  EndIf
  If etapeanim=1 ; ghost se dirige vers le bonbon
    testX-4
    If testX<502
    pointd=1:pointm=0:pointt=255:pointg=gtaille
    pointn=1:pointX=496+8:pointY=530+8
    etapeanim=2
    EndIf
  EndIf
  If etapeanim=2 ; ghost se dirige vers la sortie...
    testX-4
    If testX<300:etapeanim=3:EndIf ;... et remarque la présence du joueur !
  EndIf 
  If etapeanim=3 ; il revient de quelque pas afin de bien voir...
    etanT+1; il regarde le joueur quelques instand,
    If etanT>30:testX+4:EndIf; puis reviens un peu sur ces pas...
    If testX>355:etanT=0:etapeanim=4:EndIf ;... et panique !
  EndIf   
  If etapeanim=4
    etanT+1; il regarde plus longuement
    If etanT>45
      If testX>-64:testX-8:EndIf
    EndIf ;... et c'est la panique !   
    If testX<-32 And etanT=150:etanT=0:etapeanim=5:EndIf
  EndIf   
  If etapeanim=5 ; le grand ghost arrive doucement
    etanT+1
    If etanT>30 And etanT<60:testX+4:EndIf
    If etanT>80 And etanT<100:testX-8:EndIf
    If gposX>1024-44 And etanT>99:gposX-1:EndIf
    If etanT>200:etanT=0:ybonbon=0:etapeanim=6:EndIf
  EndIf
  If etapeanim=6 ; regarde le bonbon tomber
    gposX-1
    If etanT<50:etanT+1:EndIf   
    If etanT=50 And ybonbon>529:etanT=0:etapeanim=7:EndIf
  EndIf
  If etapeanim=7 ;
    If etanT<50:etanT+1:EndIf   
    If etanT=50:etanT=0:etapeanim=8:EndIf
  EndIf
  If etapeanim=8 ;
   If gposX>612
    gposX-3:testX+4 ; les 2 fantomes se s'approchent du 2ème bonbon...
   EndIf
   If gposX<613 And etanT<25
    etanT+1:testX+1
   EndIf
   If gposX<613 And etanT>24 And etanT<34; le grand fait savoir qui est le chef
    etanT+1:gposX-6:testX+1
   EndIf
   If etanT>29 And testX>-64:testX-8:EndIf ; le petit ghost prend peur et fuit à toute vitesse.
   If etanT>33 ;le grand s'empare du bonbon
     If etanT<64:etanT+1:EndIf
     If etanT=64:gposX-3:EndIf
    If gposX<502-32 And pointd=0 And etanT<65
     pointd=1:pointm=0:pointt=255:pointg=200
     pointn=1:pointX=496+8:pointY=530+8
     ybonbon=-64:etanT=65
    EndIf     
   EndIf
   If etanT=65
     gposX-3
     If gposX<-128:etanT=66:EndIf
   EndIf
   If etanT>65:etanT+1:EndIf
   If etanT>80 ;-fin animé
    testX=1024+50:testY=520:gtaille=50:gposX=1024:gposY=520-44     
    etanT=0:etapeanim=0:ybonbon=-64:Tbeep=0
   EndIf
  EndIf

  ZoomSprite3D(#ghost3D, gtaille,gtaille) 
  DisplaySprite3D ( #ghost3D , testX, testY, 210)

    ; yeux du ghost:
    ZoomSprite3D(#oeil3D, gtaille,gtaille)
    possx=testX
    If memsx<possx:possx+4:EndIf     
    If memsx>possx:possx-4:EndIf
    DisplaySprite3D ( #oeil3D , possx, testY,ghostv)
    memsx=testX
       
 
    ; Animation du drap du fantome
    animdrap+1
    If animdrap=21:animdrap=1:EndIf
    If animdrap<11
      ZoomSprite3D(#drapA3D, gtaille,gtaille)   
      DisplaySprite3D ( #drapA3D , testX, testY, 210)
     
        ZoomSprite3D(#ghostB3D, 100,100):DisplaySprite3D ( #ghostB3D , gposX, gposY, 210)
        ZoomSprite3D(#drapA3D, 100,100):DisplaySprite3D ( #drapA3D , gposX, gposY, 210)   
    EndIf
    If animdrap>10
      ZoomSprite3D(#drapB3D, gtaille,gtaille)
      DisplaySprite3D ( #drapB3D , testX, testY, 210)
     
          ZoomSprite3D(#ghostB3D, 100,100):DisplaySprite3D ( #ghostB3D , gposX, gposY, 210)
          ZoomSprite3D(#drapB3D, 100,100):DisplaySprite3D ( #drapB3D , gposX, gposY, 210)
    EndIf     
     
      ; yeux du grand fantome:
      If etapeanim=5 Or etapeanim=7; regarde le joueur en face:
        ZoomSprite3D(#oeil3D, 100,100)
        DisplaySprite3D ( #oeil3D , gposX, gposY,ghostv)   
      EndIf
      If etapeanim=6 Or etapeanim=8; regarde à gauche:
        ZoomSprite3D(#oeil3D, 100,100)
        DisplaySprite3D ( #oeil3D , gposX-4, gposY,ghostv)   
      EndIf

    If pointd=1; d comme départ d'un affichage de point

        For t=1 To pointn ; n comme niveau, le nbre de point est proportionel au nombre de niveau atteind.
         If pointg<200
          ZoomSprite3D(#pointA3D, 50,50)
          DisplaySprite3D ( #pointA3D , pointX, pointY-(t*20),pointt)
         EndIf
         If pointg=200 ; g comme géant ( =gtaille au moment précis où le ghost mange le bonbon).
          ZoomSprite3D(#pointB3D, 75,75)
          DisplaySprite3D ( #pointB3D , pointX, pointY-(t*30),pointt)
         EndIf
        Next 

      If pointm<100 ; m comme mouvoir: s'élève dans le ciel tout en disparaissant, triste hein ?
        pointm+1
        pointY-2
        pointt-2
        If pointm=100:pointm=0:pointd=0:EndIf
      EndIf
    EndIf
        If d1fleche=0:DisplaySprite3D ( #fleche3D , MouseX (), MouseY (), 255):EndIf
        If d1fleche=1
          DisplaySprite3D ( #flechf3D , MouseX (), MouseY (), 255)
          If MouseButton(1)
            testX=1024+50:testY=520:gtaille=50:gposX=1024:gposY=520-44     
            etanT=0:etapeanim=0:ybonbon=-64:Tbeep=0
            tourne=0:tourne2=-180:page=1:MouseLocate(449,62)         
          EndIf
        EndIf
; titre
If page=0       
 tourne-2
 If tourne<-360:tourne=0:EndIf
 tourne2-1
 If tourne2<-360:tourne2=0:EndIf
           ZoomSprite3D(#logotitre3D, 175*2,350)
          DisplaySprite3D ( #logotitre3D , 350+24+40*Sin(tourne*0.0174532925), 210+24+40*Cos(tourne*0.0174532925), 155)
           ZoomSprite3D(#logotitre3D, 175*2,350)
          DisplaySprite3D ( #logotitre3D , 350+24+40*Sin(tourne2*0.0174532925), 210+24+40*Cos(tourne2*0.0174532925), 155) 
EndIf         
 Stop3D ()
EndProcedure

Procedure MelodieBeep(melodie.s)
  Repeat
    freq.l = Val(StringField(melodie,i+1,","))
    laeng.l = Val(StringField(melodie,i+2,","))
    i+2 
    If freq Or laeng : Beep_(freq,laeng) : EndIf
  Until freq = 0 And laeng = 0
EndProcedure 

Procedure.l Fin()

 If IsImage(#fondA):FreeImage(#fondA):EndIf
 If IsImage(#fondB):FreeImage(#fondB):EndIf
 If IsImage(#fondC):FreeImage(#fondC):EndIf 
 If IsImage(#logotitre):FreeImage(#logotitre):EndIf
 If IsImage(#logotitre3D):FreeImage(#logotitre3D):EndIf
 If IsImage(#pb):FreeImage(#pb):EndIf
 If IsImage(#pb3D):FreeImage(#pb3D):EndIf
 If IsImage(#ghost3D):FreeImage(#ghost3D):EndIf
 If IsImage(#ghost3D):FreeImage(#ghost3D):EndIf
 If IsImage(#oeil):FreeImage(#oeil):EndIf
 If IsImage(#oeil3D):FreeImage(#oeil3D):EndIf
 If IsImage(#drapA):FreeImage(#drapA):EndIf
 If IsImage(#drapA3D):FreeImage(#drapA3D):EndIf
 If IsImage(#drapB):FreeImage(#drapB):EndIf
 If IsImage(#drapB3D):FreeImage(#drapB3D):EndIf
 If IsImage(#sphoton):FreeImage(#sphoton):EndIf
 If IsImage(#photon):FreeImage(#photon):EndIf
 If IsImage(#photonm):FreeImage(#photonm):EndIf
 If IsImage(#bonbon):FreeImage(#bonbon):EndIf
 If IsImage(#bonbon3D):FreeImage(#bonbon3D):EndIf 
 If IsImage(#eonbon):FreeImage(#eonbon):EndIf
 If IsImage(#eonbon3D):FreeImage(#eonbon3D):EndIf 
 If IsImage(#pointA):FreeImage(#pointA):EndIf
 If IsImage(#pointA3D):FreeImage(#pointA3D):EndIf 
 If IsImage(#pointB):FreeImage(#pointB):EndIf
 If IsImage(#pointB3D):FreeImage(#pointB3D):EndIf
 If IsImage(#elice):FreeImage(#elice):EndIf
 If IsImage(#elice3D):FreeImage(#elice3D):EndIf 
 If IsImage(#pic):FreeImage(#pic):EndIf
 If IsImage(#pic3D):FreeImage(#pic3D):EndIf    
 If IsImage(#repere):FreeImage(#repere):EndIf
 If IsImage(#repere3D):FreeImage(#repere3D):EndIf
 If IsImage(#fleche):FreeImage(#fleche):EndIf
 If IsImage(#fleche3D):FreeImage(#fleche3D):EndIf
 If IsImage(#flechf):FreeImage(#flechf):EndIf
 If IsImage(#flechf3D):FreeImage(#flechf3D):EndIf
 If IsImage(#ghostB):FreeImage(#ghostB):EndIf
 If IsImage(#ghostB3D):FreeImage(#ghostB3D):EndIf  
 
 End
EndProcedure
; données concernant le son:
!section '.data' align 16

 !add_dat:
  !dd  0
  music: ;ici 'l entete du fichier wave juste avant les echantillons
 
  !db   052h,049h,046h,046h; (4 octets) : Constante "RIFF"         (0x52,0x49,0x46,0x46)
  !tail8:
  !dd   15000-8 ;  (4 octets) : Taille du fichier moins 8 octets
  !db   057h,041h,056h,045h  ;   (4 octets) : Format = "WAVE"      (0x57,0x41,0x56,0x45)
  !db   066h,06dh,074h,020h ;   (4 octets) : Identifiant "fmt "   (0x66,0x6D,0x74,0x20)
  !dd   16  ;   (4 octets) : Nombre d'octets utilisés pour définir en détail le contenu
  !dw   1  ;    (2 octets) : Format de fichier (1: PCM,  ...)
  !dw   2  ;  (2 octets) : Nombre de canaux (1 pour mono ou 2 pour stéréo)
  !dd   22050 ;  (4 octets) : Fréquence d'échantillonnage (en Hertz)
  !dd   88200 ; (4 octets) : Nombre d'octets par seconde de musique
  !dw   4 ; (2 octets) : Nombre d'octets par échantillon
  !dw   16; (2 octets) : Nombre de bits par donnée
  !db   064h,061h,074h,061h; (4 octets) : Constante "data"                  (0x64,0x61,0x74,0x61)
  !tail44:
  !dd   15000-44; (4 octets) : Taille du fichier moins 44 octets

  !donne:  ;ici les echantillons
  !rb  500000

Publié : mar. 12/févr./2008 19:07
par venom
:P Délire voyez :wink:
je vien de tester sa tourne parfaitement chez moi. j'adore ce concepte de grossir en se déplacent dans un environnement de plus en plus hostile :wink:.
bien jouer beauregard .



@++

Publié : mer. 13/févr./2008 1:25
par Huitbit
:P
ça sert d'avoir un code bien ordonné (1500 lignes, ça commence à faire!)
Well done beauregard, la rubrique "jeux" manque un peu de jeux, j'espère que ça va créer des vocations!

Hasta la vista!