RotateImage ou GrabTransformedSprite
- DjPoke
- Messages : 121
- Inscription : mar. 02/nov./2010 13:53
- Localisation : Corte, Corse, France
- Contact :
RotateImage ou GrabTransformedSprite
Bonjour
Cela aurait été sympa de pouvoir faire tourner des images avec anti-aliasing de manière native.
Ou au moins, si cela n'est pas prévu au programme pour l'instant, cela serait sympa d'avoir la commande suivante :
GrabTransformedSprite()
Elle récupérerait un sprite avec ses transformations, rotation, scale, dans un sprite vierge sans aucune transformation.
Cela permettrait de faire une fonction RotateImage() facilement.
1) En convertissant une image vers un sprite, via StartDrawing(SpriteOutput()) et drawimage dedans.
2) Puis en appliquant les transformations au sprite et en faisant GrabTransformedSprite()
3) Enfin, StartDrawing(SpriteOutput()) et GrabDrawingImage. (ce dernier étant d’ailleurs buggé, il me semble, puisqu'il récupère l'image du sprite en symétrie verticale)
EDIT:
Ah, et autre requête s'il vous plait, pouvoir changer le point chaud des sprites.
Cela permettrait de les dessiner depuis leur centre, par exemple.
Cela aurait été sympa de pouvoir faire tourner des images avec anti-aliasing de manière native.
Ou au moins, si cela n'est pas prévu au programme pour l'instant, cela serait sympa d'avoir la commande suivante :
GrabTransformedSprite()
Elle récupérerait un sprite avec ses transformations, rotation, scale, dans un sprite vierge sans aucune transformation.
Cela permettrait de faire une fonction RotateImage() facilement.
1) En convertissant une image vers un sprite, via StartDrawing(SpriteOutput()) et drawimage dedans.
2) Puis en appliquant les transformations au sprite et en faisant GrabTransformedSprite()
3) Enfin, StartDrawing(SpriteOutput()) et GrabDrawingImage. (ce dernier étant d’ailleurs buggé, il me semble, puisqu'il récupère l'image du sprite en symétrie verticale)
EDIT:
Ah, et autre requête s'il vous plait, pouvoir changer le point chaud des sprites.
Cela permettrait de les dessiner depuis leur centre, par exemple.
Re: RotateImage ou GrabTransformedSprite
historiquement, il me semble que le point chaud d'un sprite interviens dans les collisionsDjPoke a écrit : Ah, et autre requête s'il vous plait, pouvoir changer le point chaud des sprites.
Cela permettrait de les dessiner depuis leur centre, par exemple.
pas dans la maniere dont il est dessiné ...!!??
sinon la plupart de tes demandes existent deja
par exemple notre ami BlendMan avait fait un super boulot (aidé de Typhon et de Comtois )
ici :
http://forums.purebasic.com/english/vie ... 60515b948f
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
- DjPoke
- Messages : 121
- Inscription : mar. 02/nov./2010 13:53
- Localisation : Corte, Corse, France
- Contact :
Re: RotateImage ou GrabTransformedSprite
Je ne vois pas en quoi ce code permet de faire tourner une image avec anti-aliasing et accélération 3d.
Pour ce qui est d'afficher un sprite depuis son centre, je sais déjà le faire.
Mais cela serait beaucoup plus confortable de pouvoir le faire directement, sans calculs, en décalant ce fameux point d'un certain offset via une simple commande au départ.
J'espère que les programmeurs de PureBasic entendront mes requêtes.
C'est très important pour moi, et pour un projet qui n'attend plus que cela pour que sa v1 soit terminée.
Pour ce qui est d'afficher un sprite depuis son centre, je sais déjà le faire.
Mais cela serait beaucoup plus confortable de pouvoir le faire directement, sans calculs, en décalant ce fameux point d'un certain offset via une simple commande au départ.
J'espère que les programmeurs de PureBasic entendront mes requêtes.
C'est très important pour moi, et pour un projet qui n'attend plus que cela pour que sa v1 soit terminée.
Re: RotateImage ou GrabTransformedSprite
[
voici comment decaler le l'offset d'un sprite
les calculs se font a l'interieur
Purebasic permet de faire des Procedures, et ainsi de faire tes propres fonctions ...
les calcul seront aussi a l'interieur ....
je vais donc t'apprendre que L'ecran , les Sprites ect... sont accelerés par ta carte 3D , depuis l'abandon des fonctions Sprite3D dans Purebasic !
pour l'anti aliasing, on a fait des codes sur ce forum qui gere l'antialiasing
en fait, un anti aliasing on en dispose d'un en natif avec la fonction "ResizeImage(#Image, Largeur, Hauteur [, Mode])"
tu dessine sur une image 2 fois plus grande, et tu la reduit , l'antialiasing se fera tout seul ! (effet Smoothing garanti )
un anti aliasing c'est aussi faisable avec un Flou gaussien , j'ai posté un code recemment avec une procedure de Flou gaussien ... du Soldat inconu
en fait, ce que tu veux, c'est du tout cuit , mais ça , fallait le preciser avant ....
DjPoke a écrit :Je ne vois pas en quoi ce code permet de faire tourner une image avec anti-aliasing et accélération 3d.
Pour ce qui est d'afficher un sprite depuis son centre, je sais déjà le faire.
Mais cela serait beaucoup plus confortable de pouvoir le faire directement, sans calculs, en décalant ce fameux point d'un certain offset via une simple commande au départ.
J'espère que les programmeurs de PureBasic entendront mes requêtes.
C'est très important pour moi, et pour un projet qui n'attend plus que cela pour que sa v1 soit terminée.
voici comment decaler le l'offset d'un sprite
Code : Tout sélectionner
;PureBasic 5.43 LTS
;Code de J. Baker
; http://forums.purebasic.com/english/viewtopic.php?f=16&t=66632&hilit=rotatesprite&sid=8ff58947d1bd28eea651a760515b948f
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "Rotate Sprite Offset", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)
CreateSprite(1, 256, 256)
StartDrawing(SpriteOutput(1))
Box(0,0,128,128,$FF0000)
Box(128,0,128,128,$00FF00)
Box(0,128,128,128,$0000FF)
Box(128,128,128,128,$00FFFF)
StopDrawing()
DisplayX.c = 256
DisplayY.c = 160
Offset.c = 2
Angle.c = 0
Pas=1
Repeat
Event = WindowEvent()
ClearScreen(0)
Offset.c =Offset.c +pas
If Offset.c >=255 or Offset.c <2:pas=-pas:Endif
Angle + 2 ;<--Adjusting the angle will adjust the speed
If Angle = 360
Angle = 0
EndIf
;RotateSprite(1, Angle, 0)
DisplaySprite(1, DisplayX + Cos(Radian(Angle)) * Offset, DisplayY + Sin(Radian(Angle)) * Offset)
FlipBuffers()
Forever
lorsque tu fais appel a une fonction Purebasic, tu fais appel a une Proceduresans calculs
les calculs se font a l'interieur
Purebasic permet de faire des Procedures, et ainsi de faire tes propres fonctions ...
les calcul seront aussi a l'interieur ....
Code : Tout sélectionner
de faire tourner une image avec anti-aliasing et accélération 3d.
pour l'anti aliasing, on a fait des codes sur ce forum qui gere l'antialiasing
en fait, un anti aliasing on en dispose d'un en natif avec la fonction "ResizeImage(#Image, Largeur, Hauteur [, Mode])"
tu dessine sur une image 2 fois plus grande, et tu la reduit , l'antialiasing se fera tout seul ! (effet Smoothing garanti )
un anti aliasing c'est aussi faisable avec un Flou gaussien , j'ai posté un code recemment avec une procedure de Flou gaussien ... du Soldat inconu
en fait, ce que tu veux, c'est du tout cuit , mais ça , fallait le preciser avant ....
Dernière modification par Zorro le dim. 09/juil./2017 11:23, modifié 2 fois.
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: RotateImage ou GrabTransformedSprite
ici un code de luis pour rotation d'image avec anti aliasing
http://forums.purebasic.com/english/vie ... 119895aa6b
http://forums.purebasic.com/english/vie ... 119895aa6b
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: RotateImage ou GrabTransformedSprite
je crois que c'était le souhait de DjPoke des la première ligne de son premier message.Zorro a écrit :en fait, ce que tu veux, c'est du tout cuit , mais ça , fallait le preciser avant ....
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: RotateImage ou GrabTransformedSprite
oui.. c'est pas faux en fait
bon je suis d'accord, il faut de l'antialiasing 3D , 4K et une fonction FPS() pour generer un fps mortel
bon je suis d'accord, il faut de l'antialiasing 3D , 4K et une fonction FPS() pour generer un fps mortel
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
- DjPoke
- Messages : 121
- Inscription : mar. 02/nov./2010 13:53
- Localisation : Corte, Corse, France
- Contact :
Re: RotateImage ou GrabTransformedSprite
PureBasic est au top ! C'est indiscutable.
Mais moi, tout ce que je veux, c'est qu'il continue d'évoluer dans le bon sens.
C'est pour cela que je propose de créer une ou deux petites commandes qui simplifieraient la vie à tous, y compris aux programmeurs débutants.
A l'origine, le BASIC était un langage pour les enfants, pour apprendre à programmer.
C'était donc le langage le plus simple après le LOGO. (le langage avec la petite tortue, lol)
Cela a bien évolué depuis.
Mais cela n'est pas une raison pour tout devoir coder soi-même, voir même devoir programmer en assembleur.
Si c'est pour cela, autant programmer en C++ avec SFML ou SDL2.
Et si je voulais programmer en assembleur, je m’achèterais un Amstrad CPC 464, ça me rappellerait des souvenirs.
S'il faut que j’achète une troisième licence PureBasic avec un 3ème email pour obtenir gain de cause, je le ferai, même si je n'ai que deux PC à la maison.
Mais cela serait vraiment sympa de penser à tout le monde.
En tant que client, j'estime avoir moi aussi mon mot à dire.
Après, si on ne m'écoute pas, tant pis !
Je pense que les programmeurs de PureBasic font ce qui leur semble logique.
Bon, cela dit, je vais quand même étudier le code de rotation d'images dont tu m'as donné le lien, car je n'ai absolument pas le choix.
Merci à toi pour cela !
Le code ne me parle pas du tout, malgré mes trente petites années de programmation.
Mais je vais devoir faire l'effort de le comprendre.
Mais moi, tout ce que je veux, c'est qu'il continue d'évoluer dans le bon sens.
C'est pour cela que je propose de créer une ou deux petites commandes qui simplifieraient la vie à tous, y compris aux programmeurs débutants.
A l'origine, le BASIC était un langage pour les enfants, pour apprendre à programmer.
C'était donc le langage le plus simple après le LOGO. (le langage avec la petite tortue, lol)
Cela a bien évolué depuis.
Mais cela n'est pas une raison pour tout devoir coder soi-même, voir même devoir programmer en assembleur.
Si c'est pour cela, autant programmer en C++ avec SFML ou SDL2.
Et si je voulais programmer en assembleur, je m’achèterais un Amstrad CPC 464, ça me rappellerait des souvenirs.
S'il faut que j’achète une troisième licence PureBasic avec un 3ème email pour obtenir gain de cause, je le ferai, même si je n'ai que deux PC à la maison.
Mais cela serait vraiment sympa de penser à tout le monde.
En tant que client, j'estime avoir moi aussi mon mot à dire.
Après, si on ne m'écoute pas, tant pis !
Je pense que les programmeurs de PureBasic font ce qui leur semble logique.
Bon, cela dit, je vais quand même étudier le code de rotation d'images dont tu m'as donné le lien, car je n'ai absolument pas le choix.
Merci à toi pour cela !
Le code ne me parle pas du tout, malgré mes trente petites années de programmation.
Mais je vais devoir faire l'effort de le comprendre.
Re: RotateImage ou GrabTransformedSprite
Disons que le fait que pb soit multiplateforme ne facilite pas la création de nouvelles fonctions graphiques accélérées... Ne peux-tu pas te débrouiller avec la lib vector ? Les ordis sont suffisamment puissants aujourd'hui que les sprites, ben... C'est du passé quoi.
Et puis, faut pas se leurrer, c'est la merde à implémenter, avec directx, c'était une voie de garage. Je pense qu'avec opengl ç'aurait été plus simple à maintenir. Mais comment savoir, alors ?
Et puis, faut pas se leurrer, c'est la merde à implémenter, avec directx, c'était une voie de garage. Je pense qu'avec opengl ç'aurait été plus simple à maintenir. Mais comment savoir, alors ?
- DjPoke
- Messages : 121
- Inscription : mar. 02/nov./2010 13:53
- Localisation : Corte, Corse, France
- Contact :
Re: RotateImage ou GrabTransformedSprite
Merci djes pour le conseil.
J'ai déjà essayé la lib vector mais sans succès.
Je ne comprend pas qu'est ce qui tourne et autour de quoi.
Du coup, j'obtiens des résultats assez surprenants au niveau des rotations, des positions, etc.
Je vais ré-essayer, mais hier j'ai perdu quelques heures de programmation pour revenir finalement en arrière.
EDIT:
Enfin, ça marche. Merci !!
J'ai déjà essayé la lib vector mais sans succès.
Je ne comprend pas qu'est ce qui tourne et autour de quoi.
Du coup, j'obtiens des résultats assez surprenants au niveau des rotations, des positions, etc.
Je vais ré-essayer, mais hier j'ai perdu quelques heures de programmation pour revenir finalement en arrière.
EDIT:
Enfin, ça marche. Merci !!
Code : Tout sélectionner
; Rotation d'image
Procedure.l RotateImage(id.l, angle.d)
Protected.l id2
Protected.d w, h, size
w = ImageWidth(id)
h = ImageHeight(id)
; on calcule la taille maximum de l'image tournée
; pour ne rien tronquer
size = Round(max(w, h) * Sqr(2), #PB_Round_Up)
id2 = CreateImage(#PB_Any, size, size, 32, #PB_Image_Transparent)
; On copie l'image envoyée au centre de l'image vierge
StartDrawing(ImageOutput(id2))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(id), (size-w)/2, (size-h)/2)
StopDrawing()
; On supprimer temporairement l'image envoyée
FreeImage(id)
; Et on la recrée, vierge, et à la bonne taille pour la rotation
id = CreateImage(#PB_Any, size, size, 32, #PB_Image_Transparent)
; On tourne l'image dont le bord est agrandi,
; et on la dessine, tournée
If StartVectorDrawing(ImageVectorOutput(id))
RotateCoordinates( size/2, size/2, angle) ; Faire tourner à partir du centre de l'image
MovePathCursor( 0, 0 ) ; Placer le curseur en haut à gauche
DrawVectorImage(ImageID(id2)) ; Dessiner
StopVectorDrawing()
EndIf
EndProcedure