Purecross

Programmation avancée de jeux en PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour la liberation de la souris, voici une piste a suivre !! :D
cela oblige a mettre un bouton Quitter, parceque pas question de pouvoir toucher la croix , mais fonctionne avec les gadgets !! :D

met ça dans ton code :D

Code : Tout sélectionner

If MouseX()>390 ;si on sort de l'écran, on libère la souris 
    ReleaseMouse(1)   
EndIf


; comment la ré-acquérir ?  --------------------- Comme ça :D
GetCursorPos_(CursorPos.POINT)
MouseX = CursorPos\x
MouseY = CursorPos\Y
MouseX= WindowMouseX(#Fenetre) 
If MouseX<402
    ReleaseMouse(0)
      ExamineMouse()
EndIf


 


 
 
 DisplaySprite(#curseur,MouseX(),MouseY() ); affichage du cursueur  
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Dobro c'est pas possible, ton ADN doit être en binaire ! 8O
Ca marche nickel ! Un grand merci !

On peut même utiliser WindowMouseX() pour rester un puriste de PB et éviter les API.
En fait j'étais pas loin, il me manquait juste un autre ExamineMouse() après l'appel de ReleaseMouse(0). Du coup j'avais un curseur bloqué entre l'écran et la fenêtre (faites le test si vs voulez)

Et j'ai aussi comment conserver l'accès aux menus et à la Croix de fermeture !!
Avec un tout bête :

Code : Tout sélectionner

If MouseX<402  And MouseX>0
En effet, si quand on accéder aux menus ou à la barre de titres de la fenêtre, le curseur sautait et revenait sur l'écan DirectX c'est tout simplement parceque WindowMouseX() renvoyait 0 !

On le dira jamais assez : PureBasic est ce qu'il est en grande partie aussi grace aux contributions des usagers du forum !
:wink:
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Purecross

Message par hackotedelaplaque »

Voilà j'ai progressé comme vous pourrez le voir (même lien cf + haut).
-->Passage en Sprite3D (bcp plus rapide en effet)
--> Problème de souris + ou - résolu.

Vous allez me trouver pinailleur mais je voudrais améliorer une chose encore.
Quand je repasse la souris sur l'écran, au lieu de m'afficher le sprite de mon crayon aux coordonnées du pointeur de la fenêtre, l'affichage se fait aux dernières coordonnées du crayon avant de quitter l'écran...
Assez gênant.

Ah et j'ai aussi une question sur la transparence des Sprite3D !
Pourquoi quand je redimensionne ma grille, les parties vertes et bleues sont + ou - opaques ? Ca me choque pas mais ça reste un mystère pour moi...
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Dobro a écrit :il se trouve qu'il y a quelques jours j'ai osé faire ça ! :lol:
belle interprétation bien reposante :D ( et pourtant je me souviens avoir détesté cette série comportant des voix insupportables, mes copains eux adorés par contre, et je n'ai jamais vraiment compris pourquoi d'ailleurs).
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dobro a écrit :petit HS pour DJES :D



vu ton avatar,
Image


il se trouve qu'il y a quelques jours j'ai osé faire ça ! :lol:
http://www.dailymotion.com/Dobro8/video ... hapo_music
:lol: :lol: bien a toi .. :)
Génial Dobro!!! Je me suis téléchargé les ziks, j'adore cette petite série pleine de poësie. Quand j'étais tout petit, ces paysages colorés et géométriques, la musique (excellente, F de R a toujours réussi à faire des choses originales), tout cela m'enchantait ; comme d'autres choses d'ailleurs : Wattoo-Wattoo, Snoopy, tous ces trucs avaient quelque chose "en plus".
Au fait, tu es de quelle région déjà? Le mari de ma soeur cherche un guitariste pour son groupe :) (du côté de Genève)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

