Craquer ou ne pas craquer...

31. mars 2008

Bon je dois bien le dire j'ai envie de rejouer à Wow. Ca me titille même gravement. Alors pesons ensemble les pours et les contres:

  • Pour:
    • Mimetis arrêtera de me casser les rouleaux
    • Je retrouverai mes amis dans le jeu (oh mon dieu, des amis virtuels!! Comme c'est sale!!!)
    • Je retrouverai mon petit mage (oh mon dieu, un jouet virtuel!!! Espèce de dégénéré du bulbe mou!)
    • J'arrêterai de penser à mon éventuelle reprise
    • Retrouver les plaisirs de la progression en équipe, de l'organisation de beaux combats, de la stratégie à plusieurs
  • Contre:
    • Adieu ma super productivité du fait de mes soirées laissées libres
    • Fini les soirées DVD/câlins/dodo tôt
    • Obligé de rentrer tôt pour ne pas râter le début des raids
    • Obligé de me coucher à pas d'heure
    • Obligé de gueuler comme un con devant mon PC parce que je n'arrive pas à avoir les objets "de la mort qui déchire tout version 8" que je veux
    • Obligé de me taper Kévin et sa famille qui n'ont pas toutes les touches sur leur clavier, les obligeant par la même à n'utiliser que des mots sans voyelle

 

Bon au final, ca ne m'aide pas...je vais installer le jeu déjà, on verra bien.

WoW

Rendre une application C# compatible avec l'UAC de Vista

28. mars 2008

Malgré ce que peuvent en dire certains, je continue de penser que l'UAC est une bonne chose. Le fait de ne pas être tout puissant lorsque l'on est administrateur ou même le fait de pouvoir localement acquérir des droits plus élévés est à mon sens une excellente chose.

Il faut cependant penser ses applications dans ce sens lorsqu'elles doivent toucher à des fonctions gardées par l'UAC (comme le répertoire de Windows, Program Files ou bien encore la base de registre).

Pour ce faire il faut, au sein de son projet Visual Studio 2008, rajouter le fichier suivant (que l'on appelera xxxx.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>

Ce qui est important dans ce fichier, c'est la notion de requestedExecutionLevel. Elle peut valoir trois valeurs:

  • asInvoker
  • requireAdministrator
  • highestPossible

Dans notre cas, nous voulons que Vista propose à l'utilisateur une confirmation de l'élévation de droits pour notre application (si nous sommes administrateur) ou une fenêtre de demande de droits (si nous sommes simple utilisateur).

Pour lier le manifest à notre application, cela se passe dans les propriétés de l'application sous Visual Studio 2008 dans l'onglet Application. On y trouve une liste qui nous permet de lier un fichier .manifest du projet à l'application générée.

image

Et le tour est joué :).

.Net, Windows

Partage de storyboards en Silverlight

26. mars 2008

Plusieurs personnes m'ont demandé le code des barres qui apparaissent sur mouse over dans Nova Light.

Je m'exécute donc avec plaisir :). Cela va me permettre de parler un peu du partage d'animations via les storyboards.

Pour la partie contrôle j'ai défini une grille toute simple:

<Grid HorizontalAlignment="Left" Margin="-134,0,0,0" Width="210" VerticalAlignment="Stretch" RenderTransformOrigin="0.5,0.5" x:Name="grid" MouseEnter="grid_MouseEnter" MouseLeave="grid_MouseLeave">
    <Grid.RenderTransform>
        <TransformGroup>
            <ScaleTransform/>
            <SkewTransform/>
            <RotateTransform/>
            <TranslateTransform/>
        </TransformGroup>
    </Grid.RenderTransform>
    <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" Width="Auto" Stroke="#C1C1C1" VerticalAlignment="Stretch" RadiusX="10" RadiusY="10">
        <Rectangle.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                <GradientStop Offset="0" Color="#FBFBFB"></GradientStop>
                <GradientStop Offset="0.5" Color="#F3F3F3"></GradientStop>
                <GradientStop Offset="0.5" Color="#E8EAEA"></GradientStop>
                <GradientStop Offset="1.0" Color="#ECECEC"></GradientStop>
            </LinearGradientBrush>
        </Rectangle.Fill>
    </Rectangle>
    <CheckBox x:Name="ckFPS" HorizontalAlignment="Left" Foreground="#888888" Content="FPS" Checked="ckFPS_Checked" Unchecked="ckFPS_Unchecked" Margin="14,0,0,0"/>
    <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Options" TextWrapping="Wrap" d:LayoutOverrides="Width, Height" Margin="0,0,15,0" Foreground="#888888"/>
    <Image Source="Grip.png" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0, 15, 4, 15"/>
</Grid>

J'ai également déclaré dans les resources du contrôle les storyboards suivants:

<Storyboard x:Name="ShowScenes">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="gridScene" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" BeginTime="00:00:00">
        <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="322"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="HideScenes">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="gridScene" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" BeginTime="00:00:00">
        <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

On pourra noter que les storyboards ciblent une autre grille que la mienne. En effet, je me sers de ces storyboards de manière générique pour toutes les barres du contrôle.

Toute la magie se fait donc au niveau des événements "grid_MouseEnter" et "grid_MouseLeave":

private void grid_MouseEnter(object sender, MouseEventArgs e)
{
    Storyboard.SetTarget(ShowScenes, grid);
    ShowScenes.Begin();
}

private void grid_MouseLeave(object sender, MouseEventArgs e)
{
    Storyboard.SetTarget(HideScenes, grid);
    HideScenes.Begin();
}

On en revient donc toujours à ces propriétés attachées :). En effet, il me suffit ici de venir changer la cible de mon storyboard via la méthode statique Storyboard.SetTarget.

