|
softreaver
|
Posté le 22 Jan 2009 à 22:51
|
|

Messages : 89
GCPoints : 23521
|
Bonsoir à tous,
Vous connaissez un moyen de changer la couleur de transparence utilisée par les matrices?
Merci de vos réponses.
Dernière édition le 22 Jan 2009 à 22:56
|
|
Syltech
|
Posté le 23 Jan 2009 à 00:59
|
|

Messages : 282
GCPoints : 71266
|
Salut!
Alors, je suis pas sur d'avoir bien compris ta question, tu veux changer le niveau de transparence de ta matrice c'est ça?(autrement dit la valeur Alpha qui gère la transparence)
Bon je connais pas trop les matrices avec Dark Basic, je n'en ai jamais eu l'utilité... Mais je pense pouvoir t'affirmer qu'il n'y a pas vraiment de commande pour ça, si ce n'est la commande Ghost matrix on qui ne gère que 4 modes de transparence...
Mais bon ta de la chance j'avais un peu de temps la, je t'ai programmé un peu petit truc qui va te permettre de faire ce que tu veux.
Tout d'abord il faut que tu saches que le seul moyen de modifier le niveau de transparence et de toucher à l'image de la matrice, autrement dit modifier ses valeurs de rouge, vert, bleu et alpha.
On a aussi besoin de la commande Ghost matrix on activée pour ça.
Petites information sur mon programme, les touches F1, F2, F3, F4 gère chacune un mode de transparence de la commande Ghost matrix on, la touche 1 modifie la valeur de rouge, la touche 2 modifie la valeur de vert, la touche 3 modifie la valeur de bleu et la touche 4 modifie la valeur alpha, cette dernière n'a d'effet que sur le mode 3 de la commande Ghost matrix on, autrement dit le mode que tu peux activé avec la touche F3.
Code :
set display mode 640,480,32,1
sync on
sync rate 0
make object cube 1,10
position object 1,25,0,25
color object 1,rgb(255,0,0)
get image 1,0,0,1,1,1
make memblock from image 1,1
width = memblock dword(1, 0)
height = memblock dword(1, 4)
depth = memblock dword(1, 8)
make matrix 1,50,50,10,10
prepare matrix texture 1,1,1,1
update matrix 1
do
msmx=mousemovex()
msmy=mousemovey()
msy=msy+msmy
msx=msx+msmx
rotate camera msy,msx,0
MOVE CAMERA UPKEY()-DOWNKEY()
angle=angle+1 : rotate object 1,angle,angle,angle
r=0 : g=0 : b=0 : a=0
if inkey$()="1" : r=1 : endif
if inkey$()="2" : g=1 : endif
if inkey$()="3" : b=1 : endif
if inkey$()="4" : a=1 : endif
for x = 1 to width
for y = 1 to height
adresse=12+((y-1)*width+x-1)*4
temp_b=memblock byte(1,adresse) : if temp_b=255 : temp_b=0 : endif
temp_g=memblock byte(1,adresse+1) : if temp_g=255 : temp_g=0 : endif
temp_r=memblock byte(1,adresse+2) : if temp_r=255 : temp_r=0 : endif
temp_a=memblock byte(1,adresse+3) : if temp_a=255 : temp_a=0 : endif
write memblock byte 1,adresse,temp_b+b
write memblock byte 1,adresse+1,temp_g+g
write memblock byte 1,adresse+2,temp_r+r
write memblock byte 1,adresse+3,temp_a+a
next y
next x
make image from memblock 1,1
prepare matrix texture 1,1,1,1
if keystate(59)=1 : ghost=1 : endif
if keystate(60)=1 : ghost=2 : endif
if keystate(61)=1 : ghost=3 : endif
if keystate(62)=1 : ghost=4 : endif
ghost matrix on 1,ghost
update matrix 1
text 0,0,str$(screen fps())
sync
loop
J'espère que tu comprend un minimum les memblocks, il n'y a que ça de complexe.
Tu peux aussi déplacer la camera à l'aide la souris et des flèches directionnel.
Voilou, si tu as des questions, je ferais de mon mieux pour y répondre!
Syltech
Dernière édition le 23 Jan 2009 à 01:11
|
|
softreaver
|
Posté le 23 Jan 2009 à 11:27
|
|