djes a écrit :Wattoo-Wattoo, Snoopy, tous ces trucs avaient quelque chose "en plus".
Wattoo-Wattoo ha oui, une musique toute simple mais magnifique
avec un son de une guitare nylon!! , facile a faire, je vais peut etre m'amuser avec ça aussi :D
(j'lavais completement oublié ce truc !! mais pas la musique :) )

parcontre je viens de decouvrir la chanson de wattoo-wattoo
http://www.coucoucircus.org/da/generique.php?id=391

moi j'avais ça en tete :
http://www.coucoucircus.org/da/generique.php?id=392

Au fait, tu es de quelle région déjà? Le mari de ma soeur cherche un guitariste pour son groupe :) (du côté de Genève)
dommage , j'ai habité Annecy pendant 10 ans, maintenant je suis paumé en haute-loire (j'ai hate d'en partir !! :? )
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dobro a écrit :
djes a écrit :Wattoo-Wattoo, Snoopy, tous ces trucs avaient quelque chose "en plus".
Wattoo-Wattoo ha oui, une musique toute simple mais magnifique
avec un son de une guitare nylon!! , facile a faire, je vais peut etre m'amuser avec ça aussi :D
(j'lavais completement oublié ce truc !! mais pas la musique :) )

parcontre je viens de decouvrir la chanson de wattoo-wattoo
http://www.coucoucircus.org/da/generique.php?id=391

moi j'avais ça en tete :
http://www.coucoucircus.org/da/generique.php?id=392

Au fait, tu es de quelle région déjà? Le mari de ma soeur cherche un guitariste pour son groupe :) (du côté de Genève)
dommage , j'ai habité Annecy pendant 10 ans, maintenant je suis paumé en haute-loire (j'ai hate d'en partir !! :? )
Oui, le vol sidéral, moi aussi je pense d'abord à ça! Il faut surtout le voir en images, j'ai encore la chair de poule rien que d'y penser! Tiens, tant que j'y pense, un truc rigolo : http://www.croque-vacances.com

Effectivement, c'est dommage pour le groupe. Si tu retournes sur Annecy, fais signe ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

djes a écrit :Tiens, tant que j'y pense, un truc rigolo : http://www.croque-vacances.com

ouaip ça ne nous rajeuni pas tout ça :lol: :D
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Bonjour à tous,

J'ai presque honte de demander votre aide mais je tourne en rond depuis des jours sur un problème sans parvenir à le régler.
En plus je suis sur que c'est tout bête, c'est ça le pire !

Quand je clique sur une case je veux qu'elle se colorie. Or comme vous pouvez le voir, il colorie toutes les case de la 1ère de la liste jusqu'à celle voulue. Incompréhensible pour moi...

L'archive est ici.

http://hackotedelaplaque.free.fr/Purecross.zip

Merci de votre aide et désolé, je suis limite affligeant sur ce coup...
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Bonsoir hackotedelaplanque

Je sais pas si c'est la meilleure soluce mais...

dans cette partie