Et le tour est joué!

.Net, Silverlight

Nova : Personal Learning Edition

20. mars 2008

Si vous souhaitez vous lancer dans le monde merveilleux de la 3D et que vous êtes fans de .Net, une seule adresse:

http://www.vertice.fr/Public/PLE.aspx

Vous pourrez y télécharger Nova 2008 en version illimitée.

New_Arch1[1]

Sachez également que vous pouvez télécharger le SDK de Nova pour faire de la jolie 3D (avec des ombres, de la physique, des effets spéciaux) dans vos applications .Net:

http://www.vertice.fr/filesNova 2008 SDK.msi

Le SDK est également illimité. Par contre il cessera de fonctionner après 5 minutes d'exécution.

Nova

Le philosophe du Chaos

19. mars 2008

Afin de mettre en image ma théorie du nombre limité de possibilités ("Des chiffres et des lettres"), j'ai écris un petit programme en Silverlight accessible ici.

Ce petit plugin génére 5 mots de manière totalement aléatoire. Chaque mot peut compter entre 0 et 9 signes alphabétiques.

Pour reprendre mon idée, il est tout à fait possible que le philosophe du chaos vous sorte une phrase tout à fait correcte et même une pensée fine du style "je pense donc je suis".

Si cela vous arrive, surtout envoyez moi un mail.

Je vais faire une évolution qui va faire en sorte que les mots générés soient vérifiés dans un dictionnaire pour une future version ce qui augmentera énormément les chances de phrases correctes.

Tip : Il est possible de refaire générer une nouvelle phrase en cliquant sur la phrase actuelle.

Philo, Silverlight

Lancement d'Internet Explorer provoquant le blocage de la barre de lancement de Windows

19. mars 2008

Comme beaucoup j'ai une jolie icône d'Internet Explorer 7 dans ma barre de lancement rapide. Le truc c'est que actuellement avec IE, la barre devrait plutôt s'appeler "barre de lancement molle". En effet depuis quelques temps lorsque j'utilisais ce raccourci ma barre de lancement (et le menu Démarrer) se figeait et IE mettait un bon moment à se lancer.

Je suis donc allé à la mine pour savoir pourquoi et finalement j'ai trouvé (après avoir plombé ma base de registre, retourné tous mes répertoires, installé HijackThis, lancé 83 scans, perdu ma soirée, fait 3 tentatives de suicide par pendaison avec un câble VGA)

Au final il s'avère que lors du lancement d'IE une autre application se lance, il s'agit de l'assistant de connexion Windows Live. Bon c'est classe mais ça me brise les perfs et ça ce n'est pas possible. Un petit coup de désintallation de cette application (qui s'installe avec Windows Live Messenger) pour briser le couple diabolique et mon IE a retrouvé sa "célérité" naturelle.

Voila, si cela peut sauver vos soirées...

Windows

Silverlight 2 3D - Part 4

13. mars 2008

Un peu de design et ça se la raconte tout de suite plus :)

Grâce à mon ami Cyril Sansus, mon petit moteur 3D a un peu plus de gueule.

J'ai mis en place des controls templates pour les boutons et les menus ont été redessinés.

D'ailleurs au passage, si l'on souhaite gérer simplement des animations sur un bouton (par exemple), il suffit de créer un storyboard dans le template d'un bouton avec un nom spécifique:

  • MouseOver State : Pour le mouse Over
  • Pressed State : Pour le mode appuyé

C'est assez différent de WPF qui nous fournit pour cela un mécanisme plus riche avec les triggers.

Un lien sur le MSDN résume tout cela par contrôle : http://msdn2.microsoft.com/en-us/library/cc189093(VS.95).aspx

Exemple pour Nova Light:

