Page 2 sur 2

Publié : ven. 25/juil./2008 23:06
par Anonyme
Du reste, je pense que même si le flippers est plus complexe, ça reste un empilement de problèmes, qui pris un à un, ne sont pas plus diaboliques qu'un pong ou autres. ? Nop ?
Exactement , mais une fois les problèmes résolu , il faut faire cohabité nos résolution , et là , d'autres problème surgissent... deux problèmes résolu contradictoire l'un l'autre... pas façile , faut commencer par la base , les maths pur & dur , c'est pas le parcours que j'ai choisi , j'en "chie" un peu plus que les matheux , mais je m'en sors a chaque fois.

Publié : ven. 25/juil./2008 23:41
par beauregard
Du reste, je pense que même si le flippers est plus complexe, ça reste un empilement de problèmes, qui pris un à un, ne sont pas plus diaboliques qu'un pong ou autres. ? Nop ?
Certes, mais quand on débute( surtout avec pb)... faut commencer en douceur. :)

Publié : sam. 26/juil./2008 5:08
par chikun
@Cpl.Bator
Si tu veut faire un rebond avec une droite , je te met au défi d'utiliser SpritePixelCol...()
...disons que je voulais dans la création de la structure "barre" , ajouter une variable (indication) d'angle à prendre une fois percuté....et l'inverser si le choc se fesait en dessus ou en dessous de cette barre (par rapport à la coordonnée Y anterrieur de la balle).

je ne pense pas impossible meme à mon bas niveau.

et j'ajoute que j'ai choisi une sorte de flipper car c un exercice complet
pour moi..
mais j'ai fait de l'assembleur il y a 24a. j'étudie les cour ASM ici, j'en suis qu'à la comprehension des registres et des instructions mais j'irai voir s'il y a le B a BA (petits exemples concrets et appliqués avec affichage)
Pour ça si quelqu'un peut me donner un lien....

Publié : sam. 26/juil./2008 10:30
par chikun
ouhou les copains !! :lol:

un peu comme ça ....

Code : Tout sélectionner

InitSprite() 
InitKeyboard() 
InitMouse() 

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

Structure objet 
    xb.w 
    yb.w  
    an.w
EndStructure 
#balle=1
#target=2

Dim objet.objet(2) 

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

