j'envoie les images sur le site ( par "envoi d'images" a gauche de la fenêtre d'écriture )
quand le site a reçu mes images le nom de celle-ci s'affiche a la place de sa miniature . pourquoi ?
bug ? problème lier a mon navigateur ? la mise a jours d'adobe que j'ai fait ce matin ? ( ca ne marche plus depuis ce matin )
édit : voila ce que je suis arrivé a faire
il y a 12 .exe
plasma version 1.exe est le plus vieux et plasma version 12.exe est le plus récent plasma_2.rar
mais je ne comprend pas trop le système de la palette ( même avec tes explications )
"Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
Pour le cycle de palette.
Il faut travailler avec des surfaces avec une profondeur de 8bpp.
Tu vas devoir créer un palette de 256 couleurs cyclique par le moyen que tu veux(HSV, sin, etc...).
Partant de là tu affiches une forme quelconque(à l'aide des fonctions que tu connais maintenant), et c'est fini.
A chaque frame tu fais évoluer ta palette, tu ne fais plus d'affichage.
Une fois que tu à fais quelques plasmas simples sympas, tu peux combiner avec les plasmas que tu as déjà fait.
Une petite remarque, tes plasmas sont très statiques.
Tu peux maintenant, plutôt qu'utiliser une table de sinus, précalculer pour chaque x et y.
Tu utilisent plusieurs buffers avec des dimensions 2 fois supérieures à celle de ton écran. Tu précalcules pour chaque pixel de ton buffer à l'aide de fonctions de ton choix.
Au moment de l'affichage, tu affiches tes buffers en leur appliquant un petit décalage sur chaque axe.
J'ai posté plusieurs plasmas qui utilisent ce principe, tu peux commencer par regarder.
édit : il est super ton topic !!!
on change un ou 2 truc a la fonction et hop ca change tout a l'écran
je vient de me faire des carré de couleurs
avec cette fonction
Ce n'est pas vraiment, un effet de palette, puisque qu'à chaque frame, tu actulises l'écran en écrivant des pixels. En fait, tu utilises la même technique qu'avant mais avec une fonction.
Le princicpe du plasma, c'est de combiner le résultat de plusieurs fonctions.
Hum, ce serait sympa, que tu colles tout dans un main.c.
Qu'on puisse tester en faisant simplement copier coller.
edit: merci pour le topic, il aura fallu attendre presque un an pour intéresser quelqu'un.
Tu utilises un index de couleurs, ça revient à utiliser une palette, sauf que...
Avec une vraie palette indexée, tu affiches 1 fois, et c'est fini. Ensuite tu te contentes de faire évoluer la palette.
Un exemple simple en HSV
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <math.h>
#define TICK_INTERVAL 20
/* Retourne le nombre de millisecondes à attendre avant le prochain frame */
Uint32 time_left(Uint32 nextTime)
{
Uint32 now = SDL_GetTicks();
return nextTime <= now ? 0 : nextTime - now;
}
/* Go wikipédia */
SDL_Color HSVtoRGB(Uint8 hi, Uint8 si, Uint8 vi)
{
SDL_Color ret;
double r, g, b, h, s, v;
h = hi / 256.0;
s = si / 256.0;
v = vi / 256.0;
if(s == 0)
r = g = b = v;
else
{
double f, p, q, t;
int i;
h *= 6;
i = floor(h);
f = h - i;
p = v * (1 - s);
q = v * (1 - (s * f));
t = v * (1 - (s * (1 - f)));
switch(i)
{
case 0: r = v; g = t; b = p; break;
case 1: r = q; g = v; b = p; break;
case 2: r = p; g = v; b = t; break;
case 3: r = p; g = q; b = v; break;
case 4: r = t; g = p; b = v; break;
case 5: r = v; g = p; b = q; break;
}
}
ret.r = r * 255.0;
ret.g = g * 255.0;
ret.b = b * 255.0;
return ret;
}
/* On affiche une fois pour toute */
void init(void)
{
int x, y;
SDL_Surface *s = SDL_GetVideoSurface();
int yc = s->h / 2;
int xc = s->w / 2;
for ( y = 0 ; y < s->h; y++ )
{
Uint8 *offset = (Uint8 *)s->pixels + y * s->pitch;
for ( x = 0 ; x < s->w; x++ )
{
offset[x] = 128 + 127.0 * sin(sqrt((x - xc) * (x - xc) + (y - yc) * (y - yc)) / 64.0);
}
}
}
/* On fait évoluer notre palette de 256 couleurs */
void setPalette(int p)
{
SDL_Surface *s = SDL_GetVideoSurface();
SDL_Color colors[256];
int i;
for (i = 0; i < 256; i++)
{
/* on fait varier le hue(teinte) */
colors[i] = HSVtoRGB((i + p) % 256, 255, 255);
}
SDL_SetColors(s, colors, 0, 256);
}
int main ( int argc, char** argv )
{
Uint32 nextTime;
Uint8 periode;
SDL_Surface *ecran = NULL ;
if (SDL_Init(SDL_INIT_VIDEO) == -1)
{
fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
ecran = SDL_SetVideoMode(800, 600, 8, SDL_SWSURFACE | SDL_HWPALETTE );
if (ecran == NULL)
{
fprintf(stderr, "erreur pas d'eran charge %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
init();
nextTime = SDL_GetTicks() + TICK_INTERVAL;
periode = 0;
while ( !SDL_QuitRequested() )
{
SDL_PumpEvents();
setPalette(periode);
SDL_Delay(time_left(nextTime));
nextTime += TICK_INTERVAL;
/* Même pas obligatoire ici */
SDL_Flip(ecran);
periode++;
}
SDL_Quit();
return EXIT_SUCCESS;
}
C'est volontairement simple, pour que tu vois l'essentiel.
A toi d'ajouter des fonctions mathématiques dans init().
Quelques remarques.
Dans tes codes, la gestion d'events, c'est overkill pour ce qu'on fait ici.
Tu moulines dans le vide, en attendant le bon moment pour afficher. Mieux vaut utiliser un SDL_Delay, pour éviter les 100% d'usage CPU.
Les flags SDL_HWSURFACE | SDL_DOUBLEBUF, sont inutiles. Au pire, si vraiment tu arrivais à avoir une surface en mémoire vidéo, tes codes ne fonctionneraient pas, il faudrait locker, accèder aux pixels puis délocker.
J'éspère que ce sera plus clair cette question de palette.
il y a un truc que je ne saisit pas ( qui me semble illogique ) comment peut t'on afficher une seule fois et avoir une animation
de plus c'est quoi :
- SDL_HWPALETTE
- SDL_PumpEvents()
merci pour ce merveilleux topic mais je pence que le niveau devient un peut trop élevé pour moi
il m'a permis de :
- mieux connaitre les "double" leurs utilisation et leurs utilités
- d'avoir une utilisation concrète de la bibliothèque mathématique
- de connaitre la gestion des pixels
une dernière chose
*( Uint32 * )( offset + ( i << 2 ) ) = sintable[ variable[0] % 1536 ];
// ceci permet de colorer un pixel ...
couleur = *( Uint32 * )( offset + ( i << 2 ) ) ;
// ... mais a t'on le droit d'écrire ceci pour récupérer la couleur d'un pixel ?
je pence que je vais m'arrêter là avec les effet plasma
n!co69
"Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
il y a un truc que je ne saisit pas ( qui me semble illogique ) comment peut t'on afficher une seule fois et avoir une animation
et bien avec une palette indexée(8 bits quoi), chaque pixel de ton écran à une valeur entre 0 et 255.
Cette valeur représente l'index dans un tableau si tu veux. En faisant varier les couleurs correspondant à ces indexs tu obtiens une animation à moindre frais.
Citation : n!co69
une dernière chose
Oui, c'est correct(sauf erreur. :-°). Tu as un setPixel et getPixel 32 bits!
Consulte la doc SDL(ainsi que les exemples), tu devrais trouver pas mal de réponses.
Seulement, on n'a toujours pas le rendu que font certains programmes
Peut-être utiliser des types de modifications précalculés (ou pas) et les mettre en place automatiquement (éventuellement aléatoirement). Par exemple, faire une sorte d'explosion à tel endroit.
Le tout est de faire pour que ces modifications fassent vraiment l'effet souhaité.
Je verrais par exemple un post-effet qui, en un point, fasse un cercle de plus en plus grand qui "repousse" les couleurs rencontrées. Après, il faut trouver un moyen simple de le créer. Il faudrait aussi prendre certains coefficients pas forcément évidents à calculer parce que les lignes ne vont pas forcément se trouver sur des pixels entiers.
Sinon, on peut essayer de remplir au début avec des fonctions et faire ensuite une série de modifications comme ça.
J'en ai déjà proposé un et c'est ce qui mélange le mieux les couleurs (d'après ce que tu as dit ).
Je vais voir si je ne peux pas essayer la technique à laquelle j'ai pensée mais elle me semble très gourmande.
Je ne l'avais pas prise comme une agression. Inclure une fonction de chaleur pourrait peut-être être utile pour la luminosité. Je vais voir ce que je peux tirer des équations. Le problème après, c'est que le plasma peut être à de nombreuses températures. Il faudrait voir pour donner des points critiques.
Sinon, essayer d'utiliser des calculs vectoriels pour un déplacement (en utilisant les shaders par exemple). En effet, le plasma n'est pas solide (puisque ce sont 2 états de la matière différents )
Sur mon ordinausore, ça rame. Je me suis demandé pourquoi.
Pour chaque pixel tu utilises des fonctions mathématiques(sin) plusieurs fois, et tu appelles la fonction setPixel.
Pour accélérer on pourrait précalculer une table sinus, et placer le setPixel dans le corps de la boucle.
Mais c'est inutile...
Tes plasmas sont statiques(ce sont toujours les mêmes d'un frame à l'autre).
Donc pas besoin de tracer à chaque frame. Tu affiches ton plasma, une première fois en dehors de la boucle principale, et c'est fini. Le cycle de couleur s'occupe du reste.
Pour un effet plus intéressant, tu conserves la même technique que celle que tu utilises déjà, mais par contre tu appliques un décalage à chaque fonction par rapport au frame courant.
edit:
Je n'avais pas vu le post de magma.
Bon, on a un peu de retard, le source date de 1998. Comme il n'y a pas de gestion de fps, et avec une résolution de 320 * 200 en 8bpp, ça va beaucoup trop vite sur une machine moderne(même la mienne).
Sinon, même technique que présentée ici, utilisation de buffer précalculés, etc...
edit2:
Je me suis permis de coller les plasmas de Yannshu dans un seul fichier .c.
Pour passer d'un plasma à l'autre, il suffit d'appuyer sur la touche espace.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.