Messages : 89
GCPoints : 23521
|
Je voulais savoir comment définir une couleur autre que le noir comme couleur à ne pas afficher quand on utilise la commande "SET MATRIX" et que l'on passe le paramètre "transparency" à 1
mais après lecture de l'aide de dbpro, se n'est pas possible apparemment, et se n'est pas bien dramatique, vue que je peut toujours changer mes médias images.
en tout cas merci de ta réponse syltech, et désolé pour ce topic qui n'est pas des plus pertinent, toute fois, si les modérateurs sentent l'envie de l'effacer, n'hésitez pas à le faire.
Kryss
|
|
Syltech
|
Posté le 23 Jan 2009 à 13:32
|
|

Messages : 282
GCPoints : 71266
|
aaah! J'avais pas compris ça! Et tu vois, je n'y ai même pas pensé au paramètre Transparency de la commande Set matrix...
J'ai essayé vite fait, mais en effet ce n'est pas possible...
Pour la suppression du post, pourquoi souhaite tu l'effacer? il y a toujours mon code qui est opérationnel et qui servira peut être à d'autres... Si tu n'avais pas posé la question peut être que je n'aurais jamais écris ce code.
Enfin c'est comme tu veux, au pire je le re-posterai en tant que code snippet!
En tout cas n'hésite pas si tu as d'autres questions!
Syltech
Edit 1: Enfaite j'ai une idée pour faire ce que tu veux, à partir de ce que je t'ai posté, j'essaie de te faire une fonction des que j'ai un peu de temps.
Edit 2: Bon j'ai déjà fait une première fonction, les variables rouge, vert et bleu en début de programme représentent la couleur que tu veux faire devenir transparente.
La seul façon de faire pour que ça fonctionne est de transformer la couleur voulu en noir(grâce aux memblocks), cette couleur en noir, deviendra transparente grâce au paramètre Transparency de la commande Set matrix.
Donc maintenant le problème principale est que tes images ne doivent pas comporter de noir à la base.
Et aussi, comme la fonction que j'ai créé modifie la couleur que tu veux en noir, l'image perdra la couleur que l'on voulait transparente pour toujours.
Il y a moyen tout de même de récupérer la couleur rendu noir en rechargeant l'image de départ(soit avec la commande Load image, soit avec les memblocks)... C'est le seul moyen!
Voici le code:
set display mode 640,480,32,1
sync on
sync rate 0
make object cube 1,10
position object 1,25,0,25
color object 1,rgb(255,0,0)
matrix_number=1 : image_number=1 : memblock_number=1
rouge=127 : vert=0 : bleu=34
ink rgb(0,0,255),0
box 0,0,128,128
ink rgb(rouge,vert,bleu),0
box 32,32,96,96
get image image_number,0,0,128,128,1
make matrix matrix_number,50,50,10,10
set_matrix_colorkey(matrix_number, image_number, memblock_number, rouge, vert, bleu)
prepare matrix texture matrix_number,image_number,1,1
update matrix matrix_number
do
msmx=mousemovex()
msmy=mousemovey()
msy=msy+msmy
msx=msx+msmx
rotate camera msy,msx,0
MOVE CAMERA UPKEY()-DOWNKEY()
angle=angle+1 : rotate object 1,angle,angle,angle
text 0,0,str$(screen fps())
sync
loop
function Set_matrix_colorkey(matrix_number as integer, image_number as integer, memblock_number as integer, rouge as byte, vert as byte, bleu as byte)
make memblock from image memblock_number,image_number
width = memblock dword(1, 0)
height = memblock dword(1, 4)
depth = memblock dword(1, 8)
for x = 1 to width
for y = 1 to height
adresse=12+((y-1)*width+x-1)*4
bleu_temp=memblock byte(memblock_number,adresse)
vert_temp=memblock byte(memblock_number,adresse+1)
rouge_temp=memblock byte(memblock_number,adresse+2)
if rouge_temp=rouge && vert_temp=vert && bleu_temp=bleu
write memblock byte memblock_number,adresse,0
write memblock byte memblock_number,adresse+1,0
write memblock byte memblock_number,adresse+2,0
write memblock byte memblock_number,adresse+3,0
endif
next y
next x
make image from memblock memblock_number,image_number
set matrix matrix_number,0,1,0,0,0,0,0
endfunction
Donc dans mon exemple je créé une image, et choisis la couleur que je veux transparente.
il te suffit toi de remplacer:
Code :
matrix_number=1 : image_number=1 : memblock_number=1
rouge=127 : vert=0 : bleu=34
ink rgb(0,0,255),0
box 0,0,128,128
ink rgb(rouge,vert,bleu),0
box 32,32,96,96
get image image_number,0,0,128,128,1
make matrix matrix_number,50,50,10,10
set_matrix_colorkey(matrix_number, image_number, memblock_number, rouge, vert, bleu)
par:
Code :
matrix_number=1 : image_number=1 : memblock_number=1
rouge=127 : vert=0 : bleu=34 rem la couleur que tu veux rendre transparente
Load image "Ton_image.bmp",image_number,1
make matrix matrix_number,...
set_matrix_colorkey(matrix_number, image_number, memblock_number, rouge, vert, bleu)
Voilou!
Et désolé pour la légère déformation du forum
Syltech
Dernière édition le 29 Jan 2009 à 10:06
|
|
Syltech
|
Posté le 29 Jan 2009 à 15:33
|
|