<Grid Width="50" Margin="1,2,1,2" x:Name="RootElement" 
RenderTransformOrigin="0.5, 0.5" Opacity="0.8">
    <Grid.Resources>
        <Storyboard x:Key="Normal State" />
        <Storyboard x:Key="MouseOver State">
            <ColorAnimation Duration="0:0:0.2" 
                            Storyboard.TargetName="finalColor" 
                            Storyboard.TargetProperty="Color" 
                            To="#AAAAAA" />
            <DoubleAnimation Duration="0:0:0.1" 
                             Storyboard.TargetName="RootElement" 
                             Storyboard.TargetProperty="Opacity" 
                             To="1" />
        </Storyboard>
...
    </Grid.Resources> 
</Grid>

Silverlight

Le futur de l'écologie

13. mars 2008

Force est de constater que l'écologie est un sujet majeur des débats de notre époque.

Alors moi je ne veux pas faire le lourd, cela ne me pose pas de problème de rouler dans une voiture qui sent la cabane à frites, cela ne me pose pas de soucis d'aller au boulot en sentant le vieux nem. Je veux bien faire plein d'efforts pour m'éclairer à la bougie en me chauffant en brûlant le beau mobilier en rotin de maman.

Mais bon, bizarrement je ne sens pas que ça va être très populaire. Je ne parle pas des champs entiers de Colza qu'il va falloir planter, ça va créer une ambiance super classe. En plus cela va créer une vieille demande sur les terrains agricoles au dépend de l'alimentaire.

Je pense qu'il va falloir trouver quelque chose d'un peu plus révolutionnaire parce que là l'humanité a la tête dans le four à micro-ondes et ça commence à sentir le cramé.

D'ailleurs ça tombe bien qu'on parle de ça car j'ai une idée sur le sujet du recyclage des déchets: il faudrait exporter nos déchets sur la Lune!!!!!

Cela passe par la mise au point d'une barge spatiale à grande contenance qui saurait fonctionner en brûlant certains types de déchets. Elle irait orbiter autour de la Lune et débarquerait sa cargaison dans des plaines bien définies. De toute manière la Lune est un astre mort, c'est pas la super ambiance en journée (ni même en soirée d'ailleurs) et les séléniens (les habitants de la Lune pour les deux débiles du fond) sont des gens assez discrets et peu embarrassés avec les questions d'environnement.

Le seul hic à cette théorie provient du transfert de masse. En effet, à force d'enlever de la masse à la Terre pour la bazarder sur la Lune on risque de chambouler l'équilibre spatial avec comme conséquences:

  • Un rapprochement de la Terre vers le soleil qui risque d'être des millions de fois pire que notre effet de serre à la papa
  • Un éloignement de la Lune avec baisse de la puissance des marées et tout ce que ça entraînera sur les équilibres biologiques

Pour contrecarrer cela il faudrait transférer une masse équivalent de la Lune vers la Terre. Peut être en créant des usines de recyclage sur place.

Philo

Silverlight 2 3D - Part 3

11. mars 2008

Bon au menu aujourd'hui : intégration du moteur dans mon blog et amélioration de l'élimination des faces cachées.

Je continue à tourner autour de mon problème majeur : la gestion des textures. Je n'arrive pas à voir comment utiliser un Image Brush sur mes polylines pour tenir compte des coordonnées de textures d'un objet.

Je vais plutôt aller brûler un cierge sur l'autel Microsoft en espérant que la prochaine release de Silverlight permettra de générer des images dynamiquement.

Silverlight

Modifier le template d'un controle en SilverLight 2

10. mars 2008

Pour modifier le template d'un contrôle en SilverLight2, cela ressemble beaucoup à WPF mais il faut être plus strict.

En effet, si l'on veut garder le comportement du contrôle de base, il faut faire apparaître des éléments obligatoires qui sont référencés ici en fonction du contrôle.

Prenons par exemple un changement de template pour un RepeatButton. Ce dernier (comme une grosse majorité d'ailleurs) attend de trouver un élément nommé "RootElement".

Si on oublie de le préciser, le template s'appliquera correctement MAIS le comportement du contrôle (par exemple ici la gestion de la répétition de l'événement Click) ne sera pas forcément pris en compte.

Exemple:

<RepeatButton Content="Clic Me" Click="butTurnRight_Click" Interval="20">
    <RepeatButton.Template>
        <ControlTemplate TargetType="RepeatButton">
            <Grid x:Name="RootElement">
                <Path HorizontalAlignment="Center" VerticalAlignment="Center" Data="M0,0 L10,10 0,20"/>
            </Grid>
        </ControlTemplate>
    </RepeatButton.Template>
</RepeatButton>

On peut donc noter deux choses importantes (que l'on pouvait omettre en WPF):

  • TargetType="RepeatButton"
  • x:Name="RootElement"

Et voila....

Silverlight