Page 1 sur 1

rotation des sprites sans sprite3D

Publié : mar. 09/janv./2007 21:46
par graph100
Mon pc ne peut executer des routines avec les sprites 3d
il plante gravement lorsque j'utilise start3D() ( erreur dues au processeur)
Donc si vous avez des codes pour les rotations de sprites sans sprite3d
j'ai des idées mais ca donne un truc trés lent ! et en plus je dois en utilise plein a la fois !!
je n'y connais rien en assembleur mais si sa peut augmenter la vitesse c'est tres Bien ^^

tiens c normal que le forum soit en anglais :D

Re: rotation des sprites sans sprite3D

Publié : mar. 09/janv./2007 22:08
par flaith
graph100 a écrit :...tiens c normal que le forum soit en anglais :D
Modifie le paramètre langue dans ton profil :wink:

Re: rotation des sprites sans sprite3D

Publié : mar. 09/janv./2007 23:31
par Backup
graph100 a écrit :Mon pc ne peut exécuter des routines avec les sprites 3d
il plante gravement lorsque j'utilise start3D() ( erreur dues au processeur)
verifie que la Dll "Engine3D.dll" est présente dans le dossier
"x:\PureBasic4\Compilers" ou bien dans le dossier de ton application !

a moins bien sur que ta carte graphique ne supporte pas du tout la 3D ...
mais en principe le processeur n'as pas grand chose a voir la dedans , il me semble :)

tu utilise un ordinateur a base de Cyrix ? :lol: avec windows 3.11 ? :lol:

c'est quoi ta config ?? 8O

Re: rotation des sprites sans sprite3D

Publié : mer. 10/janv./2007 13:08
par graph100
Dobro a écrit : tu utilise un ordinateur a base de Cyrix ? :lol: avec windows 3.11 ? :lol:

c'est quoi ta config ?? 8O
:lol:
Vraiment ??
350 MHz 98 SDRAM
Carte graphique intégrée de 4 Mo
Dique dur de 20 Go + des petits
Window XP PRO service pack 1 (sans aucune mise a jour)

Les jeu comme Counter HalfLife tournent tres bien en petite configuration

La 3D de Pure marche bien
le probleme c start3D()
ca ne sert a rien d'installer et de reinstaller et de reinstaller .....
je l'ai fait 3 fois deja il y avait le meme probleme avec 3.94, 3.80
et aussi sous Window 98
De meme inpossible de faire tourner Tailbite !

alors que j l'ai installer sans pb sur une autre machine lol

de toute façon les routines m'interressent.

Publié : mer. 10/janv./2007 13:29
par Anonyme
Met à jour DirectX si ce n'est pas fait, ou fait un crédit pour un pc plus récent :D

Publié : mer. 10/janv./2007 18:04
par graph100
ET Directx 9.0 b

et pas de nouveau pc prévus avant 2 ans
j'attent les pentiums millo :lol:

Publié : ven. 12/janv./2007 19:25
par graph100
donc pour faire les rotations de sprite je passe par une DLL 3.94
a qui j'envoie une image
mais le pb c que je n'arrive pas a faire passer l'image de la DLL au programme ?

