Command out of place (loop) + Détéction multi-collisions.

Mr-Blonde Message lu Posté le 09 Fév 2009 à 19:39 Bulle
Avatar de Mr-Blonde
Explorateur

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 :wink:
Dernière édition le 10 Fév 2009 à 11:15
Syltech Message lu Posté le 09 Fév 2009 à 20:43 Bulle
Avatar de Syltech
Membre Confirmé

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! :grin:

Syltech :wink:

Dernière édition le 09 Fév 2009 à 21:03
Image
Darktib Message lu Posté le 09 Fév 2009 à 21:07 Bulle
Avatar de Darktib
Membre Ultime

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

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 :smile:
Image
Mr-Blonde Message lu Posté le 10 Fév 2009 à 11:14 Bulle
Avatar de Mr-Blonde
Explorateur

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 :
Spoiler - Cliquez pour afficher

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 :wink:
Mod Message lu Posté le 10 Fév 2009 à 11:55 Bulle
Avatar de Mod
Webmaster

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 Message lu Posté le 10 Fév 2009 à 15:19 Bulle
Avatar de Mr-Blonde
Explorateur

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é :proud:

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 Message lu Posté le 10 Fév 2009 à 15:42 Bulle
Avatar de corwin
Membre Confirmé

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 Message lu Posté le 10 Fév 2009 à 15:47 Bulle
Avatar de Mr-Blonde
Explorateur

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 Message lu Posté le 10 Fév 2009 à 16:07 Bulle
Avatar de corwin
Membre Confirmé

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 Message lu Posté le 10 Fév 2009 à 16:40 Bulle
Avatar de Darktib
Membre Ultime

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:
Spoiler - Cliquez pour afficher
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 Message lu Posté le 10 Fév 2009 à 20:19 Bulle
Avatar de Mr-Blonde
Explorateur

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 :
Spoiler - Cliquez pour afficher

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 :embarassed:
Dernière édition le 10 Fév 2009 à 20:20
Mod Message lu Posté le 10 Fév 2009 à 20:24 Bulle
Avatar de Mod
Webmaster

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 ;).
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0689 secondes