Tu peux télécharger une démo ici:
http://darkbasic.thegamecreators.com/?f=trial
Il remarche ce forum?
Car j´aurais de petites questions à poser moi aussi ;- )
Pas de soucis, en tout cas moi je suis là pour tenter de répondre à tes questions
Ok alors j´y vais ;)
J´ai fait deux simples boutons. Quand l´on en survole un avec le pointeur avec la souris, ils s´allume et emet un son, lorsque l´on appuie dessus, il execute une action.
Seul problème, quand l´on reste appuyé sur le bouton gauche de la souris et que l´on survole le bouton avec le pointeur, le bouton execute l´action. Or moi j´aimerais qu´il faut d´abord appuyer sur le bouton gauche de la souris puis le relacher pour pouvoir éxécuter l´action.
Autre chose aussi, lorsque je survole le bouton avec le pointeur de la souris (en appuyant sur aucun bouton), il emet le son du survol. Normal. Mais il est répété x fois par seconde ce qui n´est pas terrible. Je voudrais simplement qu´il se joue une fois lorsque je survole le bouton avec le pointeur de la souris.
J´éspère avoir été assez clair
Si vous avez besoin du code, aucun problème, dites-le moi
Le code pourrait aider, ça permettrait de corriger directement le problème.
En fait tes 2 problèmes sont liés. Cela vient du fait que mouseclick() renvoie 0 ou 1, 2, 3... si tu cliques ou non. Autrement dit, avec cette commande seule, il est impossible de déterminer à quel moment tu as cliqué la première fois ou relâcher la souris. Ceci entraine donc la répétition de ton code (son, bouton appuyé...).
Pour contourner cela, j´utilise deux variables disons : clic_precedent, clic_actuel... Donc comme le dit leur nom, je stocke le clic venant d´être effectué et le précédent clic. Avec ces deux valeurs, il est à tout moment possible de savoir si tu viens de cliquer ou si tu relâches en comparant l´ancien et le nouveau clic.
Par exemple pour un clic gauche (=1)
-> clic_precedent=0, clic_actuel=1 => je viens de cliquer
-> clic_precedent=1, clic_actuel=1 => le clic est maintenu
-> clic_precedent=1, clic_actuel=0 => je viens de relâcher le clic
De cette manière ton code ne sera exécuté qu´une
fois et au bon moment.
Bon, je vais donner le code ^^
rem rafraichissement d´écran
sync on
rem changement de résolution
set display mode 1280,1024,32
rem interdiction des touches systèmes
disable escapekey
disable systemkeys
load sound "menu005.wav",1
load sound "menu007.wav",2
load sound "menu002.wav",3
rem chargement des sprites
load bitmap "ok1.bmp",1 : get image 3,0,0,144,45,3 : delete bitmap 1
sprite 3,360,538,3
load bitmap "ok2.bmp",1 : get image 4,0,0,144,45,3 : delete bitmap 1
sprite 4,360,538,4 : hide sprite 4
load bitmap "annuler1.bmp",1 : get image 7,0,0,144,45,3 : delete bitmap 1
sprite 16,160,538,7
load bitmap "annuler2.bmp",1 : get image 8,0,0,144,45,3 : delete bitmap 1
sprite 17,160,538,8 : hide sprite 17
rem ***************
rem début de boucle
rem ***************
do
rem changement de l´affichage du bouton "ok"
if (sprite x(3)<=mousex()) and (mousex()<=sprite x(3)+sprite width(3)) and (sprite y(3)<=mousey()) and (mousey()<=sprite y(3)+sprite height(3))
hide sprite 3
show sprite 4
play sound 1
if mouseclick()=1
play sound 2
valeur=1
endif
else
hide sprite 4
show sprite 3
endif
rem si on clique sur "annuler", fin de prog.
if (sprite x(16)<=mousex()) and (mousex()<=sprite x(16)+sprite width(16)) and (sprite y(16)<=mousey()) and (mousey()<=sprite y(16)+sprite height(16))
hide sprite 16
show sprite 17
play sound 1
if mouseclick()=1
play sound 3
valeur=2
endif
else
hide sprite 17
show sprite 16
endif
rem *************
rem fin de boucle
rem *************
rem rafraichissement d´écran
sync
loop
Un p´tit
Pas de soucis, je modifie ton code dès que j´ai deux minutes...
Par contre, à première vue, je te conseillerai quelques modifications. Plutôt que d´utiliser deux sprites pour un bouton (un visible et un masqué) pour simuler le changement, j´utiliserai plutôt les sprites animés. Crée un sprite composé de tes 2 images en une seule, utilise ´create animated sprite´ et ensuite change la frame (set sprite frame) pour modifier l´affichage.
J´optimiserai le code quand il sera totalement fonctionnel, mais pour l´instant, je me concentre sur les petits problèmes.
Si tu veux les fichiers, demande-le moi.
En tout cas merci pour ton aide ^^
J´ai donc regardé ton code et fait quelques modifications. Il faudra que tu remettes les bonnes données concernant tes images (get image, sprite) car j´ai pris des images à moi.
Alors sur le fonctionnement :
- j´ai laissé tes deux boutons. Le premier est celui que j´ai modifié, le second est le tiens pour que tu vois la différence.
- ensuite plutôt que d´utiliser des sons, j´ai utiliser des variables comptabilisant le nombre de passages de la souris et de clics sur chaque bouton.
- tu peux donc dans cet exemple, cliquez sur mon bouton et tu remarques que un seul clic est comptabilisé (= une action) peu importe que tu laisses ou non ton clic appuyé.
- je t´ai mis la possibilité de le faire au moment du clic ou lorsque tu relâches le clic.
Si tu as des questions, hésite pas
sync on
`IMAGE 1 du bouton
load bitmap "image1.bmp",1
get image 3,0,0,100,50,3
delete bitmap 1
sprite 3,100,100,3
sprite 1,300,100,3
`IMAGE 2 DU BOUTON
load bitmap "image2.bmp",1
get image 4,0,0,100,50,3
delete bitmap 1
sprite 4,100,100,4
sprite 2,300,100,4
hide sprite 4
hide sprite 2
`VARIABLES : compteurs de clics et de passages de souris sur les boutons
compteur_passages1 as integer = 0
compteur_clics1 as integer = 0
compteur_passages2 as integer = 0
compteur_clics2 as integer = 0
`VARIABLES POUR GERER LES CLIC DE LA SOURIS
clic_precedent as integer =0
clic_actuel as integer=0
do
`AFFICHAGE DE COMTEURS
text 0,0,"Bouton 1 - Nombre de passages : "+Str$(compteur_passages1)
text 0,20,"Bouton 1 - Nombre de clics : "+Str$(compteur_clics1)
text 0,60,"Bouton 2 - Nombre de passages : "+Str$(compteur_passages2)
text 0,80,"Bouton 2 - Nombre de clics : "+Str$(compteur_clics2)
`BOUTON 1 : mes modifications
if (sprite x(3)<=mousex()) and (mousex()<=sprite x(3)+sprite width(3)) and (sprite y(3)<=mousey()) and (mousey()<=sprite y(3)+sprite height(3))
hide sprite 3
show sprite 4
inc compteur_passages1
if clic_actuel=1 and clic_precedent<>clic_actuel `<==== pour gérer une action au moment du clic
`if clic_precedent=0 and clic_precedent<>clic_actuel `<==== pour gérer une action au relâchement du clic
inc compteur_clics1
endif
else
hide sprite 4
show sprite 3
endif
`BOUTON 2 : ton propre code
if (sprite x(1)<=mousex()) and (mousex()<=sprite x(1)+sprite width(1)) and (sprite y(1)<=mousey()) and (mousey()<=sprite y(1)+sprite height(1))
hide sprite 1
show sprite 2
inc compteur_passages2
if mouseclick()=1
inc compteur_clics2
endif
else
hide sprite 2
show sprite 1
endif
`Mise à jour du clic de la souris
clic_precedent=clic_actuel
clic_actuel=mouseclick()
sync
loop
Merci bcp! Ca marche nickel!
Bon, il reste plus que mon autre problème de son du survol du bouton qui se répete x fois par seconde lorsque l´on survole le bouton avec le pointeur de la souris.
Merci aussi de m´avoir optimisé le code à ma place
sync on
`IMAGE 1 du bouton
load bitmap "image1.bmp",1
get image 3,0,0,100,50,3
delete bitmap 1
sprite 3,100,100,3
sprite 1,300,100,3
`IMAGE 2 DU BOUTON
load bitmap "image2.bmp",1
get image 4,0,0,100,50,3
delete bitmap 1
sprite 4,100,100,4
sprite 2,300,100,4
hide sprite 4
hide sprite 2
`VARIABLES : compteurs de clics et de passages de souris sur les boutons
compteur_passages1 as integer = 0
compteur_clics1 as integer = 0
compteur_passages2 as integer = 0
compteur_clics2 as integer = 0
`VARIABLES POUR GERER LES CLIC DE LA SOURIS
clic_precedent as integer =0
clic_actuel as integer=0
do
`AFFICHAGE DE COMTEURS
text 0,0,"Bouton 1 - Nombre de passages : "+Str$(compteur_passages1)
text 0,20,"Bouton 1 - Nombre de clics : "+Str$(compteur_clics1)
text 0,60,"Bouton 2 - Nombre de passages : "+Str$(compteur_passages2)
text 0,80,"Bouton 2 - Nombre de clics : "+Str$(compteur_clics2)
`BOUTON 1 : mes modifications
if (sprite x(3)<=mousex()) and (mousex()<=sprite x(3)+sprite width(3)) and (sprite y(3)<=mousey()) and (mousey()<=sprite y(3)+sprite height(3))
hide sprite 3
show sprite 4
inc compteur_passages1
if clic_actuel=1 and clic_precedent<>clic_actuel `<==== pour gérer une action au moment du clic
`if clic_precedent=0 and clic_precedent<>clic_actuel `<==== pour gérer une action au relâchement du clic
inc compteur_clics1
endif
else
hide sprite 4
show sprite 3
endif
`BOUTON 2 : ton propre code
if (sprite x(1)<=mousex()) and (mousex()<=sprite x(1)+sprite width(1)) and (sprite y(1)<=mousey()) and (mousey()<=sprite y(1)+sprite height(1))
hide sprite 1
show sprite 2
inc compteur_passages2
if mouseclick()=1
inc compteur_clics2
endif
else
hide sprite 2
show sprite 1
endif
`Mise à jour du clic de la souris
clic_precedent=clic_actuel
clic_actuel=mouseclick()
sync
loop
De rien
Pour éviter que le son ne se répète plusieurs fois, tu peux vérifier que le son n´est pas en lecture avant.
if not sound playing(son)
play sound(son)
endif
En ce qui concerne le son, il se répete beaucoup moins vite, mais il se répéte toujours au passage du curseur de la souris sur le bouton.
Ah ... donc tu veux qu´il ne soit joué qu´une seule fois du moment que tu passes la souris dessus...
Alors voilà une possibilité pour ne déclencher le son qu´une seule fois :
passage as boolean `<=============
[...]
`BOUTON 1 : mes modifications
if (sprite x(3)<=mousex()) and (mousex()<=sprite x(3)+sprite width(3)) and (sprite y(3)<=mousey()) and (mousey()<=sprite y(3)+sprite height(3))
hide sprite 3
show sprite 4
If passage=0 `<=======TON SON ======
inc compteur_passages1
passage=1
EndIf
if clic_actuel=1 and clic_precedent<>clic_actuel une action au moment du clic
`if clic_precedent=0 and clic_precedent<>clic_actuel action au relâchement du clic
inc compteur_clics1
endif
else
hide sprite 4
show sprite 3
passage=0 `<=============
endif
Merci beaucoup! Tout marche nickel maintenant!
Décidemment, je reviendrai beaucoup plus souvent sur ce forum
Voici donc le code final :
sync on
load sound "menu005.wav",1
`IMAGE 1 du bouton
load bitmap "ok1.bmp",1
get image 3,0,0,144,45,3
delete bitmap 1
sprite 3,100,100,3
sprite 1,300,100,3
`IMAGE 2 DU BOUTON
load bitmap "ok2.bmp",1
get image 4,0,0,144,45,3
delete bitmap 1
sprite 4,100,100,4
sprite 2,300,100,4
hide sprite 4
hide sprite 2
`VARIABLES : compteurs de clics et de passages de souris sur les boutons
compteur_passages1 as integer = 0
compteur_clics1 as integer = 0
compteur_passages2 as integer = 0
compteur_clics2 as integer = 0
`VARIABLES POUR GERER LES CLIC DE LA SOURIS
clic_precedent as integer =0
clic_actuel as integer=0
passage as boolean
do
`AFFICHAGE DE COMTEURS
text 0,0,"Bouton 1 - Nombre de passages : "+Str$(compteur_passages1)
text 0,20,"Bouton 1 - Nombre de clics : "+Str$(compteur_clics1)
text 0,60,"Bouton 2 - Nombre de passages : "+Str$(compteur_passages2)
text 0,80,"Bouton 2 - Nombre de clics : "+Str$(compteur_clics2)
`BOUTON 1 : mes modifications
if (sprite x(3)<=mousex()) and (mousex()<=sprite x(3)+sprite width(3)) and (sprite y(3)<=mousey()) and (mousey()<=sprite y(3)+sprite height(3))
hide sprite 3
show sprite 4
If passage=0
inc compteur_passages1
passage=1
play sound 1
endif
if clic_actuel=1 and clic_precedent<>clic_actuel `<==== pour gérer une action au moment du clic
`if clic_precedent=0 and clic_precedent<>clic_actuel `<==== pour gérer une action au relâchement du clic
inc compteur_clics1
endif
else
hide sprite 4
show sprite 3
passage=0
endif
`BOUTON 2 : ton propre code
if (sprite x(1)<=mousex()) and (mousex()<=sprite x(1)+sprite width(1)) and (sprite y(1)<=mousey()) and (mousey()<=sprite y(1)+sprite height(1))
hide sprite 1
show sprite 2
inc compteur_passages2
if mouseclick()=1
inc compteur_clics2
endif
else
hide sprite 2
show sprite 1
endif
`Mise à jour du clic de la souris
clic_precedent=clic_actuel
clic_actuel=mouseclick()
sync
loop
Heureux d´avoir pu te rendre service
Bonne continuation
Salut !
Je veux faire rebondir une balle sur un obstacle ( en 2D), et je ne sais pas comment calculer la trajectoire de cette dernière.
On m´avait dit d´utiliser le Cosinus si me souviens bien, mais je vois vraiment pas
Si quelqu´un pourrait m´aider, juste me dire comment faire et si il a le temps me donner un petit exemple de code.
Merci d´avance
Bien sûr, les adeptes du C++ et autres langages peuvent aussi répondrent, une réponse en bon français avec juste une explication, pas forcement du code, me convient amplement
Tu veux dire pour lui faire faire des bonds, ou bien pour la faire heurter un obstacle et qu´elle parte dans l´autre sens? Pour ça tu peux simplement rendre négative la variable qui contiend le déplacement de la balle lorsqu´elle rentre en collision avec l´obstacle. Mais pour les bonds c´est un peu plus compliqué. D´ailleurs j´avais déjà eu beaucoup de mal à pondre le code pour bêtement faire sauter un perso correctement.
Mais à vue de nez je dirais que ça a à voir avec une variable qui contiend la gravité (dont la valeur est fixe et dont tu te sers pour déplacer la balle vers le bas) et une autre qui contiend la force qui la fait monter, qui diminue au fur et à mesure du bond et qui redevient élevée quand elle touche le sol, mais un peu moins élévee à chaque bond (selon le temps qu´elle a mis à redescendre - grâce à une troixième variable).