[RESOLU]Probleme Sprite / screen / gadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
microu
Messages : 19
Inscription : lun. 12/mai/2008 14:22

[RESOLU]Probleme Sprite / screen / gadget

Message par microu »

bonjour,
Voila je vais pas rentrer dans les détails mais je souhaiterais créer un petit jeux vidéo, j'ai donc essayer de faire simple pour le début ( un personnage qui se déplace) :

J'ai d'abords essayer avec les sprites, mais je n'y ai rien compris ( et j'ai pourtant passé plusieurs heures dessus).
[ Si quelqu'un avait l'amabilité de m'expliquer =D ]
J'ai donc ensuite essayer de faire un simple gadget, qui lorsque j'appuerais sur la gauche ou la droite bougerais de quelque pixel, Mais le probleme c'est que windowedscreen me fait un degrader et cache mon imagegadget ='( :

Code : Tout sélectionner

InitKeyboard()
InitSprite()

OpenWindow(0,150,100,800,600,"Allez let's go") And CreateGadgetList(WindowID(0))
OpenWindowedScreen(WindowID(0),0,0,1,1,1,0,0)

LoadImage(0, "C:\perso1.bmp")    
perso1 = ImageGadget(0, 20, 20, 203, 143, ImageID(0))

Repeat 
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
End
EndIf
event = WaitWindowEvent() : Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

L'image en question :

http://lovesteam.olympe-network.com/perso1.bmp

Voila je vous remercie :) ... ++
Dernière modification par microu le mer. 25/juin/2008 18:07, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Salut,

As tu regardé la section tuto ?
N'est-ce pas ça dont tu as besoin ?

http://www.purebasic.fr/french/viewtopic.php?t=6648
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@microu

1) Ne mélange pas les gadgets avec le Screen graphique ! Utilise les Sprites !

2) /!\ Attention : Le DisplaySprite() se met HORS d'une boucle de dessin :

Code : Tout sélectionner

StartDrawing(ScreenOutput() )
StopDrawing()
Sinon zéro. Nada. Que dalle (Donc difficulté avec les sprites)...

3) Voici un code d'exemple rudimentaire pour faire du défilement avec sprites.
* Toute la Map est dans le tableau Tile(x,y).
* La structure TILE est prête à recevoir d'autres attributs que No (numéro)
* Les 2 sprites d'exemple sont les N°1 et N°2 (1 = vide; 2 = brique)
* La Map fait 16 écrans de large par 16 écrans de haut
* Tu peux repérer là où toutes les briques sont au hasard : c'est là que tu chargeras une Map
* En gros, tu rajoutes des sprites au fur et à mesure et tu construit ta scène dans le tableau Tile(x, y)
* xCount/yCount = nb de colonne/nb de ligne
* xsCount/ysCount = nb de colonnes à l'écran/nb de lignes

>> N'hésite pas à me dire si ça bugue ou pas.

Code : Tout sélectionner