Messages : 282
GCPoints : 71266
|
Tu ne m'a pas dit, si ça t'avais aidé !
A moins que tu n'es pas vu mon message...
Que je sache si ça a été utile!
Syltech
|
|
softreaver
|
Posté le 29 Jan 2009 à 18:09
|
|

Messages : 89
GCPoints : 23521
|
désolé je n'avais pas vu les Edits
je vais essayer ça de suite et je te dit :)
[Edit]
Ouai ça fonctionne bien. Mais le truc c'est que j'ai déjà changé la seul image que j'utilise et je lui ai mis un fond noir.
Mais sinon c'est pas mal du tout le truc avec les même block, je pense que je vais voir de plus prés comment cela fonctionne
Dernière édition le 29 Jan 2009 à 18:15
|
|
Syltech
|
Posté le 29 Jan 2009 à 22:42
|
|

Messages : 282
GCPoints : 71266
|
Pour comprendre les memblock et pas "même block" pour des images par exemple, il te suffit de connaitre la structure d'un fichier bitmap ou comment chaque pixels sont stocké dans le fichier.
Quelques informations rapides :
- Le premier Dword qui correspond à une taille de 4 octets contient la largeur(le nombre de pixels en largeur) de l'image.
- Le second contient la hauteur(le nombre de pixels en hauteur), et le troisième la profondeur(qui vaut presque toujours 16).
Le début d'un bitmap est toujours structuré de cette façon...
- Ensuite vient le stockage de chaque pixels, pour chaque pixels, le premier octet correspond à la couleur bleu, le second à la couleur verte, le troisième à la couleur rouge et le quatrième à la valeur alpha.
Voilou on a fait le tour!
Syltech
Dernière édition le 29 Jan 2009 à 22:44
|
|
Darktib
|
Posté le 31 Jan 2009 à 13:15
|
|

Messages : 4017
GCPoints : 347288
|
Pour les matrices je te déconseille de les utiliser, elles sont vraiment tres lentes (sauf si tu veux beaucoup de facilité). Il y a quelques années j'avais fait un moteur de terrain avec les matrices, je chargeait le tout en moins de 800 ms et tournait a a peu pres250 fps, mais avec les mises a jour il me faut maintenant 2 secondes pour charger et le fps a chuté de 150...
Edit : un bon moteur de terrain : Advanced Terrain. Math89 a lui aussi fait un moteur de terrain avec les memblocks, il était tres puissant mais un peu plus lent qu'advanced terrain.
Dernière édition le 31 Jan 2009 à 13:16
|
|
Syltech
|
Posté le 31 Jan 2009 à 15:47
|
|

Messages : 282
GCPoints : 71266
|
Oui, Math89 avait fait un bon système de terrain je me rappel, je l'avais même amélioré un peu en rajoutant un tableau contenant la position d'arbres, selon la hauteur du terrain, j'avais fait ça pour un membre du forum de 3DGC, je ne me rappel plus de son pseudo, je me rappel surtout qu'il faisait des jeux assez gore :p
Enfin, en effet les matrices sont vraiment pas terribles, le système de terrain de Math89 est vraiment super, il permet de bien comprendre comment fonctionne les terrains.
Syltech
|
|
Darktib
|
Posté le 31 Jan 2009 à 17:01
|
|

Messages : 4017
GCPoints : 347288
|
Ca serait pas hivernaal le memebre en question ?
Ah, souvenirs souvenirs...
|
|
Syltech
|
Posté le 31 Jan 2009 à 17:18
|
|

Messages : 282
GCPoints : 71266
|
C'est bien lui ^^
Ça rappel beaucoup de chose en effet
Syltech
|