Publié : ven. 12/oct./2007 8:32
@hackotedelaplaque
En faisant un ShowCursor_() à chaque boucle, on envoi un message à chaque boucle alors qu'une seule foi suffit et evite de surcharger la liste des evenements
Dans les déclarations globales :
Dans le Select wEvent, remplacer le Case #WM_LButtonDown par :
Juste avant l'affichage des cases, ajouter :
Bon c'est tout aussi faisable avec MouseButton(1) = 0 ou 1, mais je trouve plus parlant LButtonDown et LButtonUp
Je vais essayer d'expliquer. L'idée : On à un écran de 400 x 400, pour centrer les cases il est plus simple de deplacer l'origine (0; 0) au millieu de l'écran (donc en 200; 200) et pour ça il suffit de soustraire 200 en X et en Y (ainsi si X = 200 alors CrossX = 0, si X = 384 alors CrossX = 184 ou encor si X = 25 alors CrossX = -175). Bref ça nous permet de nous reperer par rapport au centre.
Voila l'idée globalement. On aurait pu faire comme ça mais le hic c'est que le nombre de case est variable!
Dans le 2eme block, on veux placer les cases de 0 à MaxCrossX et MaxCrossY (c'est à dir le nombre max de cases qu'un utilisateur A choisi, et non #Max_Cross qui lui definit le nombre max de case qu'un utilisateur PEUT choisir). Pour les placer on pourait partir du centre (200; 200) et on ajouter X * la taille d'une case mais elle serait en la partie sud-est de l'ecran seulement (X * Taille d'une case sera toujours positif (à part si la taille est negative mais bon...
)). On prend donc le principe de l'idée plus haut et on l'applique à X soit X = X - Le nombre max de case / 2 . Ainsi X va aller de -MaxCrossX/2 à +MaxCrossX/2 et les cases seront bien centrées.
C'est pas facil à expliquer...
Dans le 1er block, c'est toujours le meme principe : On soustrait 200 à la position du curseur pour avoir l'origine en 0; 0, puis on divise par la taille d'une case car l'ecran peut etre remplis de n * taille d'une case. Et là, comme tout a l'heure, si on parcourt pas de -MaxCrossX / 2 à +MaxCrossX / 2 la premiere case ne va pas se trouver au nord-ouest mais au sud-est.
Le round(.., 1) - 1 c'est simplement que pour un tableau de 5 x 5 on aura MaxCrossX = 5 et MaxCrossY = 5 mais en realité on parcoura le tableau de 0 à 4 (l'element 0 etant pris en compte, de 0 à 4 il y a bien 5 éléments).
C'est à peut pret ça, sauf que tu partais d'en haut à gauche et ça marche tres bien aussi, mais apres pour trouver sur quelle case se trouve le curseur c'est un peut plus chiant. Et puis j'ai l'habitude de faire comme ça alors
Je sais pas si j'ai été clair dans mes explications (a vrai dir c'est pas vraiment mon truc lol) mais si tu comprends toujours pas, je te ferais un schémas
@Dobro :
Je viens d'écouter ton interpretation, c'est super! J'ai meme applaudis a la fin, mais je pense que t'a pas entendu car c'etait tout noir apres
Souvent je vois dans les codes un ShowCursor_(#True) sans test pour savoir si le curseur est deja afficher ou non, et c'est comme la drogue, c'est maaaaaaaaaltu 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_


Enfait c'est une habitude, plus court que #PB_Event_CloseWindow ou Select EventType() : Case : #PB_EventType_LeftClick : ... Et puis c'est plus pratique car tu peut remplir les cases facilement sans relacher le bouton de la sourie avec un variable d'etat. Par exemple :Chapeau pour la maîtrise des constantes comme #WM_LBUTTONUP, #WM_CLOSE.
Dans les déclarations globales :
Code : Tout sélectionner
Global FillCross.b ; va nous permetre de savoir si le bouton droit est enfoncer pour remplir les cases
Code : Tout sélectionner
Case #WM_LBUTTONDOWN ;Si le bouton droit est enfoncé, on met FillCross à #True
FillCross = #True
Case #WM_LBUTTONUP ; Si le bouton droit est relaché, on met FillCross à #False
FillCross = #False
Code : Tout sélectionner
; Remplissage des cases si FillCross = #True et que la case n'est pas -1, -1
;
If FillCross = #True And CrayonCrossX > -1 And CrayonCrossY > -1
Cross(CrayonCrossX, CrayonCrossY)\Sprite = #Cross
EndIf

Comme je disais, il n'y a pas vraiment besoin de la lib Mouse(), tout se passe en fenetré sans avoir besoin de capture la sourie pour emepecher l'utilisateur de sortir de la fenetre. La lib Mouse est surtout utile en plein écran où lorsqu'on veux simplement que le curseur reste sur l'écran.Y'a même plus de InitMouse(), tout se fait en zappant la lib mouse, ni même de gestion de collisions.
Au contraire! C'est du pure PureBasicC'est presque plus du Purebasic là !

Un redim aurait été mieu car là j'alloue un espace plus grand que necessaire. Un tableau de #Max_Cross * #Max_Cross maximum alors qu'un utilisateur peut juste faire des tableau de 5 * 5 s'il en a envie. Mais bon c'est pas enorme non plus voir meme négligeable pour 125 octets non utilisésPas 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 !)

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
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)
Voila l'idée globalement. On aurait pu faire comme ça mais le hic c'est que le nombre de case est variable!
Dans le 2eme block, on veux placer les cases de 0 à MaxCrossX et MaxCrossY (c'est à dir le nombre max de cases qu'un utilisateur A choisi, et non #Max_Cross qui lui definit le nombre max de case qu'un utilisateur PEUT choisir). Pour les placer on pourait partir du centre (200; 200) et on ajouter X * la taille d'une case mais elle serait en la partie sud-est de l'ecran seulement (X * Taille d'une case sera toujours positif (à part si la taille est negative mais bon...

C'est pas facil à expliquer...

Dans le 1er block, c'est toujours le meme principe : On soustrait 200 à la position du curseur pour avoir l'origine en 0; 0, puis on divise par la taille d'une case car l'ecran peut etre remplis de n * taille d'une case. Et là, comme tout a l'heure, si on parcourt pas de -MaxCrossX / 2 à +MaxCrossX / 2 la premiere case ne va pas se trouver au nord-ouest mais au sud-est.
Le round(.., 1) - 1 c'est simplement que pour un tableau de 5 x 5 on aura MaxCrossX = 5 et MaxCrossY = 5 mais en realité on parcoura le tableau de 0 à 4 (l'element 0 etant pris en compte, de 0 à 4 il y a bien 5 éléments).
Code : Tout sélectionner
Mais ça a l'air de ressembler à ce que je faisais avec mes variables MargeX et MargeY

Je sais pas si j'ai été clair dans mes explications (a vrai dir c'est pas vraiment mon truc lol) mais si tu comprends toujours pas, je te ferais un schémas

@Dobro :
Je viens d'écouter ton interpretation, c'est super! J'ai meme applaudis a la fin, mais je pense que t'a pas entendu car c'etait tout noir apres