; Ollivier
; Juin 2008
  wTile = 48
  InitSprite()
  InitKeyboard()
  ExamineDesktops()
  dw = DesktopWidth(0)
  dh = DesktopHeight(0)
  dd = DesktopDepth(0)
  OpenScreen(dw, dh, dd, "Sprites et défilements")
  For I = 1 To 2
    CreateSprite(i, wTile, wTile)
  Next
  StartDrawing(SpriteOutput(1) )
    Box(0, 0, wTile, wTile, $BFBFBF)
  StopDrawing()
  StartDrawing(SpriteOutput(2) )
    Box(0, 0, wTile, wTile, $FFFFFF)
    Line(0, 0, wTile, wTile, $0)
    Line(47, 0, -wTile, wTile, $0)
    Line(0, 0, wTile, 0, $0)
    Line(0, 0, 0, wTile, $0)
    Line(47, 0, 0, wTile, $0)
    Line(0, 47, wTile, 0, $0)
    For i = 1 To (wTile / 2) - 2
      Box(i + 1, i, wTile - 2 * i - 2, 1, RGB(0, 255, 255) )
      Box(i + 1, wTile - i - 1, wTile - 2 * i - 2, 1, RGB(0, 0, 255) )
      Box(i, i + 1, 1, wTile - 2 * i - 2, RGB(0, 160, 160) )
      Box(wTile - i - 1, i + 1, 1, wTile - 2 * i - 2, RGB(0, 160, 160) )
    Next 
  StopDrawing()
  Structure TILE
    No.L
  EndStructure
  xsCount = dw / wTile
  ysCount = dh / wTile
  xsLimit = xsCount - 1
  ysLimit = ysCount - 1
  xCount = xsCount * 16
  yCount = ysCount * 16
  xLimit = xCount - 1
  yLimit = yCount - 1
  Global Dim Tile.TILE(xLimit, yLimit)
  For y = 0 To yLimit
    For x = 0 To xLimit
      Tile(x, y)\No = 1
      If Random(7) = 0: Tile(x, y)\No = 2: EndIf
      If ((x < 2) Or (y < 2) ) Or ((x > xLimit - 2) Or (y > yLimit - 2) )
        Tile(x, y)\No = 2
      EndIf
    Next
  Next

Repeat
  Delay(10)
  FlipBuffers()
  ClearScreen(0)
  For y = 0 To ysLimit + 2
    For x = 0 To xsLimit + 2
      vx = x - ShRX
      vy = y - ShRY
      DisplaySprite(Tile(vx, vy)\No, x * wTile - ShX, y * wTile - ShY)
    Next
  Next
  StartDrawing(ScreenOutput() )
  DrawText(10, 0, "")
  StopDrawing()
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Right)
    If AccX < (wTile / 2)
      AccX + 2 
    EndIf
  EndIf
  If AccX > 0
   If ShRX > 0 - (xCount - xsCount - 2)
    If ShX < wTile
      ShX + AccX
    Else
      ShX - wTile     
      ShX + AccX
      ShRX - 1
    EndIf
   EndIf
   AccX - 1
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    If AccX > (0 - (wTile / 2) )
      AccX - 2 
    EndIf
  EndIf
  If AccX < 0
   If ShRX < 0
    If ShX > 0
      ShX + AccX
    Else
      ShX + wTile     
      ShX + AccX
      ShRX + 1
    EndIf
   EndIf
   AccX + 1
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    If AccY < (wTile / 2)
      AccY + 2
    EndIf
  EndIf
  If AccY > 0
   If ShRY > 0 - (yCount - ysCount - 2)
    If ShY < wTile
      ShY + AccY
    Else
      ShY - wTile     
      ShY + AccY
      ShRY - 1
    EndIf
   EndIf
   AccY - 1
  EndIf
  If KeyboardPushed(#PB_Key_Up)
    If AccY > (0 - (wTile / 2) )
      AccY - 2
    EndIf
  EndIf
  If AccY < 0  
   If ShRY < 0
    If ShY > 0
      ShY + AccY
    Else
      ShY + wTile     
      ShY + AccY
      ShRY + 1
    EndIf
   EndIf
   AccY + 1
  EndIf
Until KeyboardPushed(#PB_Key_Escape) 
microu
Messages : 19
Inscription : lun. 12/mai/2008 14:22

Message par microu »

Merci pour vos réponse, j'ai compris au bout d'un moment et avec l'aide d'un ami qu'en effet les gadget n'était pas approprié dans ce cas =s ...
Il m'a aussi expliquer l'utilisation des sprites qui est en fait très simple [ je suis nul ^^ ]...

@Ar-S : Non ce n'est pas tout à fait ce que je voulait, mais merci quand même ^^

@Ollivier : Ton code marche très bien ^^

Donc voila c'est résolu, merci a tous ! ++
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bon courage à toi !
Répondre