[Jeu] Perso qui suit la souris

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
lyn666
Messages : 13
Inscription : lun. 13/juin/2011 8:57

[Jeu] Perso qui suit la souris

Message par lyn666 »

Bonjour,

Avant de parler de mon problème, je vais vous faire une petite présentation (je n'ai pas trouvé de post de présentation. Si vous ne voulez pas lire ma présentation, vous pouvez allez directement vers mon problème) :
Étant à l'origine un utilisateur de "Game Maker", j'ai décider suite à un post de blendman (sur un autre forum) sur "PureBasic", d'apprendre ce langage. Je suis, en ce moment, en train de faire un jeu sur le logiciel "Game Maker", mais le problème est que je suis assez limité dans la création de mon jeu et je voudrait pouvoir le faire multi-plateforme. C'est en partie pour ça que PureBasic m’intéresse.
Je trouve ce langage plutôt simple (enfin, il faut dire qu'il y a quelques années, j'ai essayé d'apprendre quelque uns de ces petit frère : VBA, VBS, Rapid Q, ... Mais je n'avais pas internet à l'époque, donc je n'avais pas beaucoup d'aide pour ces langages). Il est multi-plateforme et à l'air puissant comme je veux pour mon jeu (je n'aime pas devoir me limité à cause de tel ou tel contrainte).

Merci (et désolé :oops:) pour ceux qui ont lu ma présentation.
Maintenant, place à mon problème :

Comme je l'ai dit plus haut je programme un jeu (un RPG) et je voudrait faire un système de perso qui suit la souris.
J'avais réussi à le faire en "GML", mais je voudrai pouvoir faire ce système en "PureBasic" (étant débutant, je ne sait pas comment faire).
Je vous explique un peu le principe, quand j’appuie sur :
- Up, le perso avance vers le curseur de la souris
- Down, il recule
- Left ou right, il va sur la gauche ou la droite (tout en fixant le curseur)
- Même quand il ne bouge pas, je veux qu'il se tourne vers le curseur
Et le tout en 4 images (face, côtés, dos, un sprite de RPG normal).

Si ça peut aider je laisse le code en "GML" (Right_Skin_Girl_Run and co. sont les sprites) :

Code : Tout sélectionner

direction=point_direction(x,y,mouse_x,mouse_y)
if(direction>315 || direction<45) sprite_index=Right_Skin_Girl_Run
else
 {if direction<135 sprite_index=Up_Skin_Girl_Run
 else
  {if direction<225 sprite_index=Left_Skin_Girl_Run
  else sprite_index=Down_Skin_Girl_Run
  }
 }
Et le code de quand j’appuie sur la touche correspondante pour que le sprite avance (les "//" correspond aux commentaire en GML).

Code : Tout sélectionner

// Touche Left
direction=(direction-90+360) mod 360;
    x+=lengthdir_x(3,direction);
    y+=lengthdir_y(3,direction);

// Touche Up
motion_set(image_angle,3)

// Touche right
direction=(direction+90+360) mod 360;
    x+=lengthdir_x(3,direction);
    y+=lengthdir_y(3,direction);

// Touche Down
 motion_set(image_angle,-3)
J'espère avoir été assez clair dans mes propos (si vous le voulez, je mettrai une vidéo pour vous montrez ce que je veux dire), Merci d'avance pour l'aide. :)

Cordialement.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: [Jeu] Perso qui suit la souris

Message par Thyphoon »

salut,

bon a l'arrache en 5min avant de partir bosser voici le principe pour que ton perso regarde toujours le curseur
ensuite pour déplacer ton perso c'est assez simple tu connais l'angle donc un petit cos et sin vont t'aider !! :)
c'est du très très rapide ...

Code : Tout sélectionner

Structure game
  width.l
  height.l
EndStructure

Global game.game
game\width=800
game\height=600


If InitSprite() And InitSprite3D() And InitSound() And InitNetwork()
  If InitKeyboard() And InitMouse()
    winMain = OpenWindow(#PB_Any,0,0,game\width,game\height,"Press [Esc] to close",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    OpenWindowedScreen(WindowID(winMain), 0, 0, game\width, game\height, 1, 0, 0)
    UsePNGImageDecoder()
    UseJPEGImageDecoder()
    SetFrameRate(60)
  EndIf
Else
  MessageRequester("","Unable to initsprite") :
EndIf

Procedure.f calculateRelativeAngle2D(*origin.POINT, *P1.POINT)
  Protected  ang.f, calc.f
  calc = (*P1\y - *origin\y) / (*P1\x - *origin\x)
  ang = Degree(ATan(calc))
  
  If *P1\y < *origin\y And *P1\x > *origin\x
    ProcedureReturn ang  ;angle is in the first quadrant
  ElseIf (*P1\y < *origin\y And *P1\x < *origin\x) Or (*P1\y > *origin\y And *P1\x < *origin\x)
    ProcedureReturn ang + 180 ;angle is in the second Or third quadrant
  Else
    ProcedureReturn ang + 360 ;angle is in the fourth quadrant
  EndIf
EndProcedure

CreateSprite(0,64,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Box(0,32,64,32,#Red)
Circle(32,32,20,#Green)
StopDrawing()
CreateSprite3D(0,0)

perso.POint
perso\x=game\width/2
perso\y=game\height/2

curseur.point

Repeat
  Delay(1)
  EventID = WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  
  
  curseur\x=MouseX()
  curseur\y=MouseY()
  angle=calculateRelativeAngle2D(@perso, @curseur)+90
  
  If KeyboardPushed(#PB_Key_Left)
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
  EndIf
  If KeyboardPushed(#PB_Key_Up) 

  EndIf
  
  If KeyboardPushed(#PB_Key_Down) 
  EndIf

  
  ClearScreen(0)
  Start3D()
  RotateSprite3D(0,angle,#PB_Absolute)
  DisplaySprite3D(0,perso\x,perso\y)
  Stop3D()
  
  StartDrawing(ScreenOutput())
    Circle(MouseX(),MouseY(),5,#Red)
    DrawText(20,20,Str(perso\x)+" "+Str(perso\y))
  StopDrawing()
  
  FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: [Jeu] Perso qui suit la souris

Message par Thyphoon »

bon aller je suis sympa je profite d'une petite pause au boulot pour te faire le déplacement du perso

Code : Tout sélectionner

  If KeyboardPushed(#PB_Key_Left)
    perso\x=perso\x-5*Cos(Radian(angle))
    perso\y=perso\y-5*Sin(Radian(angle))
  EndIf
 
  If KeyboardPushed(#PB_Key_Right)
    
    perso\x=perso\x+5*Cos(Radian(angle))
    perso\y=perso\y+5*Sin(Radian(angle))
    
  EndIf
  If KeyboardPushed(#PB_Key_Up)
    perso\x=perso\x+5*Cos(Radian(angle-90))
    perso\y=perso\y+5*Sin(Radian(angle-90))
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
    perso\x=perso\x-5*Cos(Radian(angle-90))
    perso\y=perso\y-5*Sin(Radian(angle-90))
  EndIf
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Jeu] Perso qui suit la souris

Message par Ar-S »

Il y aura difficilement plus claire :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: [Jeu] Perso qui suit la souris

Message par Thyphoon »

Ar-S a écrit :Il y aura difficilement plus claire :mrgreen:
j'aurais pu rajouter quelques commentaires en plus dans le code :mrgreen:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [Jeu] Perso qui suit la souris

Message par G-Rom »

Ils ont l'air sympa les p'tit gars qui nous vienne de GameMaker , ça change de certain de nos boulets qui arrivent de nul part...
Bienvenu a toi lyn666. ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [Jeu] Perso qui suit la souris

Message par djes »

G-Rom a écrit :Ils ont l'air sympa les p'tit gars qui nous vienne de GameMaker , ça change de certain de nos boulets qui arrivent de nul part...
Bienvenu a toi lyn666. ;)
+2
Avatar de l’utilisateur
lyn666
Messages : 13
Inscription : lun. 13/juin/2011 8:57

Re: [Jeu] Perso qui suit la souris

Message par lyn666 »

Merci pour votre accueil et l'aide apporté. Dite le moi si je suis un boulet. :lol:

J'ai tester le premier code et le compilateur me dit :

Code : Tout sélectionner

Ligne 23 : Structure introuvable : POINT.
J'ai oublier de dire que je n'ai que la démo du logiciel, pour l'instant.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Jeu] Perso qui suit la souris

Message par blendman »

Salut Lyn

Content de voir des gens qui font du Gm se mettre à Purebasic :).

Tu vas voir comme Purebasic est puissant, plus on l'utilise et plus on se rend compte des performances et de la simplicité de ce langage :).

J'avais fait quelques procédures ou macros converties depuis game maker, en "purebasic".

Elles ne sont pas parfaites, mais plutôt utiles :)

les voici :

Code : Tout sélectionner

Procedure max(n1,n2)      
      If n1>=n2
        ProcedureReturn n1
      ElseIf n1<n2
        ProcedureReturn n2
      EndIf      
EndProcedure
    
Procedure min(n1,n2)        
      If n1>=n2
        ProcedureReturn n2
      ElseIf n1<n2
        ProcedureReturn n1
      EndIf      
EndProcedure 

Macro point_distance(x1,y1,x2,y2)   
   Sqr((x2 - x1)*  (x2-x1) +  (y2-y1)* (y2-y1))         
  EndMacro
  
Macro point_direction(x1,y1,x2,y2)
   ATan2((y2- y1),(x2- x1))
 EndMacro

Macro direction(x,y,xx,yy,direction)
; celle-ci est faite pour la 2D iso, mais c'est facilement modifiable.
test = Degree(ATan2((yy-y),(xx-x)))      
       If test =180 
         direction = 4         
       ElseIf test >90 And test <180 
         direction = 3           
       ElseIf test =90 
         direction = 2         
       ElseIf test >0 And test <90 
         direction = 1         
       ElseIf test =0 
         direction = 0          
       ElseIf test >-90 And test <0
        direction = 7           
       ElseIf test =-90 
         direction = 6          
       ElseIf test >=-180 And test <-90 
         direction = 5 
       EndIf
EndMacro

Macro move_toward(x1,y1,x2,y2,speed)
    x1 + Sin(ATan2((y2- y1),(x2- x1)))* speed
    y1 + Cos(ATan2((y2- y1),(x2- x1)))* speed
    ;movsnap(64,32,x1,y1)
EndMacro

; quelques bonus : 
;(c'est pas des fonctions de GM, mais c'est pratique)

Macro movsnap(argument0,argument1,x,y)  
; pour "snapper" un perso sur une case 
; argument0 = taille case en largeur
; argument1 = taille case en heuteur
m = Round(y/argument1 - x/argument0,1);
n = Round(y/argument1 + x/argument0,1);
x = (n - m)/2*argument0
y = (n + m)/2*argument1
EndMacro

Macro mouse_on_area(x,y,L,H)
  MouseX()> x And MouseX() < x + L And MouseY()>y And MouseY() < y + H
EndMacro

Procedure onscreen(x,y,sp_l,sp_h,cam_x,cam_y,cam_l,cam_h,marge)  
 If cam_x + cam_l +marge > x And cam_x - marge < x + sp_l And cam_y + cam_h + marge > y And cam_y - marge < y + sp_h    
   ProcedureReturn #True
 Else 
   ProcedureReturn #False   
 EndIf  
EndProcedure

D'ailleurs, si vous y trouvez des erreurs, ou si vous connaissez des techniques mieux n'hésitez pas à poster ;).

Merci à G-rom qui m'avait beaucoup aidé pour la plupart (et Comtois aussi)

PS : la communauté de Gm et notamment le Cbna est très sympa il faut le dire :D.
Dernière modification par blendman le mar. 14/juin/2011 22:20, modifié 3 fois.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [Jeu] Perso qui suit la souris

Message par graph100 »

si tu n'as pas cette structure tu peux la créer toi :

Code : Tout sélectionner

Structure Point
x.l
y.l
EndStructure
Si le compilateur te dis qu'elle existe déjà, change son nom, mais n'oublie pas de changer la définition de chaque variable définie en POINT :wink:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [Jeu] Perso qui suit la souris

Message par graph100 »

blendman a écrit :

Code : Tout sélectionner

Procedure max(n1,n2)     
      If n1>n2
        ProcedureReturn n1
      ElseIf n1<n2
        ProcedureReturn n2
      EndIf     
EndProcedure
   
Procedure min(n1,n2)       
      If n1>n2
        ProcedureReturn n2
      ElseIf n1<n2
        ProcedureReturn n1
      EndIf     
EndProcedure 
Es-ce voulu le fait que les procedures retournent 0 si les nombres sont égaux ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [Jeu] Perso qui suit la souris

Message par blendman »

graph100 a écrit :Es-ce voulu le fait que les procedures retournent 0 si les nombres sont égaux ?
ah non, po du tout, j'ai corrigé , merci ;).
Avatar de l’utilisateur
lyn666
Messages : 13
Inscription : lun. 13/juin/2011 8:57

Re: [Jeu] Perso qui suit la souris

Message par lyn666 »

Merci. :)
J'étaie sur "Game Maker zone" (d’ailleurs je n'ai toujours pas compris pourquoi :(), mais il a fermé et par la suite j'ai rejoint "le CBNA".

Je vais essayer de me débrouiller avec ça.

Je vous laisse une petite vidéo du style de contrôle du perso (clavier + souris) que je voudrait avoir (Test sous "Game Maker") :
http://www.dailymotion.com/lyn666#videoId=xjavkv
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [Jeu] Perso qui suit la souris

Message par graph100 »

un code un peu retouché, simplement, l'angle est simplifié pour ne plus avoir que des valeurs de 0, 90, 180, 270, 360.

Maintenant j'ai fait ça le plus rapidement possible. La meilleur des méthodes serais de recoder la procédure de calcul de l'angle,
et de le fixer pour certaines conditions, de façon à avoir le personnage qui fait face au cursus intelligement.

Mais là, il va falloir un peu de recherche par toi-même :wink: ça va te permettre de rentrer dans le PureBasic et de t"y abituer ^^

Code : Tout sélectionner

Structure game
	width.l
	height.l
EndStructure

Structure point_custom
	x.l
	y.l
EndStructure


Global game.game
game\width=800
game\height=600


If InitSprite() And InitSprite3D() And InitSound() And InitNetwork()
	If InitKeyboard() And InitMouse()
		winMain = OpenWindow(#PB_Any,0,0,game\width,game\height,"Press [Esc] to close",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
		OpenWindowedScreen(WindowID(winMain), 0, 0, game\width, game\height, 1, 0, 0)
		UsePNGImageDecoder()
		UseJPEGImageDecoder()
		SetFrameRate(60)
	EndIf
Else
	MessageRequester("","Unable to initsprite") :
EndIf

Procedure.f calculateRelativeAngle2D(*origin.point_custom, *P1.point_custom)
	Protected  ang.f, calc.f
	calc = (*P1\y - *origin\y) / (*P1\x - *origin\x)
	ang = Degree(ATan(calc))
	
	If *P1\y < *origin\y And *P1\x > *origin\x
		ProcedureReturn ang  ;angle is in the first quadrant
	ElseIf (*P1\y < *origin\y And *P1\x < *origin\x) Or (*P1\y > *origin\y And *P1\x < *origin\x)
		ProcedureReturn ang + 180 ;angle is in the second Or third quadrant
	Else
		ProcedureReturn ang + 360 ;angle is in the fourth quadrant
	EndIf
EndProcedure





CreateSprite(0,64,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Box(0,32,64,32,#Red)
Circle(32,32,20,#Green)
StopDrawing()
CreateSprite3D(0,0)

perso.point_custom

perso\x=game\width/2
perso\y=game\height/2

curseur.point_custom

Repeat
	Delay(1)
	EventID = WindowEvent()
	ExamineKeyboard()
	ExamineMouse()
	
	
	curseur\x=MouseX()
	curseur\y=MouseY()
	angle.l = calculateRelativeAngle2D(@perso, @curseur) + 90
	
	If KeyboardPushed(#PB_Key_Left)
		perso\x=perso\x-5*Cos(Radian(angle))
		perso\y=perso\y-5*Sin(Radian(angle))
	EndIf
	
	If KeyboardPushed(#PB_Key_Right)
		
		perso\x=perso\x+5*Cos(Radian(angle))
		perso\y=perso\y+5*Sin(Radian(angle))
		
	EndIf
	If KeyboardPushed(#PB_Key_Up)
		perso\x=perso\x+5*Cos(Radian(angle-90))
		perso\y=perso\y+5*Sin(Radian(angle-90))
	EndIf
	
	If KeyboardPushed(#PB_Key_Down)
		perso\x=perso\x-5*Cos(Radian(angle-90))
		perso\y=perso\y-5*Sin(Radian(angle-90))
	EndIf
	
	ClearScreen(0)
	Start3D()
	
	RotateSprite3D(0, Int(angle / 90) * 90, #PB_Absolute)
	
	DisplaySprite3D(0,perso\x - SpriteWidth(0), perso\y - SpriteHeight(0))
	Stop3D()
	
	StartDrawing(ScreenOutput())
	Circle(MouseX(),MouseY(),5,#Red)
	DrawText(20,20,Str(perso\x)+" "+Str(perso\y))
	StopDrawing()
	
	FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
lyn666
Messages : 13
Inscription : lun. 13/juin/2011 8:57

Re: [Jeu] Perso qui suit la souris

Message par lyn666 »

graph100 a écrit :Mais là, il va falloir un peu de recherche par toi-même :wink: ça va te permettre de rentrer dans le PureBasic et de t"y abituer ^^
J'ai déjà commencer à faire des recherches par moi-même. J'ai modifier la fenêtre de façon à ce qu'elle me plaise mieux. Je fait des essais de tel ou tel fonction.

Merci, avec tout ce que vous m'avez fournis, j'ai de quoi démarrer bien comme il faut.

EDIT : J'ai tester ton code et j'ai du changer quelque points, car ça ne marchait pas :

Code : Tout sélectionner

Ligne
49       Box(0,32,64,32,RGB(255,0,0))
50       Circle(32,32,20,RGB(0,255,0))
...
102      Circle(MouseX(),MouseY(),5,RGB(255,0,0))
Et la, ça marche.

Je vais le modifier à ma convenance, pour que ça aille à mes sprites.
Répondre