Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Changer la forme de l'animation matrix [ Archives / J'AI BESOIN D'AIDE !!!! :O ] (Also know as)

dimanche 15 février 2004 à 14:41:51 | Changer la forme de l'animation matrix

Also know as

Membre Club
Bonjour,

Voici une méthode permettant de créer une animation à la matrix sans sa police.

Il suffit juste d'appeler sa Form MainForm, mettre un memo et c'est tout.

Le memo doit avoir ces propriétés :



object Memo1: TMemo
Left = 179
Top = 95
Width = 329
Height = 235
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
ReadOnly = True
TabOrder = 0
end


En lancant l'application, vous verrez une animation matrix qui prend toute la fenêtre avec un memo elliptique à un endroit bien précis.
Le memo est là pour vous donner un gout de ce que je souhaiterais.
Je voudrais tout simplement que l'animation matrix est les mêmes propriétés que le mémo (taille, ellipticité.), pas qu'elle prenne toute la fenêtre.

Est-ce que quelqu'un pourrait m'aider sur ce sujet là ?

Voici le code source en entier :



unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
{ Ce record va nous permettre de stocker un caractère à l'écran ainsi que
sa couleur à un instant donné. Il aurait été possible de ne pas stocker
la couleur, mais c'est plus simple ainsi. }
TCharInfo = record
Character: AnsiChar;
Color: TColor;
end;

{ Une colonne est représentée par un tableau de n caractères }
TColumn = array of TCharInfo;
{ Une ligne est un tableau de colonnes }
TRows = array of TColumn;
{ La position du caractère blanc de chaque colonne à un instant donné }
TBrightChars = array of Integer;

TMainForm = class(TForm)
Memo1: TMemo;
procedure FormResize(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
FChars: TRows; // La matrice!
FBrightChars: TBrightChars; // Les caractères blancs
FCharWidth: Integer; // La largeur approximative d'un caractère
FCharHeight: Integer; // La hauteur approximative d'un caractère
FCharsPerColumn: Integer; // Le nombre de caractères par colonne (hauteur)
FCharsPerRow: Integer; // Le nombre de caractères par ligne (largeur)
FBuffer: TBitmap; // Le buffer 'off screen'

procedure ResizeAll;
procedure DrawBackground;
procedure ChooseVisibleChars;
procedure MoveChars;
procedure Draw(const Surface: TCanvas);
function Fade(const AColor: TColor; ADistance: Integer): TColor;

procedure Idle(Sender: TObject; var Done: Boolean);
public
{ Déclarations publiques }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

const
{ Quelques constantes pratiques }
BrightColor = $0000FF00; // Couleur verte max
MinFrameLength = 50; // Durée minimale d'une frame en ms
WhiteColor = clWhite; // Couleur blanche (apparition du caractère)

var
MainForm: TMainForm;

implementation
uses
Math { Utile pour les fonctions Min et Max };

{$R *.DFM}

{ TMainForm }

procedure TMainForm.ChooseVisibleChars;
{ Procédure déterminant la position du caractère blanc de chaque colonne
au départ (initialisation) de façon aléatoire }
var
i: Integer;
begin
for i:=0 to FCharsPerRow - 1 do
FBrightChars[i]:= Random(FCharsPerColumn);
end;

constructor TMainForm.Create(AOwner: TComponent);
{ Premières initialisation dans le constructeur de la fenêtre }
begin
inherited;

{ Création du buffer dans lequel on va dessiner }
FBuffer:= TBitmap.Create;
FBuffer.Canvas.Brush.Style:= bsClear; // Pas de fond lors de l'écriture

{ Les propriétés de la fonte utilisée saont récupérées de la fenêtre
pour être facilement modifiables. Pour bien faire, il nous faudrait
une police japonaise, mais où la trouver? }
FBuffer.Canvas.Font.Size:= Font.Size;
FBuffer.Canvas.Font.Name:= Font.Name;

{ Calcul des largeur et hauteur approximatives des caractères }
FCharWidth:= FBuffer.Canvas.TextWidth('m'); {m à la place de W}
FCharHeight:= FBuffer.Canvas.TextHeight('m'); {sinon pas de scroll}

{ Initialisation du générateur aléatoire }
Randomize;

{ Il n'est pas nécessaire d'appeler la méthode ici car elle est déclenchée
par l'évènement OnResize de la fenêtre }
// ResizeAll;

{ On branche notre méthode de traitement sur l'évènement OnIdle de l'application }
Application.OnIdle:= Idle;
end;

destructor TMainForm.Destroy;
begin
{ Libération du buffer }
FreeAndNil(FBuffer);
inherited;
end;

procedure TMainForm.Draw(const Surface: TCanvas);
{ La routine de tracé elle-même. Celle-ci est très simple, elle se contente
de parcourir la matrice et d'écrire chaque caractère dans le buffer. Celui-ci
est ensuite copié dans le canevas de la fenêtre. }
var
i, j: Integer; // Indices de boucles
c: Char; // Le caractère à écrire
CurrentWidth, CurrentHeight: Integer; // Largeur et hauteur du caractère
deltaX, deltaY: Integer; // Décalages
x, y: Integer; // Coordonnées écran du caractère à écrire
begin
for i:= 0 to FCharsPerRow - 1 do
for j:=0 to FCharsPerColumn - 1 do
begin
c:= FChars[i][j].Character; // On récupère le caractère à écrire
currentWidth:= FBuffer.Canvas.TextWidth(c); // On calcule sa largeur
currentHeight:= FBuffer.Canvas.TextHeight(c); // et sa hauteur
deltaX:= FCharWidth - currentWidth div 2; // Les décalages permettent de bien
deltaY:= FCharHeight - currentHeight div 2; // centrer le caractère
x:= i * FCharWidth + deltaX; // Calcul des coordonées du caractère
y:= j * FCharHeight + deltaY; // à l'écran
FBuffer.Canvas.Font.Color:= FChars[i][j].Color; // On récupère sa couleur
FBuffer.Canvas.TextOut(x, y, c); // Et on l'écrit dans le buffer
end;

{ La fonction BitBlt permet de copier rapidement le buffer dans la fenêtre }
BitBlt(Surface.Handle, 0, 0, FBuffer.Width, FBuffer.Height,
FBuffer.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TMainForm.DrawBackground;
{ Cette méthode se contente de remplir le buffer en noir }
begin
BitBlt(FBuffer.Canvas.Handle, 0, 0, FBuffer.Width, FBuffer.Height,
0, 0, 0, BLACKNESS);
end;

function TMainForm.Fade(const AColor: TColor;
ADistance: Integer): TColor;
{ La méthode Fade calcule la couleur d'un cara ctère par rapport à sa distance
avec le caractère brillant. }

function FadeComposite(const Level: Byte): Byte;
{ On diminue la luminosité d'une composante à la fois }
begin
{ La méthode de calcul est calibrée au pif. On peut s'essayer à diverses
techniques ici }
result:= Max(Level - 10 * ADistance, 0);
end;

begin
{ Si distance = 0 c'est que nous sommes sur le caractère brillant }
if ADistance = 0 then
result:= clWhite
else
begin
{ Pour éviter que la ligne entière ne disparaisse quand le caractère brillant
arrive en bas de l'écran }
if ADistance < 0 then
ADistance:= FCharsPerColumn + ADistance;

{ Appel de FadeComposite pour chaque composante de la couleur }
result:= RGB(FadeComposite(GetRValue(AColor)),
FadeComposite(GetGValue(AColor)),
FadeComposite(GetBValue(AColor)));
end;
end;

procedure TMainForm.Idle(Sender: TObject; var Done: Boolean);
{ Notre méthode principale. Celle-ci est déclenchée en permanence. }
var
t, frameLength: DWORD;
begin
{ Mettre Done à false permet que la méthode soit appelée tout le temps.
Sinon, elle n'est déclenchée que lorsque l'application n'a plus rien à
faire. Dans notre cas, elle va avoir du travail! }
Done:= false;

t:= GetTickCount; // On récupère un top temporel
MoveChars; // On calcule les couleurs de chaque caractère
Draw(self.Canvas); // On dessine la matrice

frameLength:= GetTickCount - t; // On calcule le temps qui s'est écoulé
if frameLength < MinFrameLength then // S'il est inférieur au minimum choisi,
Sleep(MinFrameLength - frameLength); // on attend le reste de la durée
end;

procedure TMainForm.MoveChars;
{ Calcul des couleurs pour chaque caractère }
var
i, j: Integer;
begin
for i:= 0 to FCharsPerRow - 1 do
begin
{ L'utilisation de mod nous permet de boucler sur la colonne }
FBrightChars[i]:= (FBrightChars[i] + 1) mod FCharsPerColumn;
for j:=0 to FCharsPerColumn - 1 do
FChars[i][j].Color:= Fade(BrightColor, FBrightChars[i] - j);
end;
end;

procedure TMainForm.ResizeAll;
{ Cette méthode redimensionne le buffer et les tableaux en fonction de la
taille de la fenêtre. }
var
i, j: Integer;
begin
{ Taille de la zone cliente de la fenêtre }
FBuffer.Width:= ClientWidth;
FBuffer.height:= ClientHeight;

{ On peint le buffer en noir }
DrawBackground;

{ On calcule les dimensions de la matrice }
FCharsPerColumn:= ClientHeight div FCharHeight;
FCharsPerRow:= ClientWidth div FCharWidth;

{ On dimensionne les tableaux en fonction }
SetLength(FChars, FCharsPerRow);
SetLength(FBrightChars, FCharsPerRow);
for i:=0 to High(FChars) do
begin
SetLength(FChars[i], FCharsPerColumn);
{ On profite de la boucle pour initialiser les caractères }
for j:=0 to High(FChars[i]) do
begin
FChars[i][j].Character:= Chr(Random(127-48) + 18); {127 à la place de 255 pour s'adapter à la police}
FChars[i][j].Color:= clBlack; {un peu plus de vitesse aussi}
end;
end;

{ Choix de la position de chaque caractère brillant }
ChooseVisibleChars;
end;

procedure TMainForm.FormResize(Sender: TObject);
begin
ResizeAll;
end;

procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
Close;
end;

procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Close;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
rgn : hrgn;
begin
{Changement de forme du Memo en cercle}
with MainForm.Memo1 do begin
rgn:=CreateEllipticRgn(0,0,width,height);
SetWindowRgn(handle, rgn, true);
end;
end;

end.



Cette discussion est classé dans : end, caractère, procedure, begin, fbuffer


Répondre à ce message

Sujets en rapport avec ce message

Hints dans une DLL [ par almi ] J'ai une fenêtre (TForm) qui fonctionne parfaitement dans mon executable.Si je la place dans une DLL, j'obtiens le message :Ne peut assigner TFont à T Problème Econversion Error lors de l'affichage d'une info bulle dans une fenetre MDIChild dans une DLL [ par DarkSky ] Salut a tous,j'ai créer un projet MDI avec Delphi 6 donc les fenetre MDi Filles sont dans une DLL.j'ai une erreur EConversionError a la place de l'aff pb d'affichage d'un TChart [ par Pegase20 ] bonjour, J'affiche une autre fiche qui contient un graphique (créé à l'aide d'un TChart) quand je clique sur un bouton.Mon pb c'est que le graph ne MDI Filles dans une DLL [ par DarkSky ] ..::= DarkSky =::..Salut almi,j'ai exactement le même problème que toi (Hint) sur l'utilisation de MDI Filles dans une DL Probleme lecture/ecriture dans fichier. [ par Cybric ] Bonsoir.Je débute avec DELPHI, donc novice.Je recopie tel quel le code de lecture de fichier trouvé dans "tout en poche" et cela ne fonctionne pas. Le projet de chat avec delphi 7 [ par dk ] hello every body j'aimerais faire un chat mais voila le probleme (si on peut dire) c ke g delphi 7 avec comme composant installer Tcpserver et Tcpclie plein derreur a la fermeture de mon prog qui font lanter windows [ par dk ] voila javais deja eu qq petits soucis avec le prjet de chat que je suis en train de realiser mais jamais a cette ampleur lol, qd je lance mon prog ca Aide pour appelé des procédures [ par prevok ] Lorsque je démarre le programme, pas de problème, je peux aller choisir dans le menu l'option que je veux, qui appelle une procedure, mais quand de ce Reutiliser une procedure [ par jimmy69 ] Bonjour a tous,Voila je debute avec delphi et je suis un peu fade :-) !!!!J'aimerais savoir s'il etait possible de reutiliser une procedure recement d Creation d'un chat [ par kitana ] bonjour, je fais un chat pour mon exam de lundi :s à partir d'un exemple d'un livre de delphi et je n'arrive pas à faire la partie deconnexion : je


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,31 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.