Publié : sam. 13/janv./2007 12:16
par Dr. Dri
Les Sprite3D ne font pas parti du moteur 3D de PB (c'est que du directx)
Donc c'est pas le fichier Engine3D.dll qui changera quoi que ce soit

Si jamais les Sprite3Ds plantent chez toi c'est que ton code n'est pas sécurisé
Exemple :

Code : Tout sélectionner

If Start3D()
  
  ;si jamais il n'a pas été possible de passer
  ;en mode "3D" les commandes de Sprite3D ne
  ;seront pas exécutées.
  ;l'opération peut échouer parfois...
  
  Stop3D()
EndIf
Dri

Publié : sam. 13/janv./2007 13:05
par graph100
mais enfin je vous dis que la commande start3D() ne marche pas chez moi le compilateur ne plante pas sur displaysprite3D() mais sur start3D()
erreur --> invalide memory access

de meme les execuables compiler sur un pc ou ca marche comme l'exemple de cpl.bator avec les tanks et des sprite3D
plantent......

j'ai cherche partout sur le web mais je n'ai pas trouver une methode de rotation optimiser des images
:wink: J'aimerai bien joindre Mischa mais je ne sais pas ou ! :roll:

hier j'ai reinstaller directX 9.0c ca ne marche toujour pas
je pense que cela est du à la carte graphique si on peut dire ca :lol:

Publié : sam. 13/janv./2007 14:38
par Patrick88
il faut juste modifier le chemin d'accés aux exemple de purebasic
LoadSprite(1,"PureBasic\Examples\Sources\Data\GeeBee2.bmp",0)

Code : Tout sélectionner

Procedure RotateSprite(source,target,angle.f,scale) 
  s.f=Sin(6.28318531/3600*angle):c.f=Cos(6.28318531/3600*angle)
  bitmap=CreateCompatibleBitmap_(GetDC_(0),SpriteWidth(source),SpriteHeight(source))
  dc=CreateCompatibleDC_(GetDC_(0))
  obj=SelectObject_(dc,bitmap)
  sid=SpriteOutput(source)
  workdc=StartDrawing(sid)
    BitBlt_(dc,0,0,SpriteWidth(source),SpriteHeight(source),workdc,0,0,13369376)
    transcolor=Point(SpriteWidth(source)-1,0);<-----transparent color upper-right pixel in sourcesprite
  StopDrawing()
  mx=SpriteWidth(source)/2:my=SpriteHeight(source)/2
  radius.f=Sqr(mx*mx + my*my)+1
  If scale=0
    If SpriteWidth(target)=0
      CreateSprite(target,SpriteWidth(source),SpriteHeight(source),0)
      TransparentSpriteColor(2,RGB(transcolor,transcolor,transcolor))
      cl=1
    EndIf
    mx2=mx:my2=my
  Else
    If IsSprite(target)=0
      CreateSprite(target,radius*2,radius*2,0)
      TransparentSpriteColor(2,RGB(transcolor,transcolor,transcolor))
      cl=1
    EndIf
    mx2=radius:my2=radius:diffmx=mx2-mx:diffmy=my2-my
  EndIf
  max=SpriteWidth(target):may=SpriteHeight(target)
  sid=SpriteOutput(target)
  workdc=StartDrawing(sid)
    Box(x, y, max, may,transcolor)
    For y=0 To SpriteHeight(source)-1
      For x=0 To SpriteWidth(source)-1
        RotateX.f = ((x - mx) * c - (y - my) * s) + mx + diffmx
        RotateY.f = ((x - mx) * s + (y - my) * c) + my + diffmy
        If RotateX>=0 And RotateX<max And RotateY>=0 And RotateY<may
          color=GetPixel_(dc,x,y)
          If RotateX>1 And RotateX<SpriteWidth(target)-1 And RotateY>1 And RotateY<SpriteHeight(target)-1
             Plot(RotateX,RotateY,color)
          EndIf
          If angle<>0 And angle<>900 And angle<>1800 And angle<>2700 And angle<>3600
            If RotateX>1 And RotateX<SpriteWidth(target)-1 And RotateY>0 And RotateY<SpriteHeight(target)-1
              Plot(RotateX,RotateY,color);<--This is my very complex
            EndIf
          EndIf
        EndIf
      Next x
    Next y
  StopDrawing()
  DeleteObject_(bitmap):DeleteObject_(obj):DeleteDC_(dc)
EndProcedure



If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or OpenScreen(1024,768,32,"Rotate")=0
  MessageRequester("Error", "Can't open DirectX 7 Or later", 0):End
EndIf

LoadSprite(1,"PureBasic\Examples\Sources\Data\GeeBee2.bmp",0);<--You should use this first (You can find it in 'PureBasic\Examples\Sources\Data')
TransparentSpriteColor(1,RGB(255,0,255))

Repeat
    ExamineMouse():ExamineKeyboard()
    ClearScreen(RGB(100,50,50))
    DisplayTransparentSprite(1,100,100)
    If count<3650
      If GetTickCount_()-zeit > 10
     
        RotateSprite(1,2,count,1)
        ;RotateSprite(source,target,angle,scale)
        ;source - Number of existing sprite
        ;target - Number of (new)targetsprite
        ;angle  - 0 - 3600 tenth-degree
        ;scale  - 0 = target dimensions are same as source
        ;         1 = target dimension depends on rotation-radius
   
        count+50
        zeit=GetTickCount_()
      EndIf
    EndIf
    DisplayTransparentSprite(2,300+count/20,100+count/20)
    StartDrawing(ScreenOutput())
      DrawText(10, 500,"Angle= "+Str((count-50)/10)+" Degree")
    StopDrawing()
    FlipBuffers()
    Sleep_(1)
Until KeyboardPushed(#PB_Key_Escape)
End 

Publié : sam. 13/janv./2007 21:11
par graph100
eh bé tu me sauve là :D
vraiment merci !!

Publié : sam. 13/janv./2007 22:46
par Patrick88
ça vient du forum anglais...

Publié : dim. 14/janv./2007 18:42
par graph100
ca ne change rien !

c vrai que je ne pense jamais a aller voir lol

comme c une methode point par point y a des trou dans mon image ^^

Publié : lun. 15/janv./2007 18:04
par Patrick88