Bonjour,
Je vous propose un nouvel élément à utiliser : Jeu de taquin (Sidney 10.4.2)
Coder un jeu de Taquin avec Sidney en utilisant le nouveau composant TControlList
Qu'en pensez-vous ?
Bonjour,
Je vous propose un nouvel élément à utiliser : Jeu de taquin (Sidney 10.4.2)
Coder un jeu de Taquin avec Sidney en utilisant le nouveau composant TControlList
Qu'en pensez-vous ?
Merci Serge,
je comprends que l'objectif est de tester le nouveau composant TControlList, mais malheureusement il n'existe pas dans mon D10.3.3 CE !
(Ainsi que TVirtualImage et TNumberBox).
Penses tu que l'on peut faire quelque chose de similaire avec D10.3.3 ?
A+
Charly
Bonjour
Oui, mais pas de la même manière.
Il faudrait que j'y réfléchisse. De but en blanc, un scrollbox et des frames pour la partie dessin, (voir mon billet documentaire) pour la partie "dessin", pour la partie déplacement, ce serait le helper qui serait à modifier.
[EDIT]
Pour ce qui est de VirtualImage c'était une façon de stocker plusieurs images, mais elles pourraient très bien être en ressource.
Décidément j'ai écrit n'importe quoi
VirtualImage ce n'est pas ce composant qui stocke les images mais le TImageCollection.
Donc, il faut que je revoie mes idées. J'avais commencer un truc avec les ressources, qui s'avère inutile, d'autant plus que c'est galère à découper !
[/EDIT]
Quant au numberbox, je l'ai utilisé car, il est nettement mieux (plus réactif au LiveBinding) que SpinEdit.
Donc, AMHA, c'est jouable, seule la partie helper (pour connaitre les indexs) est un peu plus problématique, et en faisant en sorte de faire comme le TcontrolList le redessin de tout le contenu à chaque fois. Challenge intéressant
Faire un taquin avec le TControlList est-il une porte ouverte pour te faire taquiner jeudi ?
Bon d'accord, je vais tâcher de trouver ou copier une image de poisson pour rester dans le thème
Taquine (les sources sont déjà dans le dépôt Git)
Si le temps ne manque pas j'ai prévu de le présenter aussi (avec les dames et l'échiquier même technique) mais le questionnement de Charly m'intéresse aussi, histoire de faire une comparaison.
Bonjour,
Pour répondre @charly910
- le TControList est remplaçable par un TScrollBox
- au sujet du TVirtualImage, le remplacer par un TImage et pour le chargement utiliser le code
- Le TNumberEdit est a remplacer , tout simplement, par un TSpinEdit
Code : Sélectionner tout - Visualiser dans une fenêtre à part Image1.Picture.Bitmap:=ImagesPleines.GetBitmap(SpinEdit1.Value, 400, 400);
- Le Helper sera remplacé par un TFrame
Et voilà le résultat à tester sur des versions supportant TImageCollection. conc 10.3
Source dégrossi mais non optimum, à vérifier qu'il n'y manque rien et qu'une version Community le supporte , à toi (ou d'autres) de tester et me dire s'il manque des choses
Merci Serge
ça compile bien sous D10.3.3 CE et ça fonctionne.
Petit Pb avec 9 et 16 pièces : le damier ne s'affiche pas bien (il manque des morceaux ) et la souris ne fonctionne pas. Je vais essayer de regarder pourquoi
A+
Charly
Bravo Serge, ça marche impeccable
Par contre il faut que je m'entraine au taquin car je ne suis pas très fort !
A+
Charly
Je n'arrive qu'à résoudre StoneEdge en 4*4 et encore pas à chaque fois
Ce serait sympa de pouvoir faire jouer un robot avec le moins de coups possibles (hors de ma portée ça).
Compter les coups, ça c'est faisable mais utile ?
J'ai profité de quelques instants de fin de journée pour tester les fuites mémoires, la version 10.3.3 en fait, à cause de TImageCollection.GetImage (RSP-23950)
La version ci-dessous corrige ce problème en utilisant TImageCollection.GetSource
Pour les détenteurs de versions plus anciennes (TImageCollection inexistant) je vous propose même une version 10.2 testée, et à tester (D2009 et plus à cause de l'unité generic.collections)
Enregistrer une partie dans un fichier permettrait de la rejouer automatiquement, d'échanger des parties entre joueurs et de stocker les meilleurs scores.
après le robot intelligent, là ça me semble plus difficile !
A+
Charly
Pour ceux que cela intéresse, avec un peu d'huile de coude, j'ai réussi à downgrader jusqu'à la version D2009 (en théorie) D2010
test D2010
test XE4
je fournirai bientôt le zip taquin_10_2 modifié.
D7 me resiste car depuis l'apparition de l'unité generic.collections, j'ai perdu l'habitude d'utiliser autre chose mais je ne désespére pas d'y arriver
Bonjour,
après plusieurs mois de pause forcée, je vois le code du jeu de taquin et me dit que c'est une bonne occasion
de m'y remettre
La conversion pour D7 c'est faite sans soucis le hic est sur l'affichage avec une erreur abstraite qui se produisait qu'avec D7 !!
dans la procedure TMainForm.MoveMorceau(morceau: word);
à l'appel de DrawScrollBox // à la ligne 255
De longues séances de debug n'ont pas aidées à le débusquer !!!
J'ai "dégraissé" le code pour trouver le problème ... j'ai supprimé les TFrames pensant, à tord, que ça venait de là.
si vous souhaitez voir ou tenter votre chance, sous D7, il suffit de mettre la ligne 254 en commentaire
et d'activer la ligne 255.
Le problème se contourne facilement en déclenchant l'appel à DrawScrollBox
à l'extérieur de la procedure TMainForm.MoveMorceau(morceau: word);
avec un Timer à 40 ms qui ne gêne en rien le joueur.
J'ai également ajouté un mélange des pièces qui assure
la faisabilité du puzzle .
Les images png sont directement chargées dans un Bitmap grâce à une version modifié de l'unité Execute.GDIPBitmap.pas
de Paul Toth que je fournis dans le zip
Pour voir comment j'ai converti les types génériques en langage D7 et autres petites choses
il faudra regarder le code
Taquin_7_0.zip
PS: le code compile de D7 à D10.3
et il est même possible de le compiler avec D6
Cordialement,
@+
Super, ça m'évite de le faire.
J'avais bien pensé utiliser GDI mais ne le maitrisant pas, j'avais laisser de côté, l'objectif n'étant pas d'écrire un programme mais de "downgrader" le TControlList.
Je vais pouvoir me consacrer à la version FMX (bien avancée) avant que Patrick ne me coupe l'herbe sous le pied dimanche lors de son codage de jeux en direct.
Parti comme c'est, j'aurai de la chance si je tiens plus d'une demi-heure de direct mais on verra bien demain. Intervention d'un ITI Free lundi pour comprendre&résoudre mes pertes de synchro fibre. J'ai hâte.
C'est fou ce qu'on est dépendants d'Internet de nos jours et je me demande dans quelle mesure Windows (ou VM Ware) ne l'est pas aussi vues les lenteurs omniprésentes (voir blocages) à chaque déconnexion.
J'ai de la chance avec ma connexion par tamtam alors !
Deux pots de yaourts et un fil, il n'y a que ça de vrai, si tu mets une goutte d'eau sur la fibre ça fait loupé
Plus sérieusement, la version FMX sera bientôt dans mon dépôt Git malgré une fuite de mémoire du au chargement d'image qui me casse les pieds
Oui, j'ai reçu et non elle ne fonctionnait pas.
Je viens juste de résoudre le problème, plus de fuite mémoire dans ce bout de code test
Il faut juste que je mette ça dans le code (j'en ai profité pour intégrer le helper que j'utilisai avant pour ajouter un bitmap à une liste)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 procedure TForm18.Button1Click(Sender: TObject); const SCALE = 1; var pBitmap : TBitmap; sbitmap : TCustomBitmapItem; vSource: TCustomSourceItem; vBitmapItem: TCustomBitmapItem; vDest: TCustomDestinationItem; vLayer: TLayer; begin Images.ClearCache; Images.BeginUpdate; if Images.Destination.Count > 0 then Images.Destination.Clear; vSource := ImageList1.Source.Items[SCALE]; sbitmap := vSource.MultiResBitmap.ItemByScale(SCALE, True, True); pbitmap:=TBitmap.Create(100,100); try for var l := 0 to 3 do for var c := 0 to 3 do begin var r: TRect := TRect.Create(100*c,100* l, 100*c+100,100*l+100); pBitmap.CopyFromBitmap(sbitmap.Bitmap, r, 0, 0); // add source bitmap vSource := Images.Source.Add; vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; vSource.MultiResBitmap.SizeKind := TSizeKind.Source; vSource.MultiResBitmap.Width := Round(pBitmap.Width / SCALE); vSource.MultiResBitmap.Height := Round(pBitmap.Height / SCALE); vBitmapItem := vSource.MultiResBitmap.ItemByScale(SCALE, True, True); if vBitmapItem = nil then begin vBitmapItem := vSource.MultiResBitmap.Add; vBitmapItem.SCALE := SCALE; end; vBitmapItem.Bitmap.Assign(pBitmap); vDest := Images.Destination.Add; vLayer := vDest.Layers.Add; vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width, vSource.MultiResBitmap.Height); vLayer.Name := vSource.Name; end; finally pBitmap.Free; end; Images.EndUpdate; end;
Partager