Code : Tout sélectionner

  If MouseButton(#PB_MouseButton_Left)=1
  
    ForEach Cross()
    
      If SpriteCollision(#Curseur3D,crayon\x,crayon\y,Cross()\Sprite,Cross()\x,Cross()\y) 
  
        Cross()\Sprite=#Cross3D
        Break
      
      EndIf
   Next 
   
  EndIf
remplace ceci

Code : Tout sélectionner

      If SpriteCollision(#Curseur3D,crayon\x,crayon\y,Cross()\Sprite,Cross()\x,Cross()\y) 
par ceci

Code : Tout sélectionner

      If crayon\x>=cross()\x And crayon\x<=cross()\x+12 And crayon\y>=cross()\y And crayon\y<=cross()\y+12
et ca marche!
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Pour une app dans ce genre, j'utiliserais plutot un tableau qu'une liste chainée car on connait le nombre de cases qui sont de tailles et d'espacement constants donc il est très simple de trouver la case sur laquelle est le crayon sans avoir à toute les tester.

J'utiliserais simplement WindowMouseX/Y() aussi plutot que MouseX/Y() ce qui faciliterai le passage screen <-> window

Je te fais un exemple en vitesse, mais c'est juste comment je verais la chose, libre à toi de programmer comme tu le veux 8)

EDIT : Voila comment je ferais

Code : Tout sélectionner

;----------------
;- Window Constants
;
Enumeration
  #Fenetre
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_OUVRIR
  #MENU_SAUVEGARDE
  #MENU_QUITTER
  #MENU_JEU
  #MENU_CONSTRUCTION
  #MENU_ABOUT
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_Largeur
  #Spin_Largeur
  #Text_Mode
  #Text_Longueur
  #Spin_Longueur
  #Frame3D_0
EndEnumeration

;- StatusBar Constants
;
Enumeration
  #StatusBar_0
EndEnumeration

;- Sprites Constants
;
Enumeration
  #Fond
  #Grille
  #Indication_Horiz
  #Indication_Vert
  #Crayon
  #Cross
EndEnumeration

;- Autres Constants
#Max_Cross = 10 ; nombre maxi de cases

;----------------
;- Structures
;----------------

Structure Cross
  x.f ; stocke position en x
  y.f ; stocke position en y
  Sprite.b ; stocke le sprite
EndStructure

;- Declarations globales
;
Global Dim Cross.Cross(#Max_Cross, #Max_Cross) ; tableau des cases
Global MaxCrossX.l, MaxCrossY.l ; nombre maxi de cases en x/y de la partie en cour (ne pas confondre avec le nombre maxi de case d'une partie en général)
Global CrayonX.l, CrayonY.l ; stock la position du crayon
Global CrayonCrossX.l, CrayonCrossY.l ; Stock la cases sur laquelle est le crayon
Global SwitchCursor.b ; va nous permetre d'afficher / cacher le curseur seulement s'il y a besoin et non à chaque boucle

Declare.b Generer_Cross()

;- Initialistions
;
InitSprite()
InitSprite3D()

SwitchCursor = #True
MaxCrossX = 5 : MaxCrossY = 5 ; nombre de cases de la premieres partie à 5x5

; On génère le premier tableau
Generer_Cross()


;- Creation fenetre / gadgets / ecran
;
OpenWindow(#Fenetre, 0, 0, 622, 522, "Exemple cases", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateMenu(#MenuBar_0, WindowID(#Fenetre))
    MenuTitle("Fichier")
      MenuItem(#MENU_OUVRIR, "Ouvrir un Purecross")
      MenuItem(#MENU_SAUVEGARDE, "Sauvegarder un Purecross")
      MenuBar()
      MenuItem(#MENU_QUITTER, "Quitter")
    MenuTitle("Mode")
      MenuItem(#MENU_JEU, "Mode Jeu")
      MenuItem(#MENU_CONSTRUCTION, "Mode Construction")
    MenuTitle("Aide")
      MenuItem(#MENU_ABOUT, "A propos de PureCross ")
  EndIf
  
  If CreateStatusBar(#StatusBar_0, WindowID(#Fenetre))
    AddStatusBarField(180)
    StatusBarText(#StatusBar_0, 0, "Purecross par Hackotedelaplaque")
  EndIf
  
  If CreateGadgetList(WindowID(#Fenetre))
    TextGadget(#Text_Largeur, 430, 100, 130, 20, "Largeur du PureCross : ")
    SpinGadget(#Spin_Largeur, 570, 100, 40, 20, 5, 20,#PB_Spin_ReadOnly | #PB_Spin_Numeric)
      SetGadgetState(#Spin_Largeur, MaxCrossX)
    
    TextGadget(#Text_Mode, 0, 20, 630, 30, "Mode construction", #PB_Text_Center)
      SetGadgetFont(#Text_Mode, FontID1)
      SetGadgetColor(#TEXT_MODE,#PB_Gadget_FrontColor,RGB(0, 0, 255))
    
    TextGadget(#Text_Longueur, 430, 160, 120, 20, "Longueur du PureCross :")
    SpinGadget(#Spin_Longueur, 570, 160, 40, 20, 5, 20,#PB_Spin_ReadOnly | #PB_Spin_Numeric)
      SetGadgetState(#Spin_Longueur, MaxCrossY)
    
    Frame3DGadget(#Frame3D_0, 420, 50, 200, 420, "Paramètres du PureCross")
  EndIf
  
  OpenWindowedScreen(WindowID(#Fenetre), 5, 70, 400, 400, 0, 0, 0)
  
  ;- Chargement / creation sprites
  ; On peut très bien utiliser le même identifiant pour un sprite normal et un sprite3D
  
  UsePNGImageDecoder()
  TransparentSpriteColor(#PB_Default, RGB(255, 0, 255))

  LoadSprite(#Fond, "back.png")
  
  LoadSprite(#Grille, "case_vierge.png", #PB_Sprite_Texture)
  LoadSprite(#Cross, "cross.png", #PB_Sprite_Texture)
  LoadSprite(#Crayon, "crayon.png", #PB_Sprite_Texture)
  
  CreateSprite(#Indication_Horiz, 92, 12,#PB_Sprite_Texture)
  
  StartDrawing(SpriteOutput(#Indication_Horiz))
    Box(0, 0, 92, 12,RGB(157, 255, 98))
    Line(0, 0, 92, 0,RGB(91, 199, 107))
  StopDrawing()
  
  CreateSprite(#Indication_Vert, 12, 92, #PB_Sprite_Texture)
  
  StartDrawing(SpriteOutput(#Indication_Vert))
    Box(0, 0, 12, 92,RGB(0, 0, 255))
    Line(0, 0, 0, 92,RGB(2, 2, 153))
  StopDrawing()
  
  
  ;- Sprites3D
  
  CreateSprite3D(#Grille, #Grille)
  CreateSprite3D(#Cross, #Cross)
  CreateSprite3D(#Indication_Horiz, #Indication_Horiz)
  CreateSprite3D(#Indication_Vert, #Indication_Vert)
  CreateSprite3D(#Crayon, #Crayon)
  
  Repeat
  
    ; On recupère la position du crayon sur l'ecran (sur la fenetre on s'en fou un peut...)
    CrayonX = WindowMouseX(0) - 5
    CrayonY = WindowMouseY(0) - 70
    
    ; On verifi que les positions restent dans l'écran
    If CrayonX < 0    : CrayonX = 0   : EndIf
    If CrayonX > 400  : CrayonX = 400 : EndIf
    If CrayonY < 0    : CrayonY = 0   : EndIf
    If CrayonY > 400  : CrayonY = 400 : EndIf
    
    ; On calcul sur quelle case est le crayon
    CrayonCrossX = Round((CrayonX  - 200) / 12 + MaxCrossX / 2, 1) - 1
    CrayonCrossY = Round((CrayonY  - 200) / 12 + MaxCrossY / 2, 1)  - 1
    
    ; on verifi qu'il sagit bien d'une case du tableau sinon on met à -1 ce qui permetre de ne pas change une case qui "n'existe" pas
    If CrayonCrossX < 0 : CrayonCrossX = -1 : EndIf
    If CrayonCrossX > MaxCrossX -1 : CrayonCrossX = -1 : EndIf
    If CrayonCrossY < 0 : CrayonCrossY = -1 : EndIf
    If CrayonCrossY > MaxCrossY -1 : CrayonCrossY = -1 : EndIf
    
    ; Si le curseur est dans l'écran, on le cache
    CursorInScreen = WindowMouseX(0) >= 5 And WindowMouseX(0) <= 405 And WindowMouseY(0) >= 70 And WindowMouseY(0) <= 470
    If CursorInScreen And SwitchCursor = #True
      ShowCursor_(#False)
      SwitchCursor = #False
    ElseIf Not CursorInScreen And SwitchCursor = #False
      ShowCursor_(#True)
      SwitchCursor = #True
    EndIf
    
    ;- Evenements sur la fenetre
    ;
    wEvent = WindowEvent()
    If wEvent ; S'il y a un evenement 
      
      Repeat ; Il peut y en avoir donc un boucle pour ne pas en perdre
      
        Select wEvent
        
          Case #WM_CLOSE ; La croix a été clikée
            Quit = #True
            
          Case #PB_Event_Gadget
            Select EventGadget()
            
              Case #Spin_Largeur
                ; on verifi que le nombre de cases n'est pas supérieur à #Max_Cross
                If GetGadgetState(#Spin_Largeur) > #Max_Cross : SetGadgetState(#Spin_Largeur, #Max_Cross) : EndIf
                MaxCrossX = GetGadgetState(#Spin_Largeur)
                
                ; on recreer le tableau
                Generer_Cross()
              
              Case #Spin_Longueur
                ; on verifi que le nombre de cases n'est pas supérieur à #Max_Cross
                If GetGadgetState(#Spin_Longueur) > #Max_Cross : SetGadgetState(#Spin_Longueur, #Max_Cross) : EndIf
                MaxCrossY = GetGadgetState(#Spin_Longueur)
                
                ; on recreer le tableau
                Generer_Cross()
            
            EndSelect
            
          Case #WM_LBUTTONUP ; Si le bouton droit est relacher sur une case, on la change si ce n'est pas -1, -1
            If CrayonCrossX > -1 And CrayonCrossY > -1
              Cross(CrayonCrossX, CrayonCrossY)\Sprite = #Cross
            EndIf

        EndSelect
        
        wEvent = WindowEvent() ; On regarde s'il y a un autre evenement
        
      Until wEvent = #Null ; Sinon on sort
    
    EndIf
    
    ;- Dessin sur l'écran
    ;
    
    ; Affichage du fond
    DisplaySprite(#Fond, 0, 0)
    
    Start3D() ; Surtout appeler Start3D() avant les boucle quand on est sur d'afficher que des sprite3d, ça evite les appels inutiles
      
      ; Affichage du tableau
      For y = 0 To MaxCrossY - 1
        For x = 0 To MaxCrossX - 1
          
          ; affichage des cases
          DisplaySprite3D(Cross(x, y)\Sprite, Cross(x, y)\x, Cross(x, y)\y, 125)
          
        Next
      Next
      
      ; Affichage du crayon s'il est dans l'écran
      If CursorInScreen
        DisplaySprite3D(#Crayon,CrayonX, CrayonY, 220)
      EndIf
    Stop3D()
    
    FlipBuffers()
  
  Until Quit = #True
  
;- Procedures
;
Procedure.b Generer_Cross()

  For y = 0 To MaxCrossY - 1
    For x = 0 To MaxCrossX - 1
    
      Cross(x, y)\Sprite = #Grille
      
      ; on calcul la postion en x/y de la case
      Cross(x, y)\x = 200 + ((x - MaxCrossX / 2) * 12)
      Cross(x, y)\y = 200 + ((y - MaxCrossY / 2) * 12)
    
    Next
  Next
  
EndProcedure
J'ai essayé de commenté les points "délicats" mais si tu as des questions, n'hesites pas :)
Et encor une foi, je ne dis pas qu'il faut faire comme ça absolument, je te montre juste comment je ferais 8)
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Un grand merci.
Vos deux solutions fonctionnent à merveille.

Cédéravic tu m'impressionnes car tu as même réglé en passant mon problème de positionnement du crayon quand on quitte puis revient sur l'écran via l'appel à l'API avec ShowCursor_
Chapeau pour la maîtrise des constantes comme #WM_LBUTTONUP, #WM_CLOSE.
Y'a même plus de InitMouse(), tout se fait en zappant la lib mouse, ni même de gestion de collisions.
C'est presque plus du Purebasic là ! :P

Pas de doutes aussi, pour les tableaux plutôt qu'une liste, je suis convaincu. J'y avais pensé mais je bloquais sur les limites de "Redim" (que tu n'utilises même pas d'ailleurs, je me suis cherché la complication pour rien !)

Il me reste encore à comprendre ces deux blocs

Code : Tout sélectionner

; On calcul sur quelle case est le crayon 
    CrayonCrossX = Round((CrayonX  - 200) / 12 + MaxCrossX / 2, 1) - 1 
    CrayonCrossY = Round((CrayonY  - 200) / 12 + MaxCrossY / 2, 1)  - 1
et

Code : Tout sélectionner

; on calcul la postion en x/y de la case 
      Cross(x, y)\x = 200 + ((x - MaxCrossX / 2) * 12) 
      Cross(x, y)\y = 200 + ((y - MaxCrossY / 2) * 12) 
Mais ça a l'air de ressembler à ce que je faisais avec mes variables MargeX et MargeY. En m'y penchant à tête reposée ça devrait aller.

En tout cas j'ai appris beaucoup de choses rien qu'en lisant ton code. Merci !
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

@cederavic

C'est clair, c'est largement plus rapide et du coup largement plus fluide! (le crayon) :wink:
Dernière modification par RV le jeu. 11/oct./2007 21:03, modifié 1 fois.
Marcus
Messages : 187
Inscription : jeu. 22/janv./2004 19:08
Contact :

Message par Marcus »

Dobro a écrit :petit HS pour DJES :D



vu ton avatar,
Image


il se trouve qu'il y a quelques jours j'ai osé faire ça ! :lol:
http://www.dailymotion.com/Dobro8/video ... hapo_music
:lol: :lol: bien a toi .. :)
exellent bravo dobro
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Marcus a écrit : exellent bravo dobro


Merci Marcus :)
Répondre