|
Mr-Blonde
|
Posté le 09 Fév 2009 à 19:39
|
|

Messages : 140
GCPoints : 6102
|
Bonjour à tous,
Je ne suis pas très expérimenté niveau Dark Basic Pro donc je viens vous demander un peu d'aide...
Mon petit problème met en cause l'utilisation de la commande Set Sprite Diffuse.
Pour la démo d'un jeu que je suis en train de coder, je voudrais que quand le joueur passe son curseur au dessus d'un sprite, ce dernier "change de couleur".
Donc pas de problème, je vérifie les positions du curseur et du sprite puis "Set Sprite Diffuse 5,0,0,255".
Ce n'est pas compliqué, ça marche, mais ce n'est pas très beau.
En effet, le sprite change de couleur instantanément, peut-on arriver à un résultat graduel ?
Merci d'avance à tous
Dernière édition le 10 Fév 2009 à 11:15
|
|
Syltech
|
Posté le 09 Fév 2009 à 20:43
|
|

Messages : 282
GCPoints : 71266
|
Salut !
Voici un petit exemple :
Code :
sync on
sync rate 60
bouton_taille_x=100
bouton_taille_y=20
box 0,0,bouton_taille_x,bouton_taille_y
get image 1,0,0,bouton_taille_x,bouton_taille_y,1
do
msx=mousex()
msy=mousey()
rem affichage du bouton
sprite 1,320-bouton_taille_x/2,240-bouton_taille_y/2,1
rem on vérifie si le curseur touche le bouton
hit=box_hit(msx,msy,320-bouton_taille_x/2,240-bouton_taille_y/2,320+bouton_taille_x/2,240+bouton_taille_y/2)
rem si le curseur est sur le bouton, la couleur du bouton va vers le bleu
if hit=1
bleu=bleu+4
if bleu>255 : bleu=255 : endif
else rem sinon la couleur du bouton va vers le noir
bleu=bleu-4
if bleu<0 : bleu=0 : endif
endif
rem on applique la valeur de bleu, avec set sprite diffuse
set sprite diffuse 1,0,0,bleu
print hit
sync
cls rgb(127,127,127)
loop
function box_hit(msx as integer, msy as integer, x1 as integer, y1 as integer, x2 as integer, y2 as integer)
if msx<x1 : exitfunction 0 : endif
if msy<y1 : exitfunction 0 : endif
if msx>x2 : exitfunction 0 : endif
if msy>y2 : exitfunction 0 : endif
endfunction 1
J'incrémente la variable "bleu" de 4 si le curseur est sur le bouton, sinon je lui soustrait 4.
C'est tout simple!
Syltech
Dernière édition le 09 Fév 2009 à 21:03
|
|
Darktib
|
Posté le 09 Fév 2009 à 21:07
|
|

Messages : 4017
GCPoints : 347288
|
Essaye aussi curve value, ca rend de tres bons résultats
|
|
Syltech
|
Posté le 09 Fév 2009 à 22:50
|
|

Messages : 282
GCPoints : 71266
|
Exact ça rend mieux avec la commande "Curvevalue", remplace :
Code :
if hit=1
bleu=bleu+4
if bleu>255 : bleu=255 : endif
else rem sinon la couleur du bouton va vers le noir
bleu=bleu-4
if bleu<0 : bleu=0 : endif
endif
par :
Code :
if hit=1
bleu=curvevalue(255,bleu,12)
else rem sinon la couleur du bouton va vers le noir
bleu=curvevalue(0,bleu,12)
endif
par exemple ^^
Syltech
|
|
Mr-Blonde
|
Posté le 10 Fév 2009 à 11:14
|
|

Messages : 140
GCPoints : 6102
|
Merci pour vos réponses.
J'ai codé quelque chose qui me convenait très bien avec Set Sprite Diffuse, j'essairai plus tard avec CurveValue, une fois que j'aurai résolu ce problème.
Voici mon code complet :
set display mode 1024,768,32
Hide Mouse
load image "Fond.bmp",1
Paste Image 1,0,0
load image "Fenetre.png",2
Paste Image 2,0,512
rem Le Ninja
load image "Personnages/Ninja.png", 3
Sprite 1,140,110,3
ForceNinja=2 rem Force du Ninja Moyenne
ResistanceNinja=1 rem Resistance du Ninja Faible
AgiliteNinja=4 rem Agilité du Ninja Excellente
PerceptionNinja=3 rem Perception du Ninja Bonne
rem L'Epeiste
load image "Personnages/Epeiste.png", 4
Sprite 2,90,200,4
ForceEpeiste=2 rem Force Moyenne
ResistanceEpeiste=4 rem Resistance Excellente
AgiliteEpeiste=3 rem Agilité Bonne
PerceptionEpeiste=1 rem Perception Faible
rem Le Soldat
load image "Personnages/Soldat.png", 5
Sprite 3,10,300,5
ForceSoldat=4 rem Force Excellente
ResistanceSoldat=2 rem Resistance Moyenne
AgiliteSoldat=1 rem Agilité Faible
PerceptionSoldat=3 rem Perception Bonne
rem Le Mercenaire
load image "Personnages/Mercenaire.png", 6
Sprite 4,690,200,6
ForceMercenaire=3 rem Force Bonne
ResistanceMercenaire=4 rem Resistance Excellente
AgiliteMercenaire=1 rem Agilité Faible
PerceptionMercenaire=2 rem Perception Moyenne
rem Le Bandit
load image "Personnages/Bandit.png", 7
Sprite 5,730,300,7
ForceBandit=1 rem Force Faible
ResistanceBandit=3 rem Resistance Bonne
AgiliteBandit=2 rem Agilité Moyenne
PerceptionBandit=4 rem Perception Excellente
Load Image "Curseur.png",8
Curseur=10
Sprite Curseur,mousex(),mousey(),8
Scale Sprite Curseur, 150
do
cls
Paste Image 1,0,0
Paste Image 2,0,512
print "Pressez ECHAP pour Quitter"
print "mouse position x "+str$(mousex())
print "mouse position y "+str$(mousey())
print ColCurseurNinja
print ColCurseurEpeiste
print ColCurseurSoldat
print ColCurseurMercenaire
print ColCurseurBandit
ColCurseurNinja=Sprite Collision(Curseur,1)
ColCurseurEpeiste=Sprite Collision(Curseur,2)
ColCurseurSoldat=Sprite Collision(Curseur,3)
ColCurseurMercenaire=Sprite Collision(Curseur,4)
ColCurseurBandit=Sprite Collision(Curseur,5)
rem Detection Collision Curseur/Bandit
if ColCurseurNinja=1
personnage=1
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurEpeiste=1
personnage=2
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurSoldat=1
personnage=3
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurMercenaire=1
personnage=4
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurBandit=1
personnage=5
GOSUB _Coloration
Sprite Curseur,mousex(),mousey(),8
loop
_Coloration:
bleu=bleu+2
rouge=rouge-2
vert=vert-2
if bleu>255 : bleu=255 : endif
If vert<0 : vert=0 : endif
If rouge<0 : rouge=0 : endif
else
bleu=bleu+2
rouge=rouge+2
vert=vert+2
If bleu>255 : bleu=255 : endif
If vert>255 : vert=255 : endif
If rouge>255 : rouge=255 : endif
endif
Set Sprite Diffuse personnage,rouge,vert,bleu
RETURN
Lorsque j'essaye de tester le programme, DBpro me retourne ce message d'erreur : "Command out of place at line 98", la commande en question étant "loop".
Comment résoudre ce problème ?
Ensuite j'aimerai résoudre autre chose :
Il y a 5 sprites de personnages sur l'aire de jeu, sachant que certains se chevauchent, en détectant les collisions, il peut arriver que plusieurs Sprites soient sélectionnés.
J'aimerai faire en sorte que si plusieurs Sprites sont en collision avec le curseur, aucun ne soient séléctionnés.
J'ai pensé à créer une variable qui soit augmentée de 1 à chaque collisions puis une condition qui annule toute les collisions si cette variable est supérieure à 1, mais dans la pratique je m'emmêle un peu les pinceaux pour arriver à déterminer si actuellement tel ou tel sprite est en collision ou pas...
Enfin, voila merci d'avance à tous
|
|
Mod
|
Posté le 10 Fév 2009 à 11:55
|
|

Messages : 4954
GCPoints : 2100823
|
Pour le problème d'out of place, aucune de ces conditions-ci ne sont fermées, il manque à chaque fois le endif :
Code :
rem Detection Collision Curseur/Bandit
if ColCurseurNinja=1
personnage=1
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurEpeiste=1
personnage=2
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurSoldat=1
personnage=3
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurMercenaire=1
personnage=4
GOSUB _Coloration
rem Detection Collision Curseur/Bandit
if ColCurseurBandit=1
personnage=5
GOSUB _Coloration
Pour les collisisions, ce que tu peux faire, c'est quelque chose de ce genre là :
Citation :Col = ColCurseurNinja + ColCurseurEpeiste + ColCurseurSoldat + ColCurseurMercenaire + ColCurseurBandit
Chaque ColCurseurXXX ne peut contenir que 1 ou 0, donc si Col est supérieur à 1, cela signifie que tu as plusieurs collisions. Tu peux ensuite remettre toutes les variables à 0, ou autre chose selon tes besoins.
|
|
Mr-Blonde
|
Posté le 10 Fév 2009 à 15:19
|
|

Messages : 140
GCPoints : 6102
|
Ah mais quel con je fusse, j'avais même pas remarqué ça.
Faut m'excuser, ça fait longtemps que je n'ai pas programmé
Enfin bref, en grand débutant que je suis, un problème en engendre un autre, maintenant ce n'est plus mon loop qui est mal placé mais mon else...
Citation :
If rouge<0 : rouge=0 : endif
else
bleu=bleu+2
J'ai tout essayé, une condition qui ne lance le gosub que si il y a collision via la variable Col, du système D à mort, mais rien n'y fait, ça ne marche jamais.
Dois-je adopter la méthode archaïque du copier/coller ?
Ou existe-il un moyen permettant de garder un code propre ?
Merci d'avance, et excusez moi pour ce florilège de questions noobiennes.
|
|
corwin
|
Posté le 10 Fév 2009 à 15:42
|
|

Messages : 459
GCPoints : 63647
|
Code :
If rouge<0
rouge=0
else
bleu=bleu+2
endif
aufaite le "else" doit êtres avant le "endif"
|
|
Mr-Blonde
|
Posté le 10 Fév 2009 à 15:47
|
|

Messages : 140
GCPoints : 6102
|
Mais regarde le code complet, ce n'est pas si simple.
Le else ne se refère pas à ce If là mais à un If se trouvant avant le "GOSUB _Coloration", il est donc normal que j'eusse placé un Endif avant le Else.
|
|
corwin
|
Posté le 10 Fév 2009 à 16:07
|
|

Messages : 459
GCPoints : 63647
|
bon ba voila j'ai bricoller fite fait quelque chose :
Code :
set display mode 1024,768,32
Hide Mouse
load image "Fond.bmp",1
Paste Image 1,0,0
load image "Fenetre.png",2
Paste Image 2,0,512
rem Le Ninja
load image "Personnages/Ninja.png", 3
Sprite 1,140,110,3
ForceNinja=2 rem Force du Ninja Moyenne
ResistanceNinja=1 rem Resistance du Ninja Faible
AgiliteNinja=4 rem Agilité du Ninja Excellente
PerceptionNinja=3 rem Perception du Ninja Bonne
rem L'Epeiste
load image "Personnages/Epeiste.png", 4
Sprite 2,90,200,4
ForceEpeiste=2 rem Force Moyenne
ResistanceEpeiste=4 rem Resistance Excellente
AgiliteEpeiste=3 rem Agilité Bonne
PerceptionEpeiste=1 rem Perception Faible
rem Le Soldat
load image "Personnages/Soldat.png", 5
Sprite 3,10,300,5
ForceSoldat=4 rem Force Excellente
ResistanceSoldat=2 rem Resistance Moyenne
AgiliteSoldat=1 rem Agilité Faible
PerceptionSoldat=3 rem Perception Bonne
rem Le Mercenaire
load image "Personnages/Mercenaire.png", 6
Sprite 4,690,200,6
ForceMercenaire=3 rem Force Bonne
ResistanceMercenaire=4 rem Resistance Excellente
AgiliteMercenaire=1 rem Agilité Faible
PerceptionMercenaire=2 rem Perception Moyenne
rem Le Bandit
load image "Personnages/Bandit.png", 7
Sprite 5,730,300,7
ForceBandit=1 rem Force Faible
ResistanceBandit=3 rem Resistance Bonne
AgiliteBandit=2 rem Agilité Moyenne
PerceptionBandit=4 rem Perception Excellente
Load Image "Curseur.png",8
Curseur=10
Sprite Curseur,mousex(),mousey(),8
Scale Sprite Curseur, 150
do
cls
Paste Image 1,0,0
Paste Image 2,0,512
print "Pressez ECHAP pour Quitter"
print "mouse position x "+str$(mousex())
print "mouse position y "+str$(mousey())
print ColCurseurNinja
print ColCurseurEpeiste
print ColCurseurSoldat
print ColCurseurMercenaire
print ColCurseurBandit
ColCurseurNinja=Sprite Collision(Curseur,1)
ColCurseurEpeiste=Sprite Collision(Curseur,2)
ColCurseurSoldat=Sprite Collision(Curseur,3)
ColCurseurMercenaire=Sprite Collision(Curseur,4)
ColCurseurBandit=Sprite Collision(Curseur,5)
rem Detection Collision Curseur/Bandit
if ColCurseurNinja=1
personnage=1
col=1
else
col=0
endif
rem Detection Collision Curseur/Bandit
if ColCurseurEpeiste=1
personnage=2
col=1
else
col=0
endif
rem Detection Collision Curseur/Bandit
if ColCurseurSoldat=1
personnage=3
col=1
else
col=0
endif
rem Detection Collision Curseur/Bandit
if ColCurseurMercenaire=1
personnage=4
col=1
else
col=0
endif
rem Detection Collision Curseur/Bandit
if ColCurseurBandit=1
personnage=5
col=1
else
col=0
endif
Sprite Curseur,mousex(),mousey(),8
rem Coloration
if col=1
bleu=bleu+2
rouge=rouge-2
vert=vert-2
if bleu>255 : bleu=255 : endif
If vert<0 : vert=0 : endif
If rouge<0 : rouge=0 : endif
endif
if col=0
bleu=bleu+2
rouge=rouge+2
vert=vert+2
If bleu>255 : bleu=255 : endif
If vert>255 : vert=255 : endif
If rouge>255 : rouge=255 : endif
Set Sprite Diffuse personnage,rouge,vert,bleu
endif
loop
si il y a une collision col=1 sinon col=0
si col=1 alors il change de couleur et si col=0 alors il redevient normale.
|
|
Darktib
|
Posté le 10 Fév 2009 à 16:40
|
|

Messages : 4017
GCPoints : 347288
|
Petits conseils: met ton code dans la balise 'code' (meme quand c'est dans un sppoiler), ca nous facilitera la tache...
Sinon l'iédal c'est d'ajouter des tablulations a chaque fois qu'il y a une condition, ca permet de mieux voir son code et donc de le débugguer plus facilement. Exemple:
Code : DarkBasic if condition
// faire qqch
else
// une autre condition pour lefun
if condition2
// autre chose
endif
endif
@Mod : a quand le coloration syntaxique pour darkbasic pro ?
|
|
Mr-Blonde
|
Posté le 10 Fév 2009 à 20:19
|
|

Messages : 140
GCPoints : 6102
|
Merci pour les conseils Darktib et merci pour le code Corwin, mais je ne sais pas pourquoi il ne marche pas correctement, donc j'ai préféré reprendre le codage sur une base personnelle.
Je suis arrivé à ça :
Code :
rem Detection Collision Curseur/Personnage
if Col=1
GOSUB _Coloration
else
GOSUB _Decoloration
ENDIF
Sprite Curseur,mousex(),mousey(),8
loop
_Decoloration:
if Lcol>0
personnage=Lcol
else
personnage=10
Endif
bleu=bleu+2
rouge=rouge+2
vert=vert+2
If bleu>255 : bleu=255 : endif
If vert>255 : vert=255 : endif
If rouge>255 : rouge=255 : endif
Set Sprite Diffuse personnage,rouge,vert,bleu
RETURN
_Coloration:
if ColCurseurNinja=1
personnage=1
Lcol=1
endif
if ColCurseurEpeiste=1
personnage=2
Lcol=2
endif
if ColCurseurSoldat=1
personnage=3
Lcol=3
endif
if ColCurseurMercenaire=1
personnage=4
Lcol=4
endif
if ColCurseurBandit=1
personnage=5
Lcol=5
endif
bleu=bleu+2
rouge=rouge-2
vert=vert-2
if bleu>255 : bleu=255 : endif
If vert<0 : vert=0 : endif
If rouge<0 : rouge=0 : endif
Set Sprite Diffuse personnage,rouge,vert,bleu
RETURN
Et ça marche
Dernière édition le 10 Fév 2009 à 20:20
|
|
Mod
|
Posté le 10 Fév 2009 à 20:24
|
|

Messages : 4954
GCPoints : 2100823
|
Citation :@Mod : a quand le coloration syntaxique pour darkbasic pro ?
Il faudrait voir à quoi ressemble le contenu d'un fichier de coloration syntaxique Geshi. Pour le moment j'ignore à quoi ça ressemble. C'est prévu que je m'y attelle, mais rien n'est arrêté niveau date pour le moment. Si tu te sens d'humeur à regarder à quoi ça peut ressembler, et que tu crées un fichier de ce genre pour le DBPro, je pourrai l'ajouter ;).
|