voilà mes travaux

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

voilà mes travaux

Message par chikun »

j'arrette là pour les angles.... fatigué

Dobro pour te dire que tu as été un bon prof ...
je prepare une sorte de flipper et depuis c en ce sens que je bosse..
il y a surement des corrections à faire ....

Code : Tout sélectionner


InitSprite()
InitKeyboard()
InitMouse()

OpenScreen(1024, 768, 32, "squelette ecran") 
; 992,736

Structure boule
    xb.w 
    yb.w  
;    sensx.b 
;    sensy.b 
EndStructure 

Dim boule.boule(2)

CreateSprite ( 1,100,100) 
StartDrawing ( SpriteOutput (1)) 
  Circle (50, 50, 50, RGB (0,255,0)) 
StopDrawing () 

CreateSprite ( 2,32,32) 
StartDrawing ( SpriteOutput (2)) 
  Circle (16,16,16, RGB (0,0,255)) 
StopDrawing () 

m=0

boule(1)\xb=(1024-100)/2 : boule(1)\yb=100

diam=120
ang=180: st=1

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
rec:
Repeat
StartDrawing(ScreenOutput())
DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0))
DrawText(370,0,"clic droit > sortir I clic gauche > shooter",RGB(0,200,100), RGB(0,0,0))
StopDrawing()
boule(2)\xb=mx-16: boule(2)\yb=700
DisplayTransparentSprite(1,boule(1)\xb,boule(1)\yb) 
DisplayTransparentSprite(2,boule(2)\xb,boule(2)\yb)
ExamineMouse()
mx=MouseX()
ang=ang+st 
If ang>=360 : ang=358 : st=-st
EndIf
If ang<=180 : ang=182 : st=-st
EndIf
dx=diam*Cos(ang*#PI/180)
dy=diam*Sin(ang*#PI/180)
StartDrawing(ScreenOutput())
Line(mx,716,dx,dy,RGB(255,0,0))
StopDrawing()
If MouseButton(1) : Goto feu
EndIf



FlipBuffers()
ClearScreen(RGB(0, 0,0)) 


Until MouseButton(2)
End

feu:
col=0
For i=1 To 200


boule(2)\xb=boule(2)\xb+16*Cos(ang*#PI/180)
boule(2)\yb=boule(2)\yb+16*Sin(ang*#PI/180)
DisplayTransparentSprite(1,boule(1)\xb,boule(1)\yb)
DisplayTransparentSprite(2,boule(2)\xb,boule(2)\yb)

If col=0 And SpritePixelCollision(1,boule(1)\xb,boule(1)\yb,2,boule(2)\xb,boule(2)\yb)
  ang=-ang : col=1
EndIf

FlipBuffers()
ClearScreen(RGB(0, 0,0)) 
If boule(2)\yb<0 Or boule(2)\yb>736 Or boule(2)\xb<0 Or boule(2)\xb>992: Goto rec
EndIf

;Debug dx : Debug dy
;Delay(2000)
Next i
col=0
Goto rec
End

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

...........
Dernière modification par Backup le mar. 19/août/2014 12:51, modifié 1 fois.
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

bon délire, mais le flip droit ne fonctionne pas (mdr le tilt :D )

En fait je travail sur le rebond un peu comme le billard, mais je n'arrive pas à trouver un code source simple (g trouvé mais trop complexe)

Tu vois, dans mon prog (ci-dessus), je ne suis pas satisfait du rebond sur la sphere quand je vise plus haut que l'équateur, je voudrais qu'elle monte(je sais que "-ang" ne peux le gerer, mais c mieux que rien...)
Je suis borné et je vais continuer à tester les angles sur ma sphere, car je ne peux faire autrement...

Sur ton prog. g du mal à le visualiser car le flip droit ne fonct. pas
Peut etre as tu au grenier un vieux billard basic simple (?)

g du créer un dossier spécial "Dobro", merci de m'aider avec tes exemples
clairs et détaillés, j'en serai encore à étudier "locateconsole" :D
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

du reste, g modifié mon code pour mieux apprécier l'effet rebond et l'étudier.....

Code : Tout sélectionner

InitSprite()
InitKeyboard()
InitMouse()

OpenScreen(1024, 768, 32, "squelette ecran") 
; 992,736

Structure boule
    xb.w 
    yb.w  
;    sensx.b 
;    sensy.b 
EndStructure 

Dim boule.boule(2)

CreateSprite ( 1,100,100) 
StartDrawing ( SpriteOutput (1)) 
  Circle (50, 50, 50, RGB (0,255,0)) 
StopDrawing () 

CreateSprite ( 2,32,32) 
StartDrawing ( SpriteOutput (2)) 
  Circle (16,16,16, RGB (0,0,255)) 
StopDrawing () 

m=0

boule(1)\xb=(1024-100)/2 : boule(1)\yb=100

diam=600
ang=180: st=1

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
rec:
Repeat
StartDrawing(ScreenOutput())
DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0))
DrawText(370,0,"clic droit > sortir ___/___ clic gauche > shooter",RGB(0,200,100), RGB(0,0,0))
DrawText(369,16,"(A) ang à gauche ___/___ (Z) ang à droite",RGB(0,200,100), RGB(0,0,0))
StopDrawing()
boule(2)\xb=mx-16: boule(2)\yb=700
DisplayTransparentSprite(1,boule(1)\xb,boule(1)\yb) 
DisplayTransparentSprite(2,boule(2)\xb,boule(2)\yb)
ExamineMouse()
mx=MouseX()

ExamineKeyboard()
If KeyboardPushed(#PB_Key_W) : ang=ang-st
EndIf
If KeyboardPushed(#PB_Key_Q) : ang=ang+st
EndIf

If ang>=360 : ang=358 : st=-st
EndIf
If ang<=180 : ang=182 : st=-st
EndIf



dx=diam*Cos(ang*#PI/180)
dy=diam*Sin(ang*#PI/180)
StartDrawing(ScreenOutput())
Line(mx,716,dx,dy,RGB(255,0,0))
StopDrawing()
If MouseButton(1) : Goto feu
EndIf



FlipBuffers()
ClearScreen(RGB(0, 0,0)) 


Until MouseButton(2)
End

feu:
col=0
For i=1 To 200


boule(2)\xb=boule(2)\xb+16*Cos(ang*#PI/180)
boule(2)\yb=boule(2)\yb+16*Sin(ang*#PI/180)
DisplayTransparentSprite(1,boule(1)\xb,boule(1)\yb)
DisplayTransparentSprite(2,boule(2)\xb,boule(2)\yb)

If col=0 And SpritePixelCollision(1,boule(1)\xb,boule(1)\yb,2,boule(2)\xb,boule(2)\yb)
  ang=-ang : col=1
EndIf

FlipBuffers()
ClearScreen(RGB(0, 0,0)) 
If boule(2)\yb<0 Or boule(2)\yb>736 Or boule(2)\xb<0 Or boule(2)\xb>992: Goto rec
EndIf

;Debug dx : Debug dy
;Delay(2000)
Next i
col=0
Goto rec
End

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chikun a écrit :bon délire, mais le flip droit ne fonctionne pas (mdr le tilt :D )
si il fonctionne !! je test mes sources avant de les poster sur le Forum !! :?


le flip droit est geré par ces lignes

Code : Tout sélectionner

;{ interroge le clavier et joystick
  ;- interoge le clavier
  If JoystickButton(3)
    RotateSprite3D ( #flip_droit3d , 30,0)
    right=1
  Else
    RotateSprite3D ( #flip_droit3d , 0, 0)
    right=0
  EndIf 
et tu vois que j'utilise le bouton numero 3 de mon joystick
If JoystickButton(3)
il est probable que tu n'es pas plus de 2 boutons sur ton joystick..
il te suffit d'attribuer le numero de bouton qui va avec le tiens

genre 1 pour le flip gauche et 2 pour le droit ... :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bon pour en venir a ton prg !!

ya des choses qui vont pas du tout !!

commence par apprendre ça par coeur !! :)


1- Les Goto tu evitera !! bien souvent on peut faire Sans !!
2- dans tes codes le plus souvent un seul Flipbuffer() tu mettra !!
3- des labels ou des nom de variable tu utilisera le plus souvent possible (proscrire les numeros pour designer un sprite par exemple...)

4- commenter ton code tu fera !! (parceque dans 1 ans, tu saura plus ce que tu voulais faire !!)
5- un prg est une suite d'instructions mais avec un emplacement precis !!
(je t'expliquerai ça un poil plus tard..)

6- les ":" qui permettent une suite d'instruction par ligne tu evitera..
(c'est carrement pas lisible)

voila pour commencer.. je fini de revoir ton code , et je te post , tu verra qu'on peut faire sans Goto !! :) ..
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

:D waouuu les 6 commandements

tu sais, en visionnant tes prog, j'ai bien vu que que les goto on s'en passe que les commentaires sont indispensable pour ne pas se perdent, g vu aussi que les enumerations sont tres utiles et tout le stoint stoint....

mais là, je veux un rebond quazi réel, alors je cherche tete baissé en codant "salement". Mais quand le resultat me plait, je prend un plaisir à optimiser, à commenter et à apprendre tout ce que tu m'as enseigné..
je te remercierai jamais assez, car je me demandais comment j'allais m'en sortir....(prend soin de toi :wink: )

j'ai rectifié ton flipper et ça fonctionne maintenant (mon joystik mank de bouton, g utilisé "Q" pour le TILT)
je le trouve tres sympa...

dsl pour les autres sur mon coté "sms" , j'évite mais des fois c'est plus fort que moi (j'ai = g / c'est=c) < les seuls que j'utilise
merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bon je me suis evertué non pas a résoudre ton probleme

parce que je suis nul en math, toutefois, la petite solution que je te donne devrai te mettre sur la voie :)

sinon demande a Huibit c'est le Matheux du coin :) (il est prof, ça aide :D )

bon voici le code, regarde bien les changements apportés, tu verra que le code est bien plus clair ...

du coup on corrige mieux les bêtises :D

faut cherche a coder proprement des le début, cela résous bien des soucis des le départ !!



;*********les declarations de procedure***********

;*********************************************


; ************** initialisation des constantes *********************
Enumeration
   #cible
   #balle
EndEnumeration
; ***********************************************************


; ********** initialisation des structure ***************************
Structure boule
  xb.w
  yb.w
EndStructure
; **********************************************************

; **************** initialisation des tableaux ******************
Dim boule.boule(2)
; *********************************************************


; ********************* les parametres du prg *********************
InitSprite ()
InitKeyboard ()
InitMouse ()
; ************************************************************


; ////////////////////////////////////////////////////////////////////////////////////////////////////

OpenScreen (1024, 768, 32, "squelette ecran" )


; ******************** creation des sprites ***********************************
CreateSprite ( #cible ,100,100)
StartDrawing ( SpriteOutput ( #cible ))
   Circle (50, 50, 50, RGB (0,255,0))
StopDrawing ()

CreateSprite ( #balle ,32,32)
StartDrawing ( SpriteOutput ( #balle ))
   Circle (16,16,16, RGB (0,0,255))
StopDrawing ()
; *************************************************************************


; ************** parametre du prg avant boucle principale **********************************
m=0 :i=0:tir=0
boule( #cible )\xb=(1024-100)/2 : boule( #cible )\yb=100
diam=600
ang=90: st=1
pas=16
; ************************************************************************************

;xxxxxxxxxxxxxxxxx Boucle principale xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Repeat
   ExamineMouse (): ExamineKeyboard ()
  
  
   ; ********************* les touches clavier // souris *****************************
  
   If KeyboardPushed ( #PB_Key_W )
    ang=ang-st
   EndIf
   If KeyboardPushed ( #PB_Key_Q )
    ang=ang+st
   EndIf
  
   If MouseButton (1)
    tir=1
   EndIf
  
   If tir=0
    mx= MouseX ()
    boule( #balle )\xb=mx-16
    boule( #balle )\yb=700
   EndIf
  
   ; ********************************************************************
  
  
   ; ***************** parametrage de l'angle de tir *************************
   If ang>=360
    ang=358
    st=-st
   EndIf
   If ang<=180
    ang=182
    st=-st
   EndIf
  dx=diam* Cos (ang* #PI /180)
  dy=diam* Sin (ang* #PI /180)
  
   ; *************************************************************************
  
  
  
   ; ***************** les collisions ****************************************************************
  
   If SpritePixelCollision ( #cible ,boule( #cible )\xb,boule( #cible )\yb+80, #balle ,boule( #balle )\xb,boule( #balle )\yb)
    pas=-pas
   EndIf
   If SpritePixelCollision ( #cible ,boule( #cible )\xb-45,boule( #cible )\yb, #balle ,boule( #balle )\xb,boule( #balle )\yb)
    ang=ang-10
   EndIf
   If SpritePixelCollision ( #cible ,boule( #cible )\xb+55,boule( #cible )\yb, #balle ,boule( #balle )\xb,boule( #balle )\yb)
    ang=ang+10
   EndIf
  
  
  
  
   If boule( #balle )\yb<0 Or boule( #balle )\yb>736 Or boule( #balle )\xb<0 Or boule( #balle )\xb>992
    i=0
    tir=0
    pas=16
   EndIf
   ; ***********************************************************************************************
  
  
  
   ; *************** ZONE d'affichage toujour a la fin !! ***************************************
  
  
   StartDrawing ( ScreenOutput ())
     Line (mx,716,dx,dy, RGB (255,0,0))
   StopDrawing ()
  
   If tir=1
    i=i+1
     If i<200
      boule( #balle )\xb=boule( #balle )\xb+pas* Cos (ang* #PI /180)
      boule( #balle )\yb=boule( #balle )\yb+pas* Sin (ang* #PI /180)
     Else
      i=0
      tir=0
      pas=16
     EndIf
   EndIf
  
  
   DisplayTransparentSprite ( #cible ,boule( #cible )\xb,boule( #cible )\yb)
   DisplayTransparentSprite ( #balle ,boule( #balle )\xb,boule( #balle )\yb)
  
  
   StartDrawing ( ScreenOutput ())
     DrawText (0,0, "Chikun" , RGB (125,90,30), RGB (0,0,0))
     DrawText (370,0, "clic droit > sortir ___/___ clic gauche > shooter" , RGB (0,200,100), RGB (0,0,0))
     DrawText (369,16, "(A) ang à gauche ___/___ (Z) ang à droite" , RGB (0,200,100), RGB (0,0,0))
     DrawText (0,50, " boule()\yb =" + Str (boule( #balle )\yb), RGB (0,200,100), RGB (0,0,0))
   StopDrawing ()
  
   FlipBuffers ()
   ClearScreen ( RGB (0, 0,0))
Until MouseButton (2)
End






Dernière modification par Backup le dim. 13/juil./2008 10:34, modifié 2 fois.
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

:twisted:
du coup on corrige mieux les bêtises
c bon , c bon.....ralalallalalallalllaaa, tu voulais dire MES betises :P

oui, je vais introduire un code de huitbit quand j'aurrai bien adapté l'angle
bon grand week à toi (j'étais sur ton site quand tu me repondais, eh oui je mangais en musique 12h40 ici - bravo!!)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chikun a écrit :(j'étais sur ton site quand tu me repondais, eh oui je mangais en musique 12h40 ici - bravo!!)
Merci :)
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

"pas de joystick. On va faire sans"
Puis, error ligne 255:

Code : Tout sélectionner

If JoystickButton(3)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

SPH a écrit :"pas de joystick. On va faire sans"
Puis, error ligne 255:

Code : Tout sélectionner

If JoystickButton(3)
relis le 3em message au dessus du code Coloré !!

j'explique que j'utilise un Joystick avec plein de bouton, il suffit d'adapter
en mettant le bouton 1 pour le flip de gauche, et 2 pour celui de droite !
:)
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Hello !

Voilà un petit coup de pouce...
J'ai rajouté quelques lignes dans le label "feu"

Code : Tout sélectionner

#rayon_1=50 
#rayon_2=16 
alpha.f 
Enumeration 
  #spr_boule1 
  #spr_boule2 
EndEnumeration 

InitSprite() 
InitKeyboard() 
InitMouse() 

OpenScreen(1024, 768, 32, "squelette ecran") 

Structure boule 
  xb.w 
  yb.w  
EndStructure 

Dim boule.boule(2) 

CreateSprite (#spr_boule1,2*#rayon_1,2*#rayon_1) 
StartDrawing ( SpriteOutput (#spr_boule1)) 
Circle (#rayon_1, #rayon_1, #rayon_1, RGB (0,255,0)) 
StopDrawing () 

CreateSprite ( #spr_boule2,2*#rayon_2,2*#rayon_2) 
StartDrawing ( SpriteOutput (#spr_boule2)) 
Circle (#rayon_2, #rayon_2, #rayon_2, RGB (0,0,255)) 
StopDrawing () 

m=0 

boule(1)\xb=(1024-100)/2 : boule(1)\yb=100 

diam=600 
ang=180: st=1 

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
rec: 
Repeat 
  StartDrawing(ScreenOutput()) 
  DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0)) 
  DrawText(370,0,"clic droit > sortir ___/___ clic gauche > shooter",RGB(0,200,100), RGB(0,0,0)) 
  DrawText(369,16,"(A) ang à gauche ___/___ (Z) ang à droite",RGB(0,200,100), RGB(0,0,0)) 
  StopDrawing() 
  boule(2)\xb=mx-16: boule(2)\yb=700 
  DisplayTransparentSprite(#spr_boule1,boule(1)\xb,boule(1)\yb) 
  DisplayTransparentSprite(#spr_boule2,boule(2)\xb,boule(2)\yb) 
  ExamineMouse() 
  mx=MouseX() 
  
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_W) : ang=ang-st 
  EndIf 
  If KeyboardPushed(#PB_Key_Q) : ang=ang+st 
  EndIf 
  
  If ang>=360 : ang=358 : st=-st 
  EndIf 
  If ang<=180 : ang=182 : st=-st 
  EndIf 
   
  dx=diam*Cos(ang*#PI/180) 
  dy=diam*Sin(ang*#PI/180) 
  StartDrawing(ScreenOutput()) 
  Line(mx,716,dx,dy,RGB(255,0,0)) 
  StopDrawing() 
  If MouseButton(1) : Goto feu 
  EndIf 
  
  
  FlipBuffers() 
  ClearScreen(RGB(0, 0,0)) 
  
  
Until MouseButton(2) 
End 

feu: 
col=0 
vx=16*Cos(ang*#PI/180) 
vy=16*Sin(ang*#PI/180) 
For i=1 To 200 
  boule(2)\xb=boule(2)\xb+vx 
  boule(2)\yb=boule(2)\yb+vy 
  DisplayTransparentSprite(#spr_boule1,boule(1)\xb,boule(1)\yb) 
  DisplayTransparentSprite(#spr_boule2,boule(2)\xb,boule(2)\yb) 
  
  If col=0 And SpritePixelCollision(#spr_boule1,boule(1)\xb,boule(1)\yb,#spr_boule2,boule(2)\xb,boule(2)\yb) 
    col=1 
    alpha=2*((boule(2)\xb+#rayon_2-boule(1)\xb-#rayon_1)*vx+(boule(2)\yb+#rayon_2-boule(1)\yb-#rayon_1)*vy)/((#rayon_1+#rayon_2)*(#rayon_1+#rayon_2)) 
    vx=vx+alpha*((boule(1)\xb+#rayon_1-boule(2)\xb-#rayon_2)) 
    vy=vy+alpha*((boule(1)\yb+#rayon_1-boule(2)\yb-#rayon_2)) 
    
  EndIf 
  
  FlipBuffers() 
  ClearScreen(RGB(0, 0,0)) 
  If boule(2)\yb<0 Or boule(2)\yb>736 Or boule(2)\xb<0 Or boule(2)\xb>992: Goto rec 
  EndIf 
  
Next i 
col=0 
Goto rec 
End 
 

SVP pour les messages personnels, évite les emails !
Utilise la fonction mp du site, c'est plus pratique !

J'ai réglé ton problème de rebonds (j'ai utilisé le code de collision en considérant que l'une des boules avait une masse infinie
http://www.purebasic.fr/french/viewtopic.php?t=8281).

Par contre méfie-toi de SpritePixelCollision() car la détection de tes collisions n'est pas terrible (Dobro t'expliquera mieux que moi !).

Attention aux variables de positions des sprites, n'oublie pas que tu repères les sprites par leur coin supérieur gauche (je me fais avoir à chaque fois :lol: )! C'est peut-être de là que vient le problème de détection des collisions.

Si ton code doit s'allonger, il va falloir faire un peu de rangement sinon tu ne vas pas t'en sortir !

Hasta la vista !
Neosis
Messages : 113
Inscription : dim. 24/févr./2008 20:11

Message par Neosis »

N'utilise pas "GOTO", sur un gros programme c'est illisible, utilise plutôt des procédures ou des macros c'est mieux pour structurer sont code :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Huitbit a écrit :Hello !

Si ton code doit s'allonger, il va falloir faire un peu de rangement sinon tu ne vas pas t'en sortir !

Hasta la vista !
dis donc huitbit, ça sert a quoi que je lui fasse un model en couleur et nettoyé de son code !!

t'aurai pu repartir du code coloré !! :?

la tu repart avec son code, bordelique, effectivement , il va pas y arriver :lol:
Répondre