Page 2 sur 3

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 10:16
par Zorro
Je me disais, que le clipSprite pour un effet de ce genre , c'etait pas evident a mettre en place :
(Attention Mal de Mer assuré )

Code : Tout sélectionner

macro M :macro:endmacro :M St:StartDrawing:Endmacro:
M TS:TransparentSpriteColor:Endmacro:M Sd:StopDrawing:EndMacro:
M DTS:DisplayTransparentSprite:Endmacro:M CS:CreateSprite:Endmacro:
M VS:val(StringField:Endmacro:M AA:amplitude:Endmacro
Enumeration:#Fenetre_principale:#sprite_fond;;;;;
#sprite_milieu:#sprite_devant:EndEnumeration;;;;;;;;;;;;;;;;;;;;;;;;;;
Declare.s F_(amplitude,x,y,angle):Declare CM(Adr$);;
Define.l EV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Global StyleFen.i=#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered;
If Not (InitSprite() And InitSound() And InitKeyboard()):End:EndIf;;;;
Adr.s="http://multor.free.fr/Modules/VERSENIE.XM";;;;;;;;;;;;;;;;;;;;;
mus=CM(Adr.s):PlayMusic(Mus);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OpenWindow(#Fenetre_principale,0,0,800,600,"Rotatif scroll",StyleFen);
If OpenWindowedScreen(WindowID(#Fenetre_principale),0,0,800,600,1,0,0)
CS(#sprite_fond,900,900);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
St(SpriteOutput(#sprite_fond)):For x=1 to 900-1 Step 10;;;;;
box(x,1,10,900,RGB(random(80,10),random(80,10),random(80,10))):Next x;
SD():CS(#sprite_milieu,900,900,;;;;;;;;;;;;;;;;;;;;
#PB_Sprite_AlphaBlending):St(SpriteOutput(#sprite_milieu));;
For x=1 to 900-1 Step 100:box(x,1,50,900,rgb(0,random(255,50),0));;;;;
Next x:SD():CS(#sprite_devant,900,900,;;;;;;;;;;;;;
#PB_Sprite_AlphaBlending):St(SpriteOutput(#sprite_devant));;
For i=1 to 500:Circle(Random(900-40),Random(900-40),10,Rgb(random(255,
50),random(255,50),random(255,50))):Next i:SD():Repeat:Repeat
EVent=WaitWindowEvent(2):Select EVent:Case #PB_Event_CloseWindow:End;;
EndSelect:Until EVent=0:retour.s=F_(50,-50,-100,anglef);;;;;;;;;
xf=VS(retour.s,1,"|")):yf=VS(retour.s,2,;;;;
"|")):anglef=anglef+2:DTS(#sprite_fond,xf,yf);;;;
retour.s=F_(100,-50,-100,anglem):xm=VS(retour.s,1,;
"|")):ym=VS(retour.s,2,"|")):anglem=anglem-3;;;;;;;;;;;;;
TS(#sprite_milieu,$0);;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DTS(#sprite_milieu,xm,ym,200);;;;;;;;;;;;;;;;;;;;
retour.s=F_(30,-50,-100,angled):xd=VS(retour.s,1,;;
"|")):yd=VS(retour.s,2,"|")):angled=angled+4;;;;;;;;;;;;;
TS(#sprite_devant,$0);;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DTS(#sprite_devant,xd,yd,150):FlipBuffers();;;;;;
ClearScreen($0):ForEver:Else:Debug "plante !!":End:EndIf;;;;;;;;;;;;;;
Procedure.s F_(AA,x,y,angle):xf=x+;;;;;;;;;;;;;;;;;;;;;;;
Cos(Radian(Angle))*AA:yf=y+Sin(Radian(Angle))*AA;;;;;;;;
ProcedureReturn str(xf)+"|"+str(yf):EndProcedure;;;;;;;;;;;;;;;;;;;;;;
Procedure CM(Adr$):InitNetwork():Protected Music;;;;;;;;;;
*Buffer=ReceiveHTTPMemory(Adr$):If*Buffer:Music=CatchMusic(#PB_Any,;;;
*Buffer,MemorySize(*Buffer)):FreeMemory(*Buffer):ProcedureReturn Music
Else:ProcedureReturn #false:EndIf:EndProcedure;;;;;;;;;;;;;;;;;;;;;;;;

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 10:16
par falsam
Merci djes. Jouer avec les coordonnées UV me semble pas optimum pour faire du scrolling horizontal et/ou vertical d'un sprite en particulier pour scroller 5 layers en meme temps.

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 11:15
par Ar-S
Et mon second code ne te va pas ?

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 11:19
par Zorro
@Ar-s : ce matin et hier, j'avais pas vraiment compris ton code
je pensai que tu clipais uniquement pour faire entrer ton scroll dans la fenetre :roll:
j'avais pas percuté que tu clippais, mais que tu reposais au debut (pos 0 )
donc j'avais commencé une reponse en disant que ton clip ne servait a rien :mrgreen:

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 11:25
par djes
falsam a écrit :Merci djes. Jouer avec les coordonnées UV me semble pas optimum pour faire du scrolling horizontal et/ou vertical d'un sprite en particulier pour scroller 5 layers en meme temps.
Pourquoi ?

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 11:32
par falsam
@Djes: La manipulation passe bien par transform Sprite ?

@Ar-s : Avant de te crier ma joie je m'assure que ton code répond à toutes mes attentes :wink:

- Scroll Vertical
- Scroll Horizontal
- Scroll Horizontal et Vertical.
- Zoom
- Rotation

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 13:22
par djes
falsam a écrit :@Djes: La manipulation passe bien par transform Sprite ?
C'est plutôt en 3D. Avant on jouait directement avec les structures internes de PB pour les coordonnées UV des sprites, mais je ne sais pas si c'est toujours faisable. Sans doute les fonctions clipsprite() et transformsprite() utilisent-elles ce "stratagème", mais sans savoir comment en interne, c'est difficile de donner une méthode fiable !

Re: Sprite Scrolling

Publié : lun. 25/juil./2016 14:38
par Bernie
Merci pour vos codes j'en prend pas mal .

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 9:32
par blendman
Jouer avec les coordonnées UV me semble pas optimum pour faire du scrolling horizontal et/ou vertical d'un sprite en particulier pour scroller 5 layers en meme temps.
En fait, ça dépend surtout de la taille des images qu'on scroll.
J'ai testé sur certains de mes jeux un scrolling vertical de 3 ou 4 images en 1024*600 et ça peut vite faire ramer sur des petites configurations comme mon pc.
A ce niveau-là, étrangement, utiliser 2 fois la même image l'une après l'autre semble être moins gourmand (toujours sur mon pc en carton ^^).

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 9:46
par Zorro
blendman a écrit :En fait, ça dépend surtout de la taille des images qu'on scroll.
J'ai testé sur certains de mes jeux un scrolling vertical de 3 ou 4 images en 1024*600 et ça peut vite faire ramer sur des petites configurations comme mon pc.
A ce niveau-là, étrangement, utiliser 2 fois la même image l'une après l'autre semble être moins gourmand (toujours sur mon pc en carton ^^).
un pc sans carte graph correcte, ok , mais de nos jours beaucoup ont une petite carte grah avec de la ram dessus
(bon pas le portable que j'utilise actuellement :roll: )

ce qui prends du temps c'est pas le scrolling, mais le Stock/transfert des images .
l'image qu'on transfert aux coordonées hors ecran ...avant de la faire apparaître ...
pour le mouvement,je crois, qu'il vaux mieux avoir des images (ou sprites ) de taille compatible puissance 2
les processeurs travaillent mieux avec ...
plus la taille des images est grande, plus ça prends du temps ... (sur de petites config )

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 10:12
par falsam
Hello ici.

Encore merci pour tous ces exemples. Mais qui ne répondent pas à ma demande de pouvoir scroller dans un sprite horizontalement et/ou verticalement.

-Le scroll n'occupe pas forcément toute la largeur de l'ecran
-L'image à scroller avoir la même largeur que le sprite voir même plus petite.

Ne réussissant pas à le faire en 2D voila ce que je souhaite faire en 2D avec ce code

Code : Tout sélectionner

InitEngine3D() : InitKeyboard() : InitSprite()

window = OpenWindow(#PB_Any,0,0,800,600,"Scrolling Sprite")
OpenWindowedScreen(WindowID(window),0,0,800,600)
Add3DArchive(#PB_Compiler_Home + "Examples\3D\Data\Textures\", #PB_3DArchive_FileSystem)

Mesh = CreatePlane(#PB_Any, 1, 1, 1, 1, 1, 1)
Texture = LoadTexture(#PB_Any, "MRAMOR6X6.jpg")
Material1 = CreateMaterial(#PB_Any,TextureID(texture))
Material2 = CreateMaterial(#PB_Any,TextureID(texture))
Material3 = CreateMaterial(#PB_Any,TextureID(texture))

Sprite1 = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material1), -2, 0, 0)
RotateEntity(Sprite1, 90, 0, 0, #PB_Relative)

Sprite2 = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material2), 0, 0, 0)
RotateEntity(Sprite2, 90, 0, 0, #PB_Relative)

Sprite3 = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material3), 2, 0, 0)
RotateEntity(Sprite3, 90, 0, 0, #PB_Relative)

CreateLight(#PB_Any,RGB(151, 251, 151), 0, 0, 50)
WorldShadows(#PB_Shadow_Additive)

Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Camera, 0, 0, 5)
CameraBackColor(Camera, RGB(128, 128, 128))
CameraLookAt(camera, 0, 0, 0)

While #True  
  Event = WindowEvent()
  
  ScrollMaterial(Material1, 0.2, 0, #PB_Material_Animated)
  ScrollMaterial(Material2, 0, 0.2, #PB_Material_Animated)
  ScrollMaterial(Material3, 0.2, 0.2, #PB_Material_Animated)
  
  ExamineKeyboard()  
  
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf  
      
  RenderWorld()
  FlipBuffers()
Wend
PS ce code est est un exemple de ce que je souhaite faire en 2D

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 10:49
par Ar-S
Du coup pourquoi ne pas le faire en 3D en simulant de la 2D ?

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 10:55
par falsam
Ar-S a écrit :Du coup pourquoi ne pas le faire en 3D en simulant de la 2D ?
Parce que si j'utilise que l'axe x et y les superposition d'images peuvent poser des soucis d'affichage.

Exemple : Remplace la ligne

Code : Tout sélectionner

Sprite2 = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material2), 0, 0, 0)
par

Code : Tout sélectionner

Sprite2 = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material2), 2, 0, 0)
Tu devrais avoir un effet d'affichage marrant mais pas souhaité.

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 10:59
par Ar-S
Je code jamais en 3D alors je dis peut être une connerie mais en jouant sur le Z tu crées comme des "calques" en affichant ton scroll plus loin que ton sprite principale etc.. ? Sprite2 = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material2), 0, 0, 2) ou -2 pour eloigner

Re: Sprite Scrolling

Publié : mer. 27/juil./2016 11:11
par falsam
@Ar-s: Oui je pourrais jouer avec l'axe z mais dans ce cas je ne peux plus tester les collisions de sprites.