Page 1 sur 1

HUD sur OpenScreen()

Publié : jeu. 27/août/2009 15:28
par Koganwel
Bonjour à tous.

Ce sprite :

Code : Tout sélectionner

CreateSprite(#MsgBox, scrW - HUDbox, scrH - MsgBox)
   StartDrawing(SpriteOutput(#MsgBox))
      Box(0,scrH - MsgBox, scrW - HUDbox, scrH, RGB(80,80,50))
      For i = 0 To 7 : LineXY(0,0+i,768, 0+i, RGB(50,50,255)) : Next i
   StopDrawing()

... est ajouté en bas de la surface de jeu pour en limiter la représentation :

DisplaySprite(#MsgBox, 0, MsgTexteX)

Hélas, la couleur de fond change obstinément pour du noir. Mes recherches dans le forum et dans CodeArchive (CAV.exe) ne m'ont pas permis encore de découvrir la solution.

Merci à vous.

Publié : jeu. 27/août/2009 16:02
par Anonyme
Bonjour et bienvenu.

Utilise les balise [ code ] [ /code ]
pour mettre en valeur ton code , c'est plus facile de le lire.

Ensuite , on ne peut pas répondre à ta question , tu as posté trop peu de code pour exposé un éventuel problème , et j'ai pas envi d'énumérer les probables causes d'un tel "bugs" , si il y en a un...


@+

Publié : jeu. 27/août/2009 17:22
par Koganwel
C'est une adaptation PureBasic d'un code DBPro de Phaelax(2005)

Code : Tout sélectionner

XIncludeFile "d:\PureBasic\Include\keys.pbi"
Enumeration
   #Void
   #Mur
   #ScrollUp      ; *** > sprites utilisés pour étudier le scrolling
   #ScrollDown
   #ScrollBoth
   #StopDown
   #StopUp
   #StopRight
   #StopLeft   ; < ***
   #Sol = 50   ; espace laissé pour des objets de collision
   #PlayerR
   #PlayerL
   #MsgBox
   #HUDbox
EndEnumeration
Read.i Bloc : Read.i MapW : Read.i MapH : Dim Allmap(MapH, MapW)
InitSprite() : InitMouse() : InitKeyboard() : UsePNGImageDecoder()
scrW = 1024  : scrH = 768 : OpenScreen( scrW, scrH, 32, "")
DisplayW = scrW / Bloc : DisplayH = scrH / Bloc : MsgBox = Bloc * 3 : HUDbox = Bloc * 4 
StopScrollRight = ((MapW * Bloc) - (DisplayW - 1)  * Bloc) + HUDbox 
StopScrollDown = ((MapH * Bloc) - (DisplayH - 1)  * Bloc) + MsgBox : GoScroll = Bloc * 4
ScrollRight = (scrW - HUDbox - PlayerSize) - GoScroll : ScrollDown = (scrH - MsgBox - PlayerSize) - GoScroll
MsgTexte = (DisplayH - 3) * Bloc : MX = Bloc : MY  = Bloc 
PlayerX = Bloc : PlayerY = Bloc : PlayerSpd = 3
MsgTexteX = scrH - MsgBox : HudX = scrW - HUDbox  ; positionner les deux HUD

LoadSprite(#Void, "d:\aaa\64\Void64.png") : LoadSprite(#Mur, "d:\aaa\64\Wall64_I.png") : LoadSprite(#ScrollUp, "d:\aaa\64\ScrollUp.png") : LoadSprite(#ScrollDown, "d:\aaa\64\ScrollDown.png") : LoadSprite(#ScrollBoth, "d:\aaa\64\ScrollBoth.png") 
LoadSprite(#StopDown, "d:\aaa\64\StopDown.png") : LoadSprite(#StopUp, "d:\aaa\64\StopUp.png") : LoadSprite(#StopRight, "d:\aaa\64\StopRight.png") : LoadSprite(#StopLeft, "d:\aaa\64\StopLeft.png")
LoadSprite(#Sol, "d:\aaa\64\Ground64_C.png") : LoadSprite(#PlayerR,"d:\aaa\32\RHeros32.png") : LoadSprite(#PlayerL,"d:\aaa\32\LHeros32.png")
;LoadSprite(#MsgBox,"d:\aaa\64\HUDhoriz.png")
LoadSprite(#HUDbox,"d:\aaa\64\HUDvert.png") : 
PlayerSize = SpriteHeight(#PlayerL)

CreateSprite(#MsgBox, scrW - HUDbox, scrH - MsgBox)
   StartDrawing(SpriteOutput(#MsgBox))
      Box(0,scrH - MsgBox, scrW - HUDbox, scrH, RGB(80,80,50))
      For i = 0 To 7 : LineXY(0,0+i,768, 0+i, RGB(50,50,255)) : Next i
   StopDrawing()
   
CreateSprite(#HUDbox, 256, scrH)
   StartDrawing(SpriteOutput(#HUDbox))
      Box(scrW - HUDbox, 0, scrW , scrH, RGB(80,80,50))
      For i = 0 To 7 : LineXY(0+i,0, 0+i, scrH, RGB(50,50,255)) : Next i
   StopDrawing()

;{ préparer Allmap(17, 16)
Restore Item
For y = 1 To MapH
    For x = 1 To MapW
        Read.i Item
        Allmap(y, x) = Item
    Next x
Next y
;}
Repeat
;{ keyboard et scroll
   ExamineKeyboard() : ExamineMouse()
   oldPlayerX = PlayerX : oldPlayerY = PlayerY
   If KeyUp : PlayerY - PlayerSpd : EndIf
   If KeyLeft : Compas = 1 : PlayerX - PlayerSpd : EndIf 
   If KeyDown : PlayerY + PlayerSpd : EndIf
   If KeyRight : Compas = 0 : PlayerX + PlayerSpd : EndIf
    
   posX = PlayerX : posY = PlayerY
   posX + (MX - Bloc) : posY + (MY - Bloc) 
   MapX1 = posX / Bloc + 1 : MapY1 = posY / Bloc + 1
   MapX2 = (posX + PlayerSize) / Bloc + 1 : MapY2 = posY / Bloc + 1
   MapX3 = posX / Bloc + 1 : MapY3 = (posY + PlayerSize) / Bloc + 1
   MapX4 = (posX + PlayerSize) / Bloc + 1 : MapY4 = (posY + PlayerSize) / Bloc + 1

   If Allmap(MapY1, MapX1) = 1 Or Allmap(MapY2, MapX2) = 1 Or Allmap(MapY3, MapX3) = 1 Or Allmap(MapY4, MapX4) = 1
        PlayerX = oldPlayerX : PlayerY = oldPlayerY
   EndIf
      ; ****** SCROLL
   ; LEFT
   If PlayerX < GoScroll
      If MX > Bloc
          PlayerX = GoScroll : MX - PlayerSpd
      Else
          MX = Bloc
      EndIf
   EndIf
    ; RIGHT
   If PlayerX > ScrollRight
       If MX < StopScrollRight
           PlayerX = ScrollRight
           MX + PlayerSpd
       Else
           MX = StopScrollRight
       EndIf
   EndIf
    ; DOWN
   If PlayerY > ScrollDown
       If MY < StopScrollDown
           PlayerY = ScrollDown
           MY + PlayerSpd
       Else
           MY = StopScrollDown
       EndIf
   EndIf
    ; UP
   If PlayerY < GoScroll
       If MY > Bloc
           PlayerY = GoScroll : MY - PlayerSpd
       Else
           MY = Bloc
       EndIf
   EndIf
   mapX = MX / Bloc : mapY = MY / Bloc
   OffsetBlocX = MX - mapX * Bloc : OffsetBlocY = MY - mapY * Bloc
;}
;{ afficher les sprites d'Allmap()
   For x = 0 To DisplayW
       For y = 0 To DisplayH
           a = mapX + x : b = mapY + y
           If a >= 0 And a <= MapW And b >= 0 And b <= MapH      ; pas de débordement d'index du Tableau
               Tuile = Allmap(b, a)      ; lidentification des sprites
           EndIf
           If Tuile => 0 : DisplaySprite(Tuile, x * Bloc - OffsetBlocX, y * Bloc - OffsetBlocY) : EndIf  ; actualiser l'objet découvert
       Next y
   Next x
;}
;{ DisplaySprite et DrawText
   If Compas 
       DisplayTransparentSprite(#PlayerL, PlayerX, PlayerY)
   Else
       DisplayTransparentSprite(#PlayerR, PlayerX, PlayerY)
   EndIf
   DisplaySprite(#MsgBox, 0, MsgTexteX) : DisplaySprite(#HUDbox, HudX, 0)
   StartDrawing(SpriteOutput(#MsgBox))
      FrontColor(RGB(255,255,255)) : BackColor(couleur2)
      DrawText(10, 30,"posX_Y : " + Str(posX) + ", " + Str(posY) + "    ")
      DrawText(10, 50,"playerX_Y : " + Str(playerX) + ", " + Str(playerY) + "    ")
   StopDrawing()

   FlipBuffers()
   Delay(1)
;}
Until KeyEscape Or MouseButton(2)

;{ datasection
DataSection
    Data.i 64, 17, 16
    Item:
    Data.i 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
    Data.i 1,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, 1
    Data.i 1,50,50, 7,50,50,50,50, 4,50,50,50,50, 8,50,50, 1
    Data.i 1,50, 6,50,50,50,50,50,50,50,50,50,50,50, 6,50, 1
    Data.i 1,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, 1
    Data.i 1,50, 50,3,50, 1, 1, 1,50, 1, 1, 1,50, 3,50,50, 1
    Data.i 1,50,50,50,50, 1, 0, 1,50, 1, 0, 1,50,50,50,50, 1
    Data.i 1,50,50,50,50, 1, 0, 1,50, 1, 0, 1,50,50,50,50, 1
    Data.i 1,50,50,50,50, 1, 0, 1,50, 1, 0, 1,50,50,50,50, 1
    Data.i 1,50,50,50,50, 1, 0, 1,50, 1, 0, 1,50,50,50,50, 1
    Data.i 1,50, 50,2,50, 1, 1, 1,50, 1, 1, 1,50, 2,50,50, 1
    Data.i 1,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, 1
    Data.i 1,50, 5,50,50,50,50,50,50,50,50,50,50,50, 5,50, 1
    Data.i 1,50,50, 7,50,50,50,50, 4,50,50,50,50, 8,50,50, 1
    Data.i 1,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, 1
    Data.i 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 EndDataSection
;}
 
En utilisant des Box dans StartDrawing(ScreenOuput()) plutôt que des sprites, tout fonctionne très bien avec DrawText(), c'est le DrawText sur SpriteOutput() qui efface la couleur de fond. Toutefois, sur un petit programme d'essai affichant simplement MsgBox et le texte écrit dans le sprite, là de nouveau, c'était nickel. Mais il n'y avait rien à cacher, comme dans le cas du gros programme : les deux HUD cachent 256 et 192 px de l'écran en cours, camouflant le scrolling à venir.

Je vous offre ici le code non commenté, donc le plus court. Est-il possible d'ajouter un ZIP contenant le tout ? Si non, pour compiler, il suffit essentiellement de prévoir des sprites pour #Mur, #Sol et #Player L et R si nécessaire, le reste sera noir. Dans le code étendu, je prévois une collision avec tout sprite en-dessous d'une valeur (théoriquement fixée à 49 - cf Enumeration, #Sol = 50)

Publié : jeu. 27/août/2009 17:34
par Anonyme
As tu regardé de DrawingMode() ?
là , le code fait mal à la tête :D

Publié : jeu. 27/août/2009 18:12
par Koganwel
Oui, Caporal, j'ai jeté un oeil vite devenu perplexe - il a failli prendre la clé des champs ! Ou bien j'ai mal lu, ou bien je n'étais pas inspiré de saisir la subtilité nécessaire, toujours est-il que je suis revenu bredouille, et quasiment borgne, d'Helpland.

Après deux jours de tâtonnement, bien que je n'étais pas prêt pour mon projet (je ne l'ai pas tout compris encore, j'ai fait appel à vous, aux programmeurs plus aguerris dont les souliers ont beaucoup voyagé, je croyais naïvement que « mon » problème trouverait aussitôt une solution chez les expérimentés (qui a vu du pays peut en parler), et que je pourrais passer à autre chose que de chasser le farfadet invisible et taquin.

Il me reste à fouiller encore, ou bien de me résoudre à utiliser en StartDrawing(ScreenOuput()) des Box, DrawText ne fait alors pas de chichi, et pour l'oeil, c'est du pareil au même. À noter que les sprites m'ont causé des soucis sous DB Classic, DBPro et PlayBasic. J'ai alors essayé du côté PureBasic, que j'ai adopté parce que j'aime écrire en ce langage - rien de tel qu'un bon sentiment pour ensoleiller nos jours intérieurs. Le 2D mieux maitrisé, j'irai voir, grâce à tmyke, du côté du 3D.

Publié : jeu. 27/août/2009 18:15
par Jacobus
Etant donné que tu utilises du PNG, tu devrais peut-être utiliser les fonctions 3D comme :

Code : Tout sélectionner

Resultat = LoadSprite(#Sprite, NomFichier$ , #PB_Sprite_AlphaBlending)
Extrait de la doc:
#PB_Sprite_AlphaBlending: Le sprite est créé avec le support de l'alpha-channel, le format d'image doit le gérer
(seul PNG et TIFF pour l'instant). Le mode #PB_Sprite_Texture doit être aussi spécifié, et le sprite
devra être affiché avec DisplaySprite3D().

Publié : jeu. 27/août/2009 18:28
par Anonyme
Le problème , c'est quoi exactement ?
le fond de ton sprite est noir ?

soit :

tu dessines une couleur "transparente" via box(0,0,SizeW,SizeH)
par exemple 255,0,255 ou $FF00FF ( c'est la meme chose )
et tu indique la couleur transparente de ton sprite avec :
TransparentSpriteColor(SpriteID,$FF00FF)
un coup de DisplayTransparentSprite() te fait tout le bouzin !


Moi aussi je viens de Dbpro ( y a qu'a voir mon tout premier post )
je ne suis pas déçu , je m'essaye en se moment à la serie des Blitz...
j'ai l'impression de régresser , la doc est pourrave , la syntaxe me rebute
par rapport à Purebasic , pas de pointeurs , bref il est à plaçer entre Dbpro & purebasic ( ce n'est que mon avis ) après c'est vrai que Pb est à la traine en 3D... mais n3xtd change la donne. A oui , j'adore la communauté FRANCAISE du blitz , mais dommage qu'ils ne soient pas sous PureBasic !
car leur forum regorge de bon code !

Publié : jeu. 27/août/2009 18:39
par Geo Trouvpatou
Il y avait un bug répertorié sur le forum Anglais.

J'ai essayé de recherché le post en question, mais nada.

Voici le code presqu'original sorti de ma musette qui montre qu'on a du noir à la place du texte.
Ce code fonctionne bien sous la 4.30, la 4.31, mais plus sous 440b1

Code : Tout sélectionner

Text$="PUREBASIC ROCKS"
If OpenWindow(0, 0, 0, 200, 200, "Testing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
;Debug TextWidth(Text$)
	;	Debug TextHeight(Text$)


	CreateImage(0,129,16)
	If StartDrawing(ImageOutput(0))
		tw=TextWidth(Text$):th=TextHeight(Text$)
		Debug TextWidth(Text$)
		Debug TextHeight(Text$)
		
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(0,0,Text$,$000000)
		StopDrawing()
	EndIf
	ButtonImageGadget(0,50,100,tw+6,th+4,ImageID(0))
	ImageGadget(1,10,10,400,400,ImageID(0), #PB_Image_Border)
	FreeImage(0):tw+6:th+4
	CreateImage(1,tw,th)
	If StartDrawing(ImageOutput(1))
		Box(0,0,tw,th,$CCCCCC)
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(3,3,Text$,$000000)
		DrawText(2,2,Text$,$FFFFFF)
		StopDrawing()
	EndIf
	ButtonImageGadget(0,10,10,tw,th,ImageID(1))
	Repeat : Event = WaitWindowEvent() : Until Event = #PB_Event_CloseWindow
EndIf
C'est peut-être ton problème ?

[EDIT] Ben zut alors, le code fonctionne aussi sous la 4.40b1 donc vaudrait mieux essayer de trouver le post original

Publié : jeu. 27/août/2009 19:10
par Geo Trouvpatou
Je viens de retrouver le post original (avec du mal) et maintenant cela fonctionne bien sous la 4.40b1
http://www.purebasic.fr/english/viewtop ... 132#296132

[EDIT] En faite le problème c'est que sans activer le thème XP en cliquant sur le bouton l'image disparait.

Du coup cela ne doit pas être le problème de Koganwel.

Publié : jeu. 27/août/2009 19:30
par Koganwel
Cpl.Bator : « Le problème , c'est quoi exactement ?
le fond de ton sprite est noir ? »

Considère ce programme minimal :

Code : Tout sélectionner

InitSprite() : InitKeyboard()
OpenScreen(1024, 768, 32, "")
CreateSprite(0, 400, 100)
   StartDrawing(SpriteOutput(0))
      Box(0,0, 400,100, RGB(80,80,50))
      For i = 0 To 7 : LineXY(0,0+i,400, 0+i, RGB(50,50,255)) : Next i
   StopDrawing()
Repeat
   ExamineKeyboard()
   ClearScreen(0)
   DisplaySprite(0, 0, 400)
   StartDrawing(SpriteOutput(0))
      FrontColor(RGB(255,255,255)) : BackColor(RGB(80,80,50))
      DrawText(10, 30,"posX_Y")
      DrawText(10, 50,"playerX_Y")
   StopDrawing()
   FlipBuffers()
   Delay(1)
Until KeyboardPushed(#PB_Key_Escape)
   
Il me remplit de joie, réalisant ce que je désirais. Ainsi donc, ÉCRIRE dans un sprite est l'enfance de l'art. Le sprite est créé, forme et couleur comprises, on écrit dedans et le tour est joué.

Par contre, dans le code complet, cela n'est plus aussi enfantin. Parce qu'il y a sous le sprite MsgBox une part de l'écran qui déroule ?

Oui, Caporal, j'utilise le noir comme couleur pour la transparence (si j'ai besoin de noir pour la couleur du dessin, j'utilise RGB(1,1,1) et voilà, l'oeil est satisfait, et PureBasic aussi. Dans le cas du sprite MsgBox, la transparence est sans utilité, ce sprite au contraire doit CACHER une portion de l'écran, aussi utilisè-je pour l'appeler DisplaySprite, sans l'infixe Transparent, n'en ayant pas l'utilité.

Ça fonctionne pour le code présenté ici, mais pas dans le gros (hum !) code, base d'un jeu à défilement pixel par pixel, à la Ultima et autres Zelda-like. J'avais choisi le code de Phaelax car le Player n'est pas fixé au centre de la fenêtre de type ViewPort, il peut se rendre jusqu'au bord de l'écran, s'il n'y avait pas de murs pour limiter sa soif de liberté (et traverser l'écran si on ne fait pas la vérification PlayerX ou Y < 0). De plus, ce code autorise la souplesse, c'est du Meccano, tout se calcule à partir de variables (qui portent bien leur nom, elles peuvent varier) et l'ensemble demeure conséquent.

Publié : jeu. 27/août/2009 19:51
par djes
C'est bien beau de savoir à peu près se servir du français, encore faut-il savoir se faire comprendre! Nous ne sommes pas télépathes! Et pour illustrer ton problème, qui se résume à
Hélas, la couleur de fond change obstinément pour du noir.
soit tu nous mets un bout de code qui ne fonctionne pas, soit tu nous mets un code complet in-testable puisque sans l'include et les graphs, soit tu nous mets un code qui fonctionne... 8O

Pourrais-tu faire un effort, en nous disant ce que tu veux, en nous fournissant un code (ou une archive) que nous puissions tester, et tu verras que ce sera vite résolu. Merci.

Publié : jeu. 27/août/2009 20:10
par Anonyme
A tout les coups

Code : Tout sélectionner

DrawingMode(#PB_2DDrawing_Transparent)
Avant l'écriture de tes textes fonctionne.
FrontColor(RGB(255,255,255)) : ;BackColor(RGB(80,80,50))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(10, 30,"posX_Y",$FFFFFF)
DrawText(10, 50,"playerX_Y",$FFFFFF)
Ton Back color ne sert plus a rien , ni le front d'ailleurs dans cette exemple.
vu que le texte est transparent.

Publié : jeu. 27/août/2009 22:00
par Koganwel
J'ai fait une copie no-media du programme.

Code : Tout sélectionner

Enumeration
   #Void
   #Mur
   #Sol
   #Player
   #MsgBox
   #HUDbox
EndEnumeration
Read.i Bloc : Read.i MapW : Read.i MapH : Dim Allmap(MapH, MapW)
InitSprite() : InitMouse() : InitKeyboard() : UsePNGImageDecoder()
scrW = 1024  : scrH = 768 : OpenScreen( scrW, scrH, 32, "")
DisplayW = scrW / Bloc : DisplayH = scrH / Bloc : MsgBox = Bloc * 3 : HUDbox = Bloc * 4 
StopScrollRight = ((MapW * Bloc) - (DisplayW - 1)  * Bloc) + HUDbox 
StopScrollDown = ((MapH * Bloc) - (DisplayH - 1)  * Bloc) + MsgBox : GoScroll = Bloc * 4
ScrollRight = (scrW - HUDbox - PlayerSize) - GoScroll : ScrollDown = (scrH - MsgBox - PlayerSize) - GoScroll
MsgTexte = (DisplayH - 3) * Bloc : MX = Bloc : MY  = Bloc 
PlayerX = Bloc : PlayerY = Bloc : PlayerSpd = 3
MsgTexteX = scrH - MsgBox : HudX = scrW - HUDbox 

CreateSprite(#MsgBox, scrW - HUDbox, scrH - MsgBox)
   StartDrawing(SpriteOutput(#MsgBox))
      Box(0,scrH - MsgBox, scrW - HUDbox, scrH, RGB(80,80,50))
      For i = 0 To 7 : LineXY(0,0+i,768, 0+i, RGB(50,50,255)) : Next i
   StopDrawing()

CreateSprite(#HUDbox, 256, scrH)
   StartDrawing(SpriteOutput(#HUDbox))
      Box(scrW - HUDbox, 0, scrW , scrH, RGB(80,80,50))
      For i = 0 To 7 : LineXY(0+i,0, 0+i, scrH, RGB(50,50,255)) : Next i
   StopDrawing()

CreateSprite(#Void, 64, 64)
   StartDrawing(SpriteOutput(#Void))
      Box(0, 0, 64, 64, RGB(0,0,0))
   StopDrawing()

CreateSprite(#Mur, 64, 64)
   StartDrawing(SpriteOutput(#Mur))
      Box(0, 0, 64, 64, RGB(80,80,50))
   StopDrawing()

CreateSprite(#Sol, 64, 64)
   StartDrawing(SpriteOutput(#Sol))
      Box(0, 0, 64, 64, RGB(70, 255, 170))
   StopDrawing()

CreateSprite(#Player, 32, 32)
   StartDrawing(SpriteOutput(#Player))
      Circle(15,15, 16, RGB(155,155,255))
      Circle(15,15, 10, RGB(255,0,255))
   StopDrawing()

PlayerSize = SpriteHeight(#Player)

Restore Item
For y = 1 To MapH
    For x = 1 To MapW
        Read.i Item
        Allmap(y, x) = Item
    Next x
Next y

Repeat

   ExamineKeyboard() : ExamineMouse() : ClearScreen(0)
   oldPlayerX = PlayerX : oldPlayerY = PlayerY
   If KeyboardPushed(#PB_Key_Up) : PlayerY - PlayerSpd : EndIf
   If KeyboardPushed(#PB_Key_Left) : PlayerX - PlayerSpd : EndIf 
   If KeyboardPushed(#PB_Key_Down) : PlayerY + PlayerSpd : EndIf
   If KeyboardPushed(#PB_Key_Right) : PlayerX + PlayerSpd : EndIf
    
   posX = PlayerX : posY = PlayerY
   posX + (MX - Bloc) : posY + (MY - Bloc) 
   MapX1 = posX / Bloc + 1 : MapY1 = posY / Bloc + 1
   MapX2 = (posX + PlayerSize) / Bloc + 1 : MapY2 = posY / Bloc + 1
   MapX3 = posX / Bloc + 1 : MapY3 = (posY + PlayerSize) / Bloc + 1
   MapX4 = (posX + PlayerSize) / Bloc + 1 : MapY4 = (posY + PlayerSize) / Bloc + 1

   If Allmap(MapY1, MapX1) = 1 Or Allmap(MapY2, MapX2) = 1 Or Allmap(MapY3, MapX3) = 1 Or Allmap(MapY4, MapX4) = 1
        PlayerX = oldPlayerX : PlayerY = oldPlayerY
   EndIf
      ; ****** SCROLL
   ; LEFT
   If PlayerX < GoScroll
      If MX > Bloc
          PlayerX = GoScroll : MX - PlayerSpd
      Else
          MX = Bloc
      EndIf
   EndIf
    ; RIGHT
   If PlayerX > ScrollRight
       If MX < StopScrollRight
           PlayerX = ScrollRight
           MX + PlayerSpd
       Else
           MX = StopScrollRight
       EndIf
   EndIf
    ; DOWN
   If PlayerY > ScrollDown
       If MY < StopScrollDown
           PlayerY = ScrollDown
           MY + PlayerSpd
       Else
           MY = StopScrollDown
       EndIf
   EndIf
    ; UP
   If PlayerY < GoScroll
       If MY > Bloc
           PlayerY = GoScroll : MY - PlayerSpd
       Else
           MY = Bloc
       EndIf
   EndIf
   mapX = MX / Bloc : mapY = MY / Bloc
   OffsetBlocX = MX - mapX * Bloc : OffsetBlocY = MY - mapY * Bloc

   For x = 0 To DisplayW
       For y = 0 To DisplayH
           a = mapX + x : b = mapY + y
           If a >= 0 And a <= MapW And b >= 0 And b <= MapH 
               Tuile = Allmap(b, a)
           EndIf
           If Tuile => 0 : DisplaySprite(Tuile, x * Bloc - OffsetBlocX, y * Bloc - OffsetBlocY) : EndIf 
       Next y
   Next x


   DisplayTransparentSprite(#Player, PlayerX, PlayerY)
   DisplaySprite(#MsgBox, 0, MsgTexteX) :  DisplaySprite(#HUDbox, HudX, 0)
   StartDrawing(SpriteOutput(#MsgBox))
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(10, 30,"posX_Y",RGB(255,255,255))
      DrawText(10, 50,"playerX_Y",RGB(255,255,0))
   StopDrawing()

   FlipBuffers()
   Delay(1)
Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(2)

DataSection
    Data.i 64, 17, 16
    Item:
    Data.i 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    Data.i 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1
    Data.i 1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1
    Data.i 1,2,1,2,2,2,2,2,2,2,2,2,2,2,1,2,1
    Data.i 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1
    Data.i 1,2,2,1,2,1,1,1,1,1,1,1,2,1,2,2,1
    Data.i 1,2,2,2,2,1,0,1,2,1,0,1,2,2,2,2,1
    Data.i 1,2,2,2,2,1,0,1,2,1,0,1,2,2,2,2,1
    Data.i 1,2,2,2,2,1,0,1,2,1,0,1,2,2,2,2,1
    Data.i 1,2,2,2,2,1,0,1,2,1,0,1,2,2,2,2,1
    Data.i 1,2,2,2,2,1,1,1,2,1,1,1,2,2,2,2,1
    Data.i 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1
    Data.i 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1
    Data.i 1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1
    Data.i 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1
    Data.i 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
 EndDataSection
@Caporal : j'ai incorporé tes corrections, mais MsgBox est déjà noir de fond à l'application, ce n'est pas l'ajout du texte qui est en cause - facile à vérifier en « commentant » le StartDrawing().

Publié : jeu. 27/août/2009 22:53
par Anonyme
J'ai compris ton soucis , c'est le bordel dans le début de ton code , tu t'es perdu avec les coordonnées


pour ton sprite #MsgBox
il fait 768 pixels par 576 , soit , tu dessines une box en Y à 576 de taille 768
donc impossible de voir la box , elle est hors du sprite ! je ne vais pas plus loin , problème de coordonées.

Code : Tout sélectionner

      Box(0,0, SpriteWidth(#msgbox),SpriteHeight(#MsgBox), RGB(80,80,50))
      For i = 0 To 7 : LineXY(0,i,768, i, RGB(50,50,255)) : Next i
For / next sert à quoi ?
a dessiner une barre de titre ? , tu t'emmerde la vie
un box , suffit , surtout que ton for / next te sert même pas à faire un dégradé.


Aussi , avant que tu post , " je comprends pas , mon texte est bizarre quand je change le contenu de celui ci "


J'ai vu que dans la boucle principale , tu redessine dans se fameux sprite #MsgBox , tu dessines juste du texte , si ton texte change , comme l'image du sprite n'a pas été remplaçer par un fond nouveau , tu auras les traces de ton ancien texte ! ;)


@+

Publié : ven. 28/août/2009 4:25
par Koganwel
Caporal, j'ai réglé ce faux problème d'écriture de texte dans un sprite, ne réalisant pas que mon passage de ScreenOutput() à SpriteOutput() devait affecter les calculs de placement du texte DANS le sprite et non SUR l'écran.

Effectivement, ma trop rapide adaptation du code initial pour un code no-media m'a fait créer des sprites inappropriées. J'utilise des variables afin que tout changement de MsgBox et HUDbox n'affecte pas l'ensemble.

Ta suggestion du DrawingMode ne fonctionne pas - tu peux le mettre dans le code et constater par toi-même.

Mes changements sont :

Code : Tout sélectionner

CreateSprite(#MsgBox, scrW - HUDbox, MsgBox)
   StartDrawing(SpriteOutput(#MsgBox))
      Box(0,0, 768, 192, RGB(40,40,150))
      Box(0,0, 768, 8, RGB(50,50,255))
   StopDrawing()

CreateSprite(#HUDbox, HUDbox, scrH)
   StartDrawing(SpriteOutput(#HUDbox))
      Box(0, 0, HUDbox , scrH, RGB(40,40,150))
      Box(0,0, 8, ScrH, RGB(50,50,255))
   StopDrawing()

; et

   StartDrawing(SpriteOutput(#MsgBox))
      FrontColor(RGB(255, 255, 255)) : BackColor(RGB(40, 40, 150))
      DrawText(10, 20,"posX_Y : " + Str(posX) + ", " + Str(posY) + "  ")
   StopDrawing()

Notre bref dialogue ne fut pas vain, je devins mieux inspiré, j'avais créé ce faux problème, dorénavant je serai plus attentif. Je t'en remercie.