Position sprite

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Position sprite

Message par Ekim »

Oui c'est précisément ça que je voulais) il ne me reste plus qu'à comprendre les arcanes de ton code @falsam,
encore merci à vous tous pour votre aides)
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Position sprite

Message par Micoute »

C'est vrai que j'avais oublié qu'on ne donne pas de viande à un bébé, mais le code que je t'ai donné pourra, j'en suis sûr, te servir plus tard quand tu te seras "aguerri".
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Position sprite

Message par boby »

Juste un petit conseil à apporter, vue que tu es débutant, je te conseil FORTEMENT de commencer TOUS tes codes par

Code : Tout sélectionner

EnableExplicit
Ca te forcera à déclarer toutes tes variables, une TRÉS bonne habitude à prendre, PureBasic crée automatiquement une variable que tu appel pour la première fois si tu ne l'as pas déjà déclarée mais c'est loins d'être le cas de tous les languages (c'est même plutot une norme de devoir déclarer ses variables).
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Position sprite

Message par falsam »

Tu as parfaitement raison. Je l'ai rajouté à mon code et heureusement toutes les variables sont déclarées ^-^
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%
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Position sprite

Message par comtois »

Basé sur le code de falsam, on peut jouer au chat et à la souris

Code : Tout sélectionner

EnableExplicit

; Structure d'un vecteur 2D
Structure Vector2
  x.f
  y.f
EndStructure

; Structure minimum d'un sprite
Structure newSprite
  id.i
  position.Vector2
EndStructure

;Definition du sprite
Global.newSprite Chat,Souris

; Définition de la vitesse de déplacement
Global Speed.f = 3

; Sommaire de l'application
Declare   Start()
Declare NormalizeVector(*v.Vector2)

Start()

Procedure Start()
  Protected Direction.Vector2
  Protected DistanceNonNulle
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  OpenWindow(0, 0, 0, 0, 0, "FullScreen", #PB_Window_BorderLess | #PB_Window_Maximize)
  OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0))
  
  ;Chargement du sprite (ici on prendra une image figurant dans les exemples de PureBasic)
  UsePNGImageDecoder()
  Chat\id = LoadSprite(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\world.png", #PB_Sprite_AlphaBlending)
  Chat\position\x = 10
  Chat\position\y = 10
  
  Souris\id = LoadSprite(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\Drive.bmp")
  
  Repeat
    Repeat : Until WindowEvent() = 0
    
    ClearScreen(RGB(55, 55, 55))
    ExamineMouse()
    Souris\position\x = MouseX()
    Souris\position\y = MouseY()
    
    ;Direction à suivre pour rejoindre la souris
    Direction\x =   Souris\position\x - Chat\position\x 
    Direction\y =   Souris\position\y - Chat\position\y
    DistanceNonNulle = NormalizeVector(@Direction)
    
    DisplaySprite(Chat\id, Chat\position\x, Chat\position\y)
    DisplaySprite(Souris\id, Souris\position\x, Souris\position\y)
    
    ;Calculer la nouvelle position du sprite
    If DistanceNonNulle
      Chat\position\x + Direction\x * Speed
      Chat\position\y + Direction\y * Speed
    EndIf
    
    ExamineKeyboard()
    FlipBuffers()
  Until KeyboardReleased(#PB_Key_Escape)
EndProcedure

Procedure NormalizeVector(*V.Vector2)
  Define.f magSq, oneOverMag
  
  magSq = *V\x * *V\x + *V\y * *V\y
  If magsq > 0
    oneOverMag = 1.0 / Sqr(magSq)
    *V\x * oneOverMag
    *V\y * oneOverMag
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre