Page 1 sur 2

voilà mes travaux

Publié : sam. 12/juil./2008 21:22
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


Publié : sam. 12/juil./2008 23:20
par Backup
...........

Publié : dim. 13/juil./2008 6:50
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

Publié : dim. 13/juil./2008 7:15
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


Publié : dim. 13/juil./2008 7:26
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:

Publié : dim. 13/juil./2008 7:39
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 !! :) ..

Publié : dim. 13/juil./2008 8:49
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

Publié : dim. 13/juil./2008 9:12
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







Publié : dim. 13/juil./2008 9:41
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!!)

Publié : dim. 13/juil./2008 10:32
par Backup
chikun a écrit :(j'étais sur ton site quand tu me repondais, eh oui je mangais en musique 12h40 ici - bravo!!)
Merci :)

Publié : dim. 13/juil./2008 17:29
par SPH
"pas de joystick. On va faire sans"
Puis, error ligne 255:

Code : Tout sélectionner

If JoystickButton(3)

Publié : dim. 13/juil./2008 19:43
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 !
:)

Publié : lun. 14/juil./2008 3:35
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 !

Publié : lun. 14/juil./2008 11:03
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:

Publié : lun. 14/juil./2008 12:20
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: