<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs</title>
		<link>https://www.developpez.net/forums/blogs/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 19 Jun 2026 08:46:24 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs</title>
			<link>https://www.developpez.net/forums/blogs/</link>
		</image>
		<item>
			<title>Knowledge Graph : une architecture de description de la connaissance</title>
			<link>https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10780/knowledge-graph-architecture-description-connaissance/</link>
			<pubDate>Thu, 18 Jun 2026 04:31:25 GMT</pubDate>
			<description>https://www.urbanisation-si.co...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><a href="https://www.urbanisation-si.com/meilleures-pratiques-pour-les-deux-cycles-de-vie-d-un-knowledge-graph-1" target="_blank">https://www.urbanisation-si.com/meil...wledge-graph-1</a><br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=677018&amp;d=1781757262" border="0" alt="Nom : knowledge-graph-architecture-de-description-de-la-connaissance.png
Affichages : 45
Taille : 172,6 Ko"  style="float: CONFIG" /><br />
<br />
La spécificité des Knowledge Graphs, c’est d’être à la fois des réponses pour relier des ensembles de données dispersés avec une véritable approche d’interopérabilité sémantique et pouvoir raisonner sur ces données. D’une part, ils permettent de qualifier intelligemment (stricto sensu, de manière intelligible) la nature du rapprochement qu’on peut faire entre les données. D’autre part, ils sont source de raisonnements à base de déduction, totalement explicable sur la base de règles prédéfinies (explainable AI). Ils permettent des inférences logiques et non des analyses statistiques de corrélations possibles.</blockquote>

]]></content:encoded>
			<dc:creator>Rhona Maxwel</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10780/knowledge-graph-architecture-description-connaissance/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Juin)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10779/nouveau-pack-ressources-offertes-fab-juin/</link>
			<pubDate>Tue, 16 Jun 2026 17:16:55 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/0ffccb05-d04a-4ad3-90ed-b8354d6ca7ce" target="_blank">château blanc</a> ;</li><li style="">des <a href="https://www.fab.com/listings/8ecc05ee-7447-4a8a-af10-1adccc7e8bd2" target="_blank">personnages stylisés</a> ;</li><li style="">un environnement de <a href="https://www.fab.com/listings/c1d714a2-288f-4bfa-a820-ec0406d51c8a" target="_blank">docks</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10779/nouveau-pack-ressources-offertes-fab-juin/</guid>
		</item>
		<item>
			<title>Application Boussole pour Android</title>
			<link>https://www.developpez.net/forums/blogs/27025-gouyon/b10778/application-boussole-android/</link>
			<pubDate>Fri, 05 Jun 2026 12:14:09 GMT</pubDate>
			<description>Pour valider les résultats...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour valider les résultats d'une autre application, j'ai eu besoin d'une boussole. Dans un premier temps je me suis dis &quot;bon il doit y en avoir un paquet sur le playstore&quot; et puis je me suis dis finalement c'est une opportunité de développé quelque chose et de voir comment utiliser les capteurs d'un téléphone.<br />
<br />
Alors inutile de dire que le démarrage à été difficile. La documentation est très succincte voir pas à jour et parfois complètement à coté de la plaque. Mr Embarcadero vos produits sont très bon mais pitié faite un gros effort sur la documentation. Finalement j'ai été sauvé par le livre <b>Expert Delphi</b> de <b>Pawel Glowacki</b> qui trainait dans ma bibliothèque. Dans lequel il y a tout un chapitre consacré aux capteur et qui est très explicite.<br />
<br />
Donc sur ma fiche j'ai déposé les composants suivants:<br />
<ul><li style="">un TOrientationSensor pour accès au capteur d'orientation</li><li style="">un TMotionSensor pour avoir l'attitude du téléphone dans l'espace. Ce n'est pas nécessaire au premier ordre mais indispensable si on veut des résultats corrects quelque soit l'orientation du téléphone.</li><li style="">un TTimer pour cadencer le rafraichissement de la boussole</li><li style="">un TBoussole qui est un composant graphique que j'ai développé voir mon billet  <a href="https://www.developpez.net/forums/blogs/27025-gouyon/b9556/composants-daffichage-fmx-delphi/" target="_blank">Composants d'affichage FMX pour Delphi </a> et qui va afficher la direction.</li></ul><br />
<br />
Et voici ce que ça donne<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=676757&amp;d=1780659719" border="0" alt="Nom : boussole1.JPG
Affichages : 71
Taille : 60,1 Ko"  style="float: CONFIG" /><br />
<br />
Et voici le code<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br /></div></td><td valign="top"><pre style="margin: 0">unit BoussoleMainFrm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Sensors, FMX.Objects, Boussole,
  System.Sensors.Components, FMX.Layouts, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TBoussoleForm = class(TForm)
    laBoussole: TOrientationSensor;
    visuBoussole: TBoussole;
    TimerBsl: TTimer;
    Path1: TPath;
    Layout1: TLayout;
    Accelero: TMotionSensor;
    Layout2: TLayout;
    Label4: TLabel;
    Label5: TLabel;
    SwBrtMoy: TSwitch;
    procedure majDirection(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SwBrtMoySwitch(Sender: TObject);
  private
    { Déclarations privées }
    nb: integer;
    mzs, mxs, mys, axs, ays, azs: array [0 .. 4] of double;
  public
    { Déclarations publiques }
  end;

var
  BoussoleForm: TBoussoleForm;

implementation

uses math;
{$R *.fmx}

procedure TBoussoleForm.FormCreate(Sender: TObject);
begin
  nb := 0;
end;

procedure TBoussoleForm.majDirection(Sender: TObject);
var
  lmz, lmx, lmy, lax, lay, laz: double;
  lalpha: double;
  xh, yh, pitch, roll: double;
  I: integer;
begin
  // ATTENTION Si my est négatif quant on pointe vers le nord, il faut inverser mx et my
  lmx := laBoussole.Sensor.HeadingX;
  lmy := laBoussole.Sensor.HeadingY;
  lmz := laBoussole.Sensor.Headingz;
  // Calcul des angles de roulis et tangage
  lax := Accelero.Sensor.AccelerationX;
  lay := Accelero.Sensor.AccelerationY;
  // ATTENTION selon la convention de l'OS,
  // la sortie du capteur doit être inversée sinon le nord est au sud et vice versa
  laz := -Accelero.Sensor.AccelerationZ;

  if SwBrtMoy.IsChecked then
  begin
    if nb = 5 then
    begin
      for I := 0 to 3 do
      begin
        mxs[I] := mxs[I + 1];
        mys[I] := mys[I + 1];
        mzs[I] := mzs[I + 1];
        axs[I] := axs[I + 1];
        ays[I] := ays[I + 1];
        azs[I] := azs[I + 1];
      end;
    end
    else
      inc(nb);
    mxs[nb - 1] := lmx;
    mys[nb - 1] := lmy;
    mzs[nb - 1] := lmz;
    axs[nb - 1] := lax;
    ays[nb - 1] := lay;
    azs[nb - 1] := laz;

    lmx := 0;
    lmy := 0;
    lmz := 0;
    lax := 0;
    lay := 0;
    laz := 0;
    for I := 0 to nb - 1 do
    begin
      lmx := lmx + mxs[I];
      lmy := lmy + mys[I];
      lmz := lmz + mzs[I];
      lax := lax + axs[I];
      lay := lay + ays[I];
      laz := laz + azs[I];
    end;
    lmx := lmx / nb;
    lmy := lmy / nb;
    lmz := lmz / nb;
    lax := lax / nb;
    lay := lay / nb;
    laz := laz / nb;
  end;

  pitch := arctan2(-lax, sqrt(lay * lay + laz * laz));
  roll := arctan2(lay, laz);
  xh := lmx * cos(pitch) + lmz * sin(pitch);
  yh := lmx * sin(roll) * sin(pitch) + lmy * cos(roll) - lmz * sin(roll) * cos(pitch);
  lalpha := arctan2(-xh, yh);
  if lalpha &lt; 0 then
    lalpha := lalpha + 2 * pi;
  visuBoussole.Valeur := lalpha / pi * 180;
end;

procedure TBoussoleForm.SwBrtMoySwitch(Sender: TObject);
begin
  nb := 0;
end;

end.</pre></td></tr></table></pre>
</div><b><u>Quelque précisions</u></b><br />
<br />
Le code aurait pu être beaucoup plus simple si mon téléphone avait eu accès à ces propriétes (MagHeading, TrueHeading, CompMagHeading, CompTrueHeading) du capteur d'orientation.<br />
Malheureusement ce n'est pas le cas donc il a fallu écrire quelque chose de plus complexe.<br />
<br />
Après quelques recherche j'ai trouvé que <br />
<br />
<ul><li style="">HeadingX correspond à l'axe horizontal gauche/droite (pointe vers la droite de l'écran)</li><li style="">HeadingY correspond à l'axe horizontal bas/haut (pointe vers le haut de l'écran)</li><li style="">HeadingZ correspond à l'axe vertical (pointe vers l'extérieur de l'écran)</li></ul><br />
<br />
A partir de là en utilisant <i>HeadingX</i> et<i> HeadingY</i> on peut retrouver la direction grâce à la fonction <i>arctan2</i>. Ceci fonctionne bien si le téléphone est à plat sur une surface horizontale. Si ce n'est pas le cas il faut corriger les angles par rapport à l'orientation du téléphone dans l'espace. <br />
<br />
Pour ceux que ça intéresse il s'agit de rotation de repère dans l'espace. On parle assez souvent d'angles d'Euler vous trouverez pas mal de documentation sur le sujet (<a href="https://mecaspa.cannes-aero-patrimoine.net/SCAO/EULER/euler.htm" target="_blank">Exemple</a>)<br />
<br />
Enfin afin d'augmenter un peu la précision j'ai ajouté la possibilité de moyenner les résultats pour avoir une mesure plus précise. <font color="#FF0000">ATTENTION</font> c'est à n'utiliser que quand le téléphone est statique sinon les résultats ne sont pas terribles.</blockquote>

]]></content:encoded>
			<dc:creator>Gouyon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/27025-gouyon/b10778/application-boussole-android/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Juin)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10777/nouveau-pack-ressources-offertes-fab-juin/</link>
			<pubDate>Tue, 02 Jun 2026 17:37:17 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">une <a href="https://www.fab.com/listings/0667e321-31a7-40ed-b85c-6db5bbc4366b" target="_blank">station scientifique modulaire</a> ;</li><li style="">un <a href="https://www.fab.com/listings/16b82fb0-7ea5-4627-adcc-95f23a387b61" target="_blank">système d'inventaire en grille</a> ;</li><li style="">un <a href="https://www.fab.com/listings/2931e0fc-b1c0-4d6d-be28-95f6c22974d5" target="_blank">ensemble de modèle d'objets de survie</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10777/nouveau-pack-ressources-offertes-fab-juin/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Mai)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10776/nouveau-pack-ressources-offertes-fab-mai/</link>
			<pubDate>Wed, 20 May 2026 19:06:17 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/88cd6710-40d1-4afc-8f44-c8f42bd9df26" target="_blank">ensemble de modèles</a> de maisons faites avec des conteneurs ;</li><li style="">des <a href="https://www.fab.com/listings/ea85f730-1f39-4b15-8a69-60975d3b39a7" target="_blank">scans</a> d'une crypte en ruine ;</li><li style="">un <a href="https://www.fab.com/listings/bc34bd60-93e6-4039-bddd-d0162d5af74d" target="_blank">système</a> pour simuler des vitres en verre trempé, destructibles ;</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10776/nouveau-pack-ressources-offertes-fab-mai/</guid>
		</item>
		<item>
			<title>Les nouvelles fonctionnalités d’IA opérationnelles ou à venir de la solution d’Architecture d’Entreprise Obeo</title>
			<link>https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10775/nouvelles-fonctionnalites-d-ia-operationnelles-venir-solution-d-architecture-d-entreprise-obeo/</link>
			<pubDate>Tue, 19 May 2026 04:24:15 GMT</pubDate>
			<description>Recherche assistée par l’IA 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Recherche assistée par l’IA<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=676399&amp;d=1779164545" border="0" alt="Nom : architecture-ia-agentique-obeo-smartea-web-04.png
Affichages : 1000
Taille : 270,4 Ko"  style="float: CONFIG" /><br />
<br />
<a href="https://www.urbanisation-si.com/les-nouvelles-fonctionnalites-dia-operationnelles-ou-a-venir-de-la-solution-darchitecture-dentreprise-obeo-smartea" target="_blank">https://www.urbanisation-si.com/les-...e-obeo-smartea</a><br />
<br />
Cette fonctionnalité est encore expérimentale, mais on la trouve déjà dans la version 9 d’Obeo SmartEA. L'éditeur laisse la liberté à l’utilisateur de choisir son LLM entre 2 fournisseurs : le français Mistral ou l’américain OpenAI.<br />
La stratégie d’Obeo n’a pas été d'exposer le référentiel au LLM, mais de lui faire traduire une requête en langage naturel dans un langage technique. La confidentialité est assurée, aucune donnée utilisateur n’étant jamais envoyée. Ce langage technique open source utilisé dans SmartEA s’appelle AQL (Acceleo Query Language). Il se rapproche d’OCL (Object Constraint Language - norme OMG). Obeo a eu de la chance, car la plupart des LLM ont appris ce langage en analysant les documentations et les nombreux exemples, sans oublier son code source. L'Open Source a permis le partage de connaissances entre humains, sans entraves et maintenant avec les IA ! Un avantage inattendu, mais qui a de nombreuses conséquences, notamment dans le vibe coding et la réalisation d'applications par IA. Donc pas d’apprentissage, il vous suffit de configurer l’appel à l’API du LLM choisi (URL, clé…) et le tour est joué. Un prompt posant le contexte (« Tu es un développeur Acceleo Query Language… ») est déjà fourni dans un fichier modifiable.</blockquote>

]]></content:encoded>
			<dc:creator>Rhona Maxwel</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/893250-rhona-maxwel/b10775/nouvelles-fonctionnalites-d-ia-operationnelles-venir-solution-d-architecture-d-entreprise-obeo/</guid>
		</item>
		<item>
			<title>Retro Cloner, un outil pour faire des jeux retro sur Windows/MacOS/Linux</title>
			<link>https://www.developpez.net/forums/blogs/70032-djpoke/b10774/retro-cloner-outil-faire-jeux-retro-windows-macos-linux/</link>
			<pubDate>Mon, 18 May 2026 10:47:48 GMT</pubDate>
			<description>Bonjour, 
 
Je suis en train...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
Je suis en train de développer un logiciel avec Löve2d. Il permet de faire des jeux retro rapidement et sans programmation. Il immite le hardware graphique de l'Amstrad CPC, du Commodore 64, du ZX Spectrum, de l'Atari ST ou de l'Amiga.<br />
<br />
Attention, il est encore en travaux, et j'en ai encore peut-être pour trois semaines un mois avant d'avoir une première version beta. Mais le logiciel est fourni avec des petites demos, qui évoluent au fur et à mesure.<br />
<br />
Téléchargez le (gratuit et en license MIT) sur GitHub : <a href="https://github.com/DjPoke/RetroCloner" target="_blank">https://github.com/DjPoke/RetroCloner</a><br />
<br />
Enjoy :D</blockquote>

]]></content:encoded>
			<dc:creator>DjPoke</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/70032-djpoke/b10774/retro-cloner-outil-faire-jeux-retro-windows-macos-linux/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Mai)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10771/nouveau-pack-ressources-offertes-fab-mai/</link>
			<pubDate>Wed, 06 May 2026 18:32:03 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/b6a85679-47f0-4f59-aa6d-da9d5f59aee5" target="_blank">ensemble modulaire</a>, low poly, pour créer une ville ;</li><li style="">une <a href="https://www.fab.com/listings/3413113f-147a-4fc9-bd9f-7c543934969a" target="_blank">créature mécanique</a> dans un style steampunk ;</li><li style="">des <a href="https://www.fab.com/listings/0e920fbc-fb78-4331-a4e1-878dc3504bad" target="_blank">effets</a> pour reproduire les reflets de lentille.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10771/nouveau-pack-ressources-offertes-fab-mai/</guid>
		</item>
		<item>
			<title><![CDATA[[FMX] Un dialogue d'ouverture de fichier "stylisé" - partie arborescence]]></title>
			<link>https://www.developpez.net/forums/blogs/138527-sergiomaster/b10770/fmx-dialogue-d-ouverture-fichier-stylise-partie-arborescence/</link>
			<pubDate>Sun, 26 Apr 2026 09:40:18 GMT</pubDate>
			<description>Au risque de réinventer une...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Au risque de réinventer une roue existante que je n'aurais pas trouvée, j'ai décidé de créer mon dialogue.<br />
<br />
Il y a tout d'abord une première particularité à l'utilisation du <b>TTreeview</b> Firemonkey la création des éléments est vraiment différente de celle de VCL.<br />
Je vous livre mon secret pour optimiser le chargement : ne pas tout balayer mais seulement les répertoires enfants mais quand même indiquer s'il y a des branches possibles grâce à un élément fantôme.  <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code Delphi :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">procedure</span> TForm1.AddDirectories<span class="br0">&#40;</span>ParentNode: TTreeviewItem; <span style="color: #0000ff;">const</span> Path: <span style="color: #0080ff;">string</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  SubDirs: TStringDynArray;
  SubDir: <span style="color: #0080ff;">string</span>;
  NewNode: TTreeviewItem;
  HasChildren: <span style="color: #0080ff;">Boolean</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">if</span> DirectoryExists<span class="br0">&#40;</span>Path<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    NewNode:=<span style="color: #0000ff;">nil</span>;
    SubDirs := TDirectory.GetDirectories<span class="br0">&#40;</span>Path, <span style="color: #FF0000;">'*.*'</span>,
      TSearchOption.soTopDirectoryOnly<span class="br0">&#41;</span>;                <span style="color: #808080;">// un seul r&eacute;pertoire &agrave; la fois</span>
      <span style="color: #0000ff;">if</span> Sizeof<span class="br0">&#40;</span>subdirs<span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">then</span>
    <span style="color: #0000ff;">begin</span>
      <span style="color: #0000ff;">for</span> SubDir <span style="color: #0000ff;">in</span> SubDirs <span style="color: #0000ff;">do</span>
      <span style="color: #0000ff;">begin</span>
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> DirectoryExists<span class="br0">&#40;</span>subdir<span class="br0">&#41;</span> <span style="color: #0000ff;">then</span> continue;
        <span style="color: #0000ff;">try</span>
          HasChildren := Length<span class="br0">&#40;</span>TDirectory.GetDirectories<span class="br0">&#40;</span>SubDir<span class="br0">&#41;</span><span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
          NewNode := TTreeViewItem.Create<span class="br0">&#40;</span>ParentNode<span class="br0">&#41;</span>;
          NewNode.Parent := ParentNode;
          NewNode.Text := TPath.GetFileName<span class="br0">&#40;</span>SubDir<span class="br0">&#41;</span>; <span style="color: #808080;">// Nom seul, sans le chemin</span>
          NewNode.ImageIndex := <span style="color: #cc66cc;">0</span>;
          NewNode.TagString := StrNew<span class="br0">&#40;</span><span style="color: #0080ff;">PChar</span><span class="br0">&#40;</span>SubDir<span class="br0">&#41;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// Chemin complet stock&eacute;</span>
          NewNode.OnClick := TreeViewItemClick;
          <span style="color: #808080;">// V&eacute;rifie si ce sous-dossier a lui-m&ecirc;me des enfants</span>
          <span style="color: #808080;">// pour afficher ou non le bouton [+]</span>
        <span style="color: #0000ff;">except</span>
          HasChildren := <span style="color: #0000ff;">False</span>;
        <span style="color: #0000ff;">end</span>;
&nbsp;
        <span style="color: #0000ff;">if</span> HasChildren <span style="color: #0000ff;">then</span>
          <span style="color: #808080;">// N&#156;ud fant&ocirc;me : d&eacute;clenche l'affichage du bouton [+]</span>
         <span style="color: #0000ff;">begin</span>
           NoeudFantome<span class="br0">&#40;</span>NewNode<span class="br0">&#41;</span>;
         <span style="color: #0000ff;">end</span>;
      <span style="color: #0000ff;">end</span>;
    <span style="color: #0000ff;">end</span>;
  <span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.NoeudFantome<span class="br0">&#40;</span>ParentNode: TTreeViewItem<span class="br0">&#41;</span>;
<span style="color: #0000ff;">var</span>
  NewNode: TTreeviewItem;
<span style="color: #0000ff;">begin</span>
  NewNode := TTreeViewItem.Create<span class="br0">&#40;</span>ParentNode<span class="br0">&#41;</span>;
  NewNode.ImageIndex := -<span style="color: #cc66cc;">1</span>;
  NewNode.Parent := ParentNode;
<span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">procedure</span> TForm1.TreeViewItemClick<span class="br0">&#40;</span>Sender: <span style="color: #0080ff;">TObject</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">begin</span>
  <span style="color: #0000ff;">var</span> path := TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.TagString;
&nbsp;
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.Count&gt;<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AND</span> <span class="br0">&#40;</span>TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.ItemByIndex<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>.ImageIndex=-<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span style="color: #0000ff;">then</span>
  <span style="color: #0000ff;">begin</span>
    TreeView1.BeginUpdate;
    FreeAndnil<span class="br0">&#40;</span>TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.ItemByIndex<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
    AddDirectories<span class="br0">&#40;</span>TTreeviewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>, TTreeViewItem<span class="br0">&#40;</span>sender<span class="br0">&#41;</span>.TagString<span class="br0">&#41;</span>;
    TTreeviewItem<span class="br0">&#40;</span>Sender<span class="br0">&#41;</span>.Expand;
    TreeView1.EndUpdate;
  <span style="color: #0000ff;">end</span>;
&nbsp;
<span style="color: #0000ff;">end</span>;</pre></td></tr></table></pre>
</div><br />
Si on en reste là quand nous voulons obtenir les sous-répertoires en utilisant l'extenseur, nous verrons l'élément fantôme pas la suite de l'arborescence.<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675938&amp;d=1777190265" border="0" alt="Nom : Capture.png
Affichages : 75
Taille : 13,0 Ko"  style="float: CONFIG" /><br />
  <br />
Le problème avec le <b>TTreeView</b> en Firemonkey est qu'il manque certains évènements défini en VCL comme le<b> OnExpanding</b> et si l'on utilise l'extenseur, l'évènement  <b>TreeViewItem.OnClick</b> n'est pas déclenché.  <br />
<br />
Donc comment procéder ? J'ai testé plusieurs solutions en commençant par le surclassement de <b>TTreeViewItem</b>.<br />
Puis j'ai fait des tentatives de désactivation du bouton extenseur en accédant au style de l'élément. <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675939&amp;d=1777191155" border="0" alt="Nom : Capture.png
Affichages : 78
Taille : 6,8 Ko"  style="float: CONFIG" /><br />
<br />
Celles-ci paraissaient prometteuses mais, hélas, pas toujours efficace. Dans l'image suivante l'extenseur de <b><i>TreeviewItem6</i></b> devrait être grisé. <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675940&amp;d=1777192874" border="0" alt="Nom : Capture.png
Affichages : 76
Taille : 30,2 Ko"  style="float: CONFIG" /> <br />
<br />
Cependant la piste du style se révèle être la bonne si l'on utilise les spécificités des styles Firemonkey, à savoir la méthode de recherche d'un style d'élément (stylelookup). <br />
J'ai commencé par déposer un nouveau <b>TStyleBook</b> sur le formulaire.   <br />
Puis j'ai ouvert le style en cours pour copier le l'élément nommé <b><i>treeviewitemstyle</i></b> afin de le coller dans ce nouveau <b>Stylebook</b>.<br />
J'ai ensuite renommé ce dernier en <b><i>treeviewitemghosted</i></b>.<br />
J'ai ensuite changé le comportement du bouton en mettant simplement la propriété <b>HitTest</b> à false.<br />
Enfin, pour que l'affichage du texte soit correct quelque soit le style en cours, j'ai supprimé <b>TText</b> pour le remplacer par un <b>TLabel</b>.<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675942&amp;d=1777193762" border="0" alt="Nom : Capture.png
Affichages : 35
Taille : 56,2 Ko"  style="float: CONFIG" /><br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code Delphi :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br /></div></td><td valign="top"><pre style="margin: 0">procedure TForm1.AddDirectories(ParentNode: TTreeviewItem; const Path: string);
var
  SubDirs: TStringDynArray;
  SubDir: string;
  NewNode: TTreeviewItem;
  HasChildren: Boolean;
begin
  if DirectoryExists(Path) then
  begin
    NewNode:=nil;
    SubDirs := TDirectory.GetDirectories(Path, '*.*',
      TSearchOption.soTopDirectoryOnly);
      if Sizeof(subdirs) &gt; 0 then
    begin
      for SubDir in SubDirs do
      begin
        if not DirectoryExists(subdir) then continue;
        try
          HasChildren := Length(TDirectory.GetDirectories(SubDir)) &gt; 0;
          NewNode := TTreeViewItem.Create(ParentNode);
          NewNode.Parent := ParentNode;
          NewNode.Text := TPath.GetFileName(SubDir); // Nom seul, sans le chemin
          NewNode.ImageIndex := 0;
          NewNode.TagString := StrNew(PChar(SubDir)); // Chemin complet stocké
          NewNode.OnClick := TreeViewItemClick;
          // Vérifie si ce sous-dossier a lui-même des enfants
          // pour afficher ou non le bouton [+]
        except
          HasChildren := False;
        end;

        if HasChildren then
          // Nœud fantôme : déclenche l'affichage du bouton [+]
         begin
         <font color="#0000FF"> newNode.StyleLookup:='treeviewitemghosted';</font>
          NoeudFantome(NewNode);
         end;
      end;
    end;
  end;
end;
end;

procedure TForm1.TreeViewItemClick(Sender: TObject);
begin
  var path := TTreeViewItem(sender).TagString;
<font color="#0000FF">  if TTreeViewItem(sender).StyleLookup.EndsWith('ghosted') then</font>
  begin
    TreeView1.BeginUpdate;
 <font color="#0000FF">   TTreeViewItem(sender).StyleLookup:=''; // style en cours
    TTreeViewItem(sender).NeedStyleLookup;</font> // ne pas oublier
    FreeAndnil(TTreeViewItem(sender).ItemByIndex(0));
    AddDirectories(TTreeviewItem(sender), TTreeViewItem(sender).TagString);
    TTreeviewItem(Sender).Expand;
    TreeView1.EndUpdate;
  end;
  
end;
end;</pre></td></tr></table></pre>
</div><br />
Le résultat final <br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=675944&amp;d=1777197217" border="0" alt="Nom : Dialogue.gif
Affichages : 57
Taille : 1,83 Mo"  style="float: CONFIG" /><br />
<br />
Le prochain billet parlera de comment j'ai traité la liste (<b>TListBox</b>) droite</blockquote>

]]></content:encoded>
			<dc:creator>SergioMaster</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/138527-sergiomaster/b10770/fmx-dialogue-d-ouverture-fichier-stylise-partie-arborescence/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Avril)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10769/nouveau-pack-ressources-offertes-fab-avril/</link>
			<pubDate>Tue, 21 Apr 2026 15:36:12 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<br />
<ul><li style="">un <a href="https://www.fab.com/listings/14e5f29e-26eb-4b7c-82c6-e48e43fd1276" target="_blank">effet de rendu</a> pour simuler la cassette vidéo (VHS) d'une caméra au torse (bodycam) ;</li><li style="">une <a href="https://www.fab.com/listings/ec2385d7-3e02-494b-a243-e18cac7f4a69" target="_blank">station sous-marine</a> ;</li><li style="">un ensemble de <a href="https://www.fab.com/listings/ea4d6c6f-83d9-4250-a12b-7393753db0f2" target="_blank">ponts modernes</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10769/nouveau-pack-ressources-offertes-fab-avril/</guid>
		</item>
		<item>
			<title>Développement d’un jeu de plateau en Delphi avec l’aide de Claude AI</title>
			<link>https://www.developpez.net/forums/blogs/27025-gouyon/b10768/developpement-d-jeu-plateau-delphi-l-aide-claude-ai/</link>
			<pubDate>Sat, 18 Apr 2026 20:16:56 GMT</pubDate>
			<description><![CDATA[*_Introduction:_* 
 
J'ai...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><i><u>Introduction:</u></i></b><br />
<br />
J'ai développé en delphi un jeu de plateau assimilable à un jeu de dame. Plus précisément il s'agit de GIPF premier jeu de la série du projet GIPF qui est une série de jeux de stratégie combinatoires abstraits créés par Kris Burm entre 1997 et 2017, qui opposent deux joueurs (<a href="https://fr.wikipedia.org/wiki/Projet_GIPF" target="_blank">Pour plus de détail suivre ce lien</a>). Je souhaitais ajouter à ce jeu la capacité de jouer contre la machine et ce n'est pas évident du tout. Mes premières approches ont été d'utiliser des algorithmes du type min-max puis j'ai fait de l'apprentissage renforcé (Q-Learning). Mais compte tenu du nombre de combinaisons possibles, ces algorithmes ne pouvaient pas répondre au besoin. Du coup j'ai envisagé l'apprentissage profond renforcé (deep Q-Learning). Il s'agit d'une extension de l'apprentissage renforcé qui utilise un réseau neuronal pour estimer les valeurs de renforcement. Le problème est que je ne savais pas du tout comment m'y prendre. En effet, on trouve beaucoup d'articles sur ce sujet sur internet mais ils ont tendance à toujours reprendre les mêmes exemples et à être très généraux. De plus les codes sont en Python et je ne me voyais pas coder à nouveau mon jeu en Python. N'ayant pas réussi à trouver mon bonheur j'ai tenté l'IA.<br />
<br />
<b><i><u>Merci à l'IA:</u></i></b><br />
J'ai testé plusieurs IA chatGPT ,Perpexity mais c'est Claude qui m'a donné le meilleur résultat. En effet une fois le problème exposé, il m'a proposé plusieurs solutions comme les autres mais en plus après quelques précisions de ma part, il m'a fourni les codes en python et en pascal pour faire fonctionner mon IA. N'ayant qu'une connaissance très approximative de Python il m'a indiqué comment faire les installations et il m'a aussi indiqué quelles corrections faire lorsque je lui remontais des erreurs. Afin d'éviter de coder à nouveau le jeu en Python, j'ai demandé à Claude de me fournir une solution basée sur le principe dans lequel j'allais fournir au modèle un ensemble d'expériences. Chaque expérience est composée d'une situation de mon plateau de jeu à laquelle j'associe un coup et une évaluation de la situation après que le coup a été joué.<br />
<br />
<b><i><u>Comment tout ça fonctionne</u></i></b><br />
Même si Claude a généré pas mal de code, j'ai quand même du faire un certain nombre de choses. Tout d'abord j'ai développé un algorithme qui génère des expériences et qui les évalue (je détaillerai plus la fonction d'évaluation dans le chapitre suivant). Ensuite j'entraine le modèle à l'aide des codes Python et le résultat est exporté sous la forme d'un fichier JSON. Ensuite je lis ce fichier JSON ce qui me permet de créer un réseau de neurones sous delphi que j'utilise en l’alimentant avec une situation donnée et il me donne le meilleur coup possible qu'il a calculé.<br />
<br />
<b><i><u>La fonction d'évaluation</u></i></b><br />
Par principe l'apprentissage par renforcement fonctionne sur un système de récompense. Très grossièrement si le système joue bien, il est récompensé et s'il joue mal il est puni. C'est pourquoi la fonction d'évaluation est fondamentale. Et c'est ce qui m'a posé les plus grandes difficultés. Comme indiqué précédemment, pour une situation et un coup donné, il faut attribuer un réel dont la valeur comprise entre -1 (j'ai perdu) et 1 (j'ai gagné) représente le degré de récompense de ce coup. Et c'est là que ça peut devenir extrêmement compliqué. En effet dans le cas ou le coup mène à une victoire ou à une défaite, l'estimation est simple à faire c'est respectivement 1 ou -1. Par contre dans tous les autres cas c'est beaucoup plus compliqué car il faut attribuer une valeur qui indique si pour cette situation donnée ce coup est bon ou mauvais. La fonction d'évaluation doit être capable d'estimer cela. Par exemple pour GIPF, le but du jeu est de prendre tous les pions adverses. Donc on peut imaginer une fonction d'évaluation qui récompense en fonction de la différence entre son nombre de pions et celui de l'adversaire. Mais comme à chaque coup on ne prend pas systématiquement un pion adverse, il y a un bon nombre de situation et de coup qui vont être de même valeur d'évaluation. Or parmi ces situations, il est possible que certaines aboutissent à un coup gagnant pour l'adversaire. Du coup une situation qui est à priori bonne peut finir en catastrophe.<br />
<br />
<b><i><u>Le suivi du projet par Claude</u></i></b><br />
Après mes premiers tests, j'ai soumis à Claude les résultats et il m'a expliqué ce qui se passait de façon claire et il m'a conseillé un certain nombre d'améliorations. Alors soyons honnête Claude n'a pas toujours raison et certaines de ses suggestions ont donné de mauvais résultats. Mais dans l'ensemble cela m'a permis d'avancer dans le projet.<br />
<br />
<b><i><u>En conclusion</u></i></b><br />
Je dirais que le point le plus positif a été de me mettre le pied à l'étrier. A partir du moment où Claude m'a fourni les premiers éléments de code, j'ai pu commencer à faire quelque chose. Le second point positif c'est que j'ai pu &quot;dialoguer&quot; avec Claude pour améliorer le projet. Par contre il ne faut pas rêver même si Claude aide beaucoup, il y a énormément de travail à faire par la suite et à moins d'avoir un jeu très simple, l'obtention d'un résultat satisfaisant peut être longue et difficile.</blockquote>

]]></content:encoded>
			<dc:creator>Gouyon</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/27025-gouyon/b10768/developpement-d-jeu-plateau-delphi-l-aide-claude-ai/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Avril)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10764/nouveau-pack-ressources-offertes-fab-avril/</link>
			<pubDate>Wed, 08 Apr 2026 16:52:51 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/25c67cda-991e-48a8-a194-478624ae4c0e" target="_blank">pack de ressources</a> pour recréer un donjon dans un style fantastique ;</li><li style="">une <a href="https://www.fab.com/listings/41b04af3-274d-4921-97e3-52aa7a6b45d5" target="_blank">forêt dans les ténèbres et peu accueillante</a> ;</li><li style="">un <a href="https://www.fab.com/listings/394c4850-c9af-461a-aaa8-921a3dd875cb" target="_blank">module</a> pour ajouter des notes dans vos blueprints.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10764/nouveau-pack-ressources-offertes-fab-avril/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Mars)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10753/nouveau-pack-ressources-offertes-fab-mars/</link>
			<pubDate>Tue, 24 Mar 2026 19:59:57 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/89b16c3a-47ea-486e-ac09-bc2237af93f9" target="_blank">modèle de golem de pierre</a> ;</li><li style="">un <a href="https://www.fab.com/listings/fa19fa3a-62e4-4528-82dc-19bc66521f3b" target="_blank">village dans le style Steampunk</a> ;</li><li style="">un <a href="https://www.fab.com/listings/c1ea4a26-ea15-448a-9650-5ba91caa52bc" target="_blank">système pour faire apparaître des entités</a>.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10753/nouveau-pack-ressources-offertes-fab-mars/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab (Mars)</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10752/nouveau-pack-ressources-offertes-fab-mars/</link>
			<pubDate>Sat, 14 Mar 2026 10:18:56 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">un <a href="https://www.fab.com/listings/3ce604c0-26a3-4268-8114-a884b80da94c" target="_blank">pack modulaire</a> pour créer un environnement avec un phare abandonné ;</li><li style="">un <a href="https://www.fab.com/listings/56d276bc-868e-44bd-b198-c036f2e48386" target="_blank">ensemble modulaire</a> de bâtiments en ruines ;</li><li style="">un <a href="https://www.fab.com/listings/05d90ca6-d294-4b93-a1b7-232214057850" target="_blank">ensemble d'animations</a> pour des combats de magie.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10752/nouveau-pack-ressources-offertes-fab-mars/</guid>
		</item>
		<item>
			<title>Nouveau pack de ressources offertes sur Fab</title>
			<link>https://www.developpez.net/forums/blogs/240267-littlewhite/b10749/nouveau-pack-ressources-offertes-fab/</link>
			<pubDate>Wed, 25 Feb 2026 21:09:07 GMT</pubDate>
			<description>Epic Games à travers sa...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Epic Games à travers sa plateforme Fab.com offre de nouvelles ressources disponibles durant deux semaines :<br />
<ul><li style="">des <a href="https://www.fab.com/listings/4d1e4ac0-a02b-4a6b-8562-db759bc395c7" target="_blank">personnages</a> dans un style fantastique ;</li><li style="">un <a href="https://www.fab.com/listings/d8ac4186-78f7-43c7-b21c-04b4dc0901a2" target="_blank">ensemble modulaire</a> pour faire une station de traitement dans un style science fiction ;</li><li style="">un <a href="https://www.fab.com/listings/da3e48f2-d703-4233-b667-d3f57a4c787a" target="_blank">ensemble d'effets</a> visuels pour des sorts magiques.</li></ul></blockquote>

]]></content:encoded>
			<dc:creator>LittleWhite</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/240267-littlewhite/b10749/nouveau-pack-ressources-offertes-fab/</guid>
		</item>
	</channel>
</rss>