CreateSprite ( #target,100,50) 
StartDrawing ( SpriteOutput (#target)) 
  LineXY(0,50,100,0,RGB(128,250,32))
StopDrawing () 
objet(#target)\xb=400 : objet(#target)\yb=300 : objet(#target)\an=320

ang=180 : st=1 : diam=600

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
 
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() 
 
ExamineMouse() 
mx=MouseX() : my=MouseY()
If mx>992 : mx=992 : EndIf
If my>736 : my=736 : EndIf

objet(#balle)\xb=mx : objet(#balle)\yb=my

StartDrawing(ScreenOutput()) 
Line(mx+16,my+16,px,py,RGB(255,0,0)) 

StopDrawing() 


DisplayTransparentSprite(#balle,objet(#balle)\xb,objet(#balle)\yb) 
DisplayTransparentSprite(#target,objet(#target)\xb,objet(#target)\yb) 


FlipBuffers()
 

ExamineKeyboard() 
      If KeyboardPushed(#PB_Key_Q) : ang=ang-st : EndIf ;"A"
       
      If KeyboardPushed(#PB_Key_W) : ang=ang+st : EndIf ;"Z"
      
px=diam*Cos(ang*#PI/180) 
py=diam*Sin(ang*#PI/180) 
ClearScreen(RGB(0, 0,0))


      If MouseButton(1)
       
          
           
            Repeat

            objet(#balle)\xb=objet(#balle)\xb+16*Cos(ang*#PI/180) 
            objet(#balle)\yb=objet(#balle)\yb+16*Sin(ang*#PI/180) 

            DisplayTransparentSprite(#balle,objet(#balle)\xb,objet(#balle)\yb) 
            DisplayTransparentSprite(#target,objet(#target)\xb,objet(#target)\yb) 
                    
            StartDrawing(ScreenOutput()) 
            DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0)) 
            DrawText(370,0,"molette pour next lol!",RGB(0,200,100), RGB(0,0,0))
            StopDrawing()
            
                        
            FlipBuffers() 
            
               If objet(#balle)\yb<0 : objet(#balle)\yb=0 : ang=-ang : EndIf
               If objet(#balle)\yb>736 : objet(#balle)\yb=736 : ang=-ang : EndIf
               If objet(#balle)\xb<0 : objet(#balle)\xb=0 : ang=270+(270-ang):EndIf
               If objet(#balle)\xb>992 : objet(#balle)\xb=992 : ang=270+(270-ang): EndIf
               
               If SpritePixelCollision(#balle,objet(#balle)\xb,objet(#balle)\yb,#target,objet(#target)\xb,objet(#target)\yb)
                  ang=270+(270+(ang+objet(#target)\an) ); << GROSSE RECHERCHE mdrr
                  
                  
                  
                  
               
                 
         
               EndIf
               
            
            ClearScreen(RGB(0, 0,0))
            ExamineMouse() 
            Until MouseButton(3)
      EndIf
 



Until MouseButton(2) 
End 
:P accroche toi jeannot mdrrr, vous foutez pas svp dans les rangs

bon, je sais bien que c plus compliqué que ça si je veux un rendu reel , mais ne trichons nous pas des fois pour recentrer une balle ou autre hmm? :lol:

Publié : sam. 26/juil./2008 10:39
par beauregard
chikun a écrit :ouhou les copains !! :lol:

un peu comme ça ....

:P accroche toi jeannot mdrrr, vous foutez pas svp dans les rangs

bon, je sais bien que c plus compliqué que ça si je veux un rendu reel , mais ne trichons nous pas des fois pour recentrer une balle ou autre hmm? :lol:
non, c'est un joli code, tu peux même songer en faire un billard :)

Publié : sam. 26/juil./2008 11:07
par chikun
@beauregard
8O lolll merci.....enfin un peu d'encouragement, mais "ils" ont raison, ça va pas etre facile si je me plonge pas dans la trigo

puis toute façon, immagine dans un flipper avec une 10aine de "target", la quantité de "if" qui vont me retarder le prg (j'aimerai tant refaire de l'assembleur)

quoi que j'ai ajouté une seconde barre (regarde le code ci-dessous) et ça va encore.
(pardonnez moi les faux rebonds)
bon je vais faire un simulateur de f16 maintenant :lol: *

Code : Tout sélectionner

InitSprite() 
InitKeyboard() 
InitMouse() 

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

Structure objet 
    xb.w 
    yb.w  
    an.w
EndStructure 
#balle=1
#target=2
#champi=3
Dim objet.objet(3) 

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

CreateSprite ( #target,100,50) 
StartDrawing ( SpriteOutput (#target)) 
  LineXY(0,50,100,0,RGB(128,250,32))
StopDrawing () 
objet(#target)\xb=400 : objet(#target)\yb=300 : objet(#target)\an=320

CreateSprite ( #champi,100,50) 
StartDrawing ( SpriteOutput (#champi)) 
  LineXY(0,0,100,50,RGB(160,200,62))
StopDrawing () 
objet(#champi)\xb=200 : objet(#champi)\yb=500 : objet(#champi)\an=45



ang=180 : st=1 : diam=600

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
 
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() 
 
ExamineMouse() 
mx=MouseX() : my=MouseY()
If mx>992 : mx=992 : EndIf
If my>736 : my=736 : EndIf

objet(#balle)\xb=mx : objet(#balle)\yb=my

StartDrawing(ScreenOutput()) 
Line(mx+16,my+16,px,py,RGB(255,0,0)) 

StopDrawing() 


DisplayTransparentSprite(#balle,objet(#balle)\xb,objet(#balle)\yb) 
DisplayTransparentSprite(#target,objet(#target)\xb,objet(#target)\yb) 
DisplayTransparentSprite(#champi,objet(#champi)\xb,objet(#champi)\yb)

FlipBuffers()
 

ExamineKeyboard() 
      If KeyboardPushed(#PB_Key_Q) : ang=ang-st : EndIf ;"A"
       
      If KeyboardPushed(#PB_Key_W) : ang=ang+st : EndIf ;"Z"
      
px=diam*Cos(ang*#PI/180) 
py=diam*Sin(ang*#PI/180) 
ClearScreen(RGB(0, 0,0))


      If MouseButton(1)
       
          
           
            Repeat

            objet(#balle)\xb=objet(#balle)\xb+16*Cos(ang*#PI/180) 
            objet(#balle)\yb=objet(#balle)\yb+16*Sin(ang*#PI/180) 

            DisplayTransparentSprite(#balle,objet(#balle)\xb,objet(#balle)\yb) 
            DisplayTransparentSprite(#target,objet(#target)\xb,objet(#target)\yb) 
            DisplayTransparentSprite(#champi,objet(#champi)\xb,objet(#champi)\yb)       
            
            StartDrawing(ScreenOutput()) 
            DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0)) 
            DrawText(370,0,"molette pour next lol!",RGB(0,200,100), RGB(0,0,0))
            StopDrawing()
            
                        
            FlipBuffers() 
            
               If objet(#balle)\yb<0 : objet(#balle)\yb=0 : ang=-ang : EndIf
               If objet(#balle)\yb>736 : objet(#balle)\yb=736 : ang=-ang : EndIf
               If objet(#balle)\xb<0 : objet(#balle)\xb=0 : ang=270+(270-ang):EndIf
               If objet(#balle)\xb>992 : objet(#balle)\xb=992 : ang=270+(270-ang): EndIf
               
               If SpritePixelCollision(#balle,objet(#balle)\xb,objet(#balle)\yb,#target,objet(#target)\xb,objet(#target)\yb)
                  ang=270+(270+(ang+objet(#target)\an) ); << GROSSE RECHERCHE mdrr
               EndIf   
               If SpritePixelCollision(#balle,objet(#balle)\xb,objet(#balle)\yb,#champi,objet(#champi)\xb,objet(#champi)\yb)
                  ang=270+(270+(ang+objet(#champi)\an) )
               EndIf   
               
                 
         
               ;EndIf
               
            
            ClearScreen(RGB(0, 0,0))
            ExamineMouse() 
            Until MouseButton(3)
      EndIf
 



Until MouseButton(2) 
End 

Publié : sam. 26/juil./2008 11:26
par Anonyme

Code : Tout sélectionner

Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
  A.f = x1-x2
  b.f = y1-y2
  c.f = -Sqr(A*A+b*b)
  Angle.f = ACos(A/c)*180/#PI
  If y1 < y2 : Angle=360-Angle : EndIf
  ProcedureReturn Abs(Angle - 360)
EndProcedure 

Tiens , cette procedure te retourne l'angle qui sépare deux point , tu l'appliques sur ta droite ( lors du collision AABB par exemple ) Et tu rajoute 90 ( la normale de la droite ) tout en tenant compte de la direction de la balle , il te faut donc son angle aussi. :wink:

Publié : sam. 26/juil./2008 14:37
par chikun
ahhh!!! merci :D
:)
mais!? :(

c'est de l'Hiéroglyphe non !? :?

je connais meme pas : "procedure..."

tainngg! c'est une bible la pure
bon hop! o boulot 8) ....travailler le week end , te jure...

merci mille fois, g l'impression d'etre un egyptien pationné qui viens de trouver un ipod....

Publié : sam. 26/juil./2008 15:46
par chikun
ben non, je comprend pas ...

g donné des valeurs à x1, y1 et x2,y2 (considerant que ce sont les coordonnées des deux point dont tu parles)
et g fait debug angle = 0?

mais en fait je ne connais pas "procedure"
un chti exemple me viendrait en aide

Publié : sam. 26/juil./2008 15:51
par Anonyme
avec des structure en plus ! :d

Code : Tout sélectionner

Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
  A.f = x1-x2
  b.f = y1-y2
  c.f = -Sqr(A*A+b*b)
  Angle.f = ACos(A/c)*180/#PI
  If y1 < y2 : Angle=360-Angle : EndIf
  ProcedureReturn Abs(Angle - 360)
EndProcedure


Structure Vector2
  x.f
  y.f
EndStructure

Structure Droite
  A.Vector2
  B.Vector2
EndStructure


; La droite AB
AB.Droite
; Le point A de la droite AB
AB\A\x = 100
AB\A\y = 100
; Le point B de la droite AB
AB\B\x = 300
AB\B\y = 300

; L'angle est de 45°
Debug ReturnDegAngle(AB\A\x,AB\A\y,AB\B\x,AB\B\y)

Publié : lun. 28/juil./2008 18:15
par chikun
:D Cpl.Bator merci

voilà qui va grandement me servir des que j'ai du temps car mon patron m'a donné du boulot pour 4 :(

heureusement on est 8 :roll:

j'ai hate d'exploiter ton code...c tres sympa de prendre le temps d'aider
comme l'a fait Dobro :wink:

Publié : lun. 28/juil./2008 21:19
par Backup
exemple simple d'appel de la procedure

Code : Tout sélectionner

Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
      a.f = x1-x2
      b.f = y1-y2
      c.f = -Sqr(a*a+b*b)
      Angle.f = ACos(a/c)*180/#PI
      If y1 < y2 : Angle=360-Angle : EndIf
      ProcedureReturn Abs(Angle - 360)
EndProcedure


x1.f=10
y1.f=10
x2.f=150
y2.f=200

Debug ReturnDegAngle(x1.f,y1.f,x2.f,y2.f)

 ; ou alors 

Result.f=ReturnDegAngle(10,10,150,200)

Debug Result.f

; ou alors

Debug ReturnDegAngle(10,10,150,200)