| | [PureBasic]Topic Aide | |
| | Auteur | Message |
---|
Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: [PureBasic]Topic Aide Lun 7 Mar 2011 - 18:45 | |
| Je crée le topic aide pour le purebasic, je commence avec : Bon voilà je me suis mis au purebasic et j’essaie de faire un système de collision, mais pour le faire j'ai besoin des structures, j'ai donc rechercher et j'ai fais ce code qui ne marche pas, j'ai une erreur. - Code:
-
#fenetre=0 #LARGEUR_TILE=32 #HAUTEUR_TILE=32
Structure box x.l y.l w.l h.l EndStructure Structure object x.l y.l sprite_index.l EndStructure
Procedure place_free(x,y) i1 = solid\x/#LARGEUR_TILE j1 = solid\box.y/#HAUTEUR_TILE i2 = (solid\box.x + solid.box\w -1)/#LARGEUR_TILE j2 = (solid\box.x + solid.box\h -1)/#HAUTEUR_TILE For i=i1 To i2 Step 1 For j=j1 To j2 Step 1 If Global TileIsMur[i,j] Return false; EndIf Next Next Return true; EndProcedure Global Dim TileIsMur.l(2,2) If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Sprite system can't be initialized", 0) End EndIf
OpenScreen(640, 480, 16, "Sprite") sprite_zozor=LoadSprite(sprite, "image/zozor.bmp", 0)
Global Dim solid.box(10) Dim obj_player.object(0)
solid(0)\x = 0 solid(0)\y = 0 solid(0)\w =32 solid(0)\h =32 TileIsMur(0,0) = 1
obj_player(0)\x = 50 obj_player(0)\y = 50 obj_player(0)\sprite_index = sprite_zozor
Repeat FlipBuffers() ClearScreen(RGB(0,0,0)) ExamineKeyboard() If KeyboardPushed(#PB_Key_Left) x-1 EndIf DisplaySprite(sprite,x,y) Until KeyboardPushed(#PB_Key_Escape) Bon c'est assez le fouillis mais bon le tuto du site du zero n'explique ni les structure et ni les tableau. edit : voilà l'erreur : "Ligne 20: la variable suivante n'a pas de "structure" associée: solid"
Dernière édition par jbg77 le Mer 9 Mar 2011 - 17:26, édité 2 fois |
| | | ombre Utilisateur confirmé: Rang ***
Messages : 689 Localisation : Dans sa batcave.
| Sujet: Re: [PureBasic]Topic Aide Lun 7 Mar 2011 - 20:04 | |
| en gros en faisant solid\x tu accèdes à la valeur x si tu as déclaré solid comme étant une structure, ce n'est pas le cas, au début de ta procédure, ajoute juste ; solid.box, comme sa purebasic saura que tu déclare solid comme étant un élément basé sur la structure box... Par contre, je comprends pas ton code, il est bourré de faute ! La liste des bugs rencontrés : - Code:
-
solid\box.y Là c'est comme si tu voulais accéder au champ 'box' d'une structure : - Code:
-
Structure solid box.d ... endstructure Il suffit juste de mettre ; - Code:
-
solid\y Tu as le même genre d'erreur un peu partout à ce niveau là. - Code:
-
If Global TileIsMur[i,j] Première erreur les tableaux en purebasic ce sont des parenthèses () et non des []. Seconde erreur, global est inutile, sa provoque même une erreur, si une variable est global pas besoin de préciser à chaque fois qu'elle est global. De plus tu déclare la variable après la procédure ! Ce qui produit une erreur, si tu veux un conseil, ton code organise le comme ceci : Constantes Variables globales Structures Déclaration de procédures Macro Procédures Boucle principal L'ordre est important, comme sa, si tu utilises une structure, variables, ou une constantes dans une procédure elles seront bien déclaré ! - Code:
-
Return false; ; inutile, en purebasic sa permet de faire des commentaires return c'est une erreur classique il faut mettre en réalité procedurereturn false est dans ce cas là une variable, je présume que tu pensais à la 'constante' false => #false Tu as les même erreur pour #true Hormis sa, je penses que sa devrait marcher (j'ai pas regardé, j'ai juste lancer plusieurs fois mon compilateur en regardant les erreurs qu'il trouvait) Code revue et corrigé : - Code:
-
#fenetre=0 #LARGEUR_TILE=32 #HAUTEUR_TILE=32
Structure box x.l y.l w.l h.l EndStructure Structure object x.l y.l sprite_index.l EndStructure
Global Dim TileIsMur.l(2,2)
Procedure place_free(x,y) solid.box i1 = solid\x/#LARGEUR_TILE j1 = solid\y/#HAUTEUR_TILE i2 = (solid\x + solid.box\w -1)/#LARGEUR_TILE j2 = (solid\x + solid.box\h -1)/#HAUTEUR_TILE For i=i1 To i2 Step 1 For j=j1 To j2 Step 1 If TileIsMur(i,j) ProcedureReturn #False; EndIf Next Next ProcedureReturn #true; EndProcedure If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Sprite system can't be initialized", 0) End EndIf
OpenScreen(640, 480, 16, "Sprite") sprite_zozor=LoadSprite(sprite, "image/zozor.bmp", 0)
Global Dim solid.box(10) Dim obj_player.object(0)
solid(0)\x = 0 solid(0)\y = 0 solid(0)\w =32 solid(0)\h =32 TileIsMur(0,0) = 1
obj_player(0)\x = 50 obj_player(0)\y = 50 obj_player(0)\sprite_index = sprite_zozor
Repeat FlipBuffers() ClearScreen(RGB(0,0,0)) ExamineKeyboard() If KeyboardPushed(#PB_Key_Left) x-1 EndIf DisplaySprite(sprite,x,y) Until KeyboardPushed(#PB_Key_Escape) |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Lun 7 Mar 2011 - 20:08 | |
| Merci, d'avoir corriger le code, c'est très sympa, les conseilles aussi. J'ai commencé à apprendre le purebasic cette après-midi donc je suis un gros débutant |
| | | Linky439 Utilisateur confirmé: Rang *****
Messages : 2643 Localisation : Sur le forum du CBNA...ou pas Projet Actuel : La Galaxie Scellée
| Sujet: Re: [PureBasic]Topic Aide Lun 7 Mar 2011 - 20:13 | |
| Ombre, certifié pro du PB |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Mar 8 Mar 2011 - 18:00 | |
| Excellent si tu te mets au purebasic ! Comment va y avoir plein de nouveaux en purebasic , on va se sentir moins seul avec Ombre . Sinon, pour les collisions, tu as aussi : spriteCollision() et SpritepixelCollision(), mais il faut les utiliser avec précaution. EDIT : sinon, un "ami" du forum purebasic vient de me donner un lien sur les collisions, et voici le code du lien : - Code:
-
; ******************************************************** ; *** ; *** Collision Macros / Procedures ; *** ; *** by Kaeru Gaman 2006-07-02 ; *** ; *** PB Ver 4.0 ; *** ; ********************************************************
; *** ; *** Absolute Value ; ***
Macro AbsEx(Expression) ( ( ((Expression) >= 0 Or 0) *2 - 1 ) * (Expression) ) EndMacro
Procedure P_AbsEx(Wert) If Wert < 0 wert *-1 EndIf
ProcedureReturn Wert
EndProcedure
; *** ; *** Standard Collision, equal to SpriteCollision() ; ***
Macro StdColl(x1,y1,a1,b1,x2,y2,a2,b2) (0 Or (0>=((0 Or (x1 < x2))*(x2 - (x1 + a1)))+((0 Or (x1 >= x2))*(x1 - (x2 + a2)))))And(0 Or (0>=((0 Or (y1 < y2))*(y2 - (y1 + b1)))+((0 Or (y1 >= y2))*(y1 - (y2 + b2))))) EndMacro
Procedure P_StdColl(x1,y1,a1,b1,x2,y2,a2,b2) Coll = #False If x1 < x2 dx = x2 - (x1 + a1) Else dx = x1 - (x2 + a2) EndIf If y1 < y2 dy = y2 - (y1 + b1) Else dy = y1 - (y2 + b2) EndIf If dx < 0 And dy < 0 Coll = #True EndIf ProcedureReturn Coll
EndProcedure
; *** ; *** Bounding Box ; ***
Macro BoundBoxColl(x1,y1,a1,b1,x2,y2,a2,b2) ( ( 0 Or ((AbsEx(x1-x2) - a1 - a2)<0)) And ( 0 Or ((AbsEx(y1-y2) - b1 - b2)<0)) ) EndMacro
Procedure P_BoundBoxColl(x1,y1,a1,b1,x2,y2,a2,b2) Coll = #False dx = P_AbsEx(x1-x2) - a1 - a2 dy = P_AbsEx(y1-y2) - b1 - b2 If dx < 0 And dy < 0 Coll = #True EndIf ProcedureReturn Coll
EndProcedure
; *** ; *** Bounding Circle ; ***
Macro BoundCircleColl(x1,y1,r1,x2,y2,r2) ( 0 Or (( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) - (r1 + r2) * (r1 + r2) ) < 0) ) EndMacro
Procedure P_BoundCircleColl(x1,y1,r1,x2,y2,r2) Coll = #False
dist = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) - (r1 + r2) * (r1 + r2) If dist < 0 Coll = #True EndIf
ProcedureReturn Coll
EndProcedure
Ce sont des "macros" ou des procédures, à utiliser dans ton code. |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Mar 8 Mar 2011 - 19:02 | |
| Bon j'ai encore un problème : - Code:
-
#fenetre=0 #LARGEUR_TILE=32 #HAUTEUR_TILE=32 #spr_zozor=0 #spr_bloc=0
Structure object x.l y.l w.l h.l sprite_index.l vsp.l EndStructure
Structure bloc x.l y.l sprite_index.l EndStructure
Global Dim TileIsMur.l(20,15)
Procedure place_free(x,y,w,h) i1 = x/#LARGEUR_TILE j1 = y/#HAUTEUR_TILE i2 = (x + w -1)/#LARGEUR_TILE j2 = (y + h -1)/#HAUTEUR_TILE For i=i1 To i2 Step 1 For j=j1 To j2 Step 1 If TileIsMur(i,j) ProcedureReturn #False; EndIf Next Next ProcedureReturn #True; EndProcedure If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Sprite system can't be initialized", 0) End EndIf
OpenScreen(#LARGEUR_TILE*20, #HAUTEUR_TILE*15, 16, "Sprite") LoadSprite(#spr_zozor, "image/zozor.bmp", 0) LoadSprite(#spr_bloc, "image/bloc.bmp", 0)
Dim bloc.bloc(20) Dim obj_player.object(0)
For i=0 To 20 Step 1 TileIsMur(i,14) = 1 bloc(i)\y = 14*#LARGEUR_TILE bloc(i)\x = i*#HAUTEUR_TILE bloc(i)\sprite_index = #spr_bloc Next
obj_player(0)\x = 320 obj_player(0)\y = 0 obj_player(0)\w = 84 obj_player(0)\h = 95 obj_player(0)\sprite_index = #spr_zozor obj_player(0)\vsp = 5
Repeat FlipBuffers() ClearScreen(RGB(0,0,0)) ExamineKeyboard() obj_player(0)\vsp=obj_player(0)\vsp+1 For i=0 To vsp Step 1 If place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1) And obj_player(0)\vsp> 0 obj_player(0)\y=obj_player(0)\y+1 ElseIf place_free(obj_player(0)\x,obj_player(0)\y-1,obj_player(0)\w,obj_player(0)\h) And obj_player(0)\vsp< 0 obj_player(0)\y=obj_player(0)\y-1 Else obj_player(0)\vsp = 0 EndIf Next If KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h) obj_player(0)\x=obj_player(0)\x-1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h) obj_player(0)\x=obj_player(0)\x+1 EndIf If KeyboardPushed(#PB_Key_Up) If check = 0 And Not place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1) check = 1 jump=25 EndIf If jump > 0 jump=jump-1 obj_player(0)\vsp = -3 EndIf EndIf If Not KeyboardPushed(#PB_Key_Up) jump = 0 check = 0 EndIf DisplaySprite(obj_player(0)\sprite_index,obj_player(0)\x,obj_player(0)\y) For i=0 To 20 Step 1 DisplaySprite(bloc(i)\sprite_index,bloc(i)\x,bloc(i)\y) Next Until KeyboardPushed(#PB_Key_Escape) Voilà enfaite les sprites sont identique alors qu'il ne devrait pas. |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Mar 8 Mar 2011 - 21:01 | |
| - jbg77 a écrit:
- Voilà enfaite les sprites sont identique alors qu'il ne devrait pas.
salut c'était tout simple : change ça : #spr_bloc=1 En fait, lorsque tu crées des sprites, tu leur donnes une sorte d'identifiant : toi tu avais ça : - Code:
-
#spr_zozor=0 #spr_bloc=0
et ça : - Code:
-
LoadSprite(#spr_zozor, "zozor.bmp", 0) LoadSprite(#spr_bloc, "bloc.bmp", 0)
pb remplace tes constante par leur valeur. Ce qui donnait : - Code:
-
LoadSprite(0, "zozor.bmp", 0) LoadSprite(0, "bloc.bmp", 0)
Donc, tu lui disais : sur le sprite 0 : charge l'image zozor puis sur le sprite 0 (donc , le même car le même numéro) : charge le sprite bloc Pour éviter ça, je te conseille de faire une enumeration au début, sur les constantes de la même "famille" (sprite, écran, etc..) comme ça : - Code:
-
Enumeration #spr_zozor #spr_bloc EndEnumeration Ainsi pb donnera lui-même les valeurs : #spr_zozor =0 #spr_bloc =1 et voilà, c'est réparé |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Mar 8 Mar 2011 - 21:38 | |
| Ah merci , je vais relire le tuto sur le site du zero cela m'évitera ce genre d'erreur. |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Mer 9 Mar 2011 - 17:28 | |
| Bon je me permet d'up car j'ai une question, j'ai mis setframerate(60) mais les fps ne sont toujours pas limiter, que faire ? |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Mer 9 Mar 2011 - 20:39 | |
| - jbg77 a écrit:
- Bon je me permet d'up car j'ai une question, j'ai mis setframerate(60) mais les fps ne sont toujours pas limiter, que faire ?
pour ça, je crois que la technique est la suivante : - au début de ton code , par exemple dans l'enumeration, ou avec les variables, tu définit une variable (mets le fps que tu veux) - Code:
-
#FPS_LIMIT = 120 - puis, dans ta boucle principale : - Code:
-
Repeat Event.l = WindowEvent() If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT) CheckTime = ElapsedMilliseconds() FlipBuffers() ClearScreen(RGB(128,128,128)) ;les evenements de ta boucle Else Delay(5) EndIf Until Event = #PB_Event_CloseWindow Normalement, ça devrait marcher |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Mer 9 Mar 2011 - 20:58 | |
| La variable est obliger d'être une constante ? |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Mer 9 Mar 2011 - 21:22 | |
| - jbg77 a écrit:
- La variable est obliger d'être une constante ?
je ne crois pas. Il faut tester. Mais étant donné que tu veux fixer un maximum, ça parait logique que ce soit une constante en fait |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Mer 9 Mar 2011 - 21:32 | |
| Oui mais par exemple si je veux débloquer le nombre d'ips max. Si va falloir que je regarde pour un système de collision au pixel près si je veux faire des pentes. |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Mer 9 Mar 2011 - 21:39 | |
| - jbg77 a écrit:
- Oui mais par exemple si je veux débloquer le nombre d'ips max.
Si va falloir que je regarde pour un système de collision au pixel près si je veux faire des pentes. sinon, le plus simple est de tester Pour les collisions au pixel, il y a spritePixelCollision(), mais il faut ajouter directX7 dans l'option du compilateur (bibliothèque sous-système). Sinon, il semblerait que ce soit mieux de le faire plus ou moins à la main, mais ça je ne sais pas comment on fait :p Les collisions au pixel ne sont pas forcément très efficaces je trouve. En tout cas, pas tout le temps. |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Ven 11 Mar 2011 - 19:17 | |
| Finalement je pense que je peux juste utiliser les tableaux pour les collisions, par contre j'ai deux autres problèmes : - Les bloc ne s'affichent pas tous - Il y a un bug avec les pentes quand j'appuie sur gauche, sur droite tout marche correctement - Code:
-
#fenetre=0 #LARGEUR_TILE=32 #HAUTEUR_TILE=32 #RESOLUTION_W=1024 #RESOLUTION_H=768 #spr_zozor=0 #spr_bloc=1 #FPS_LIMIT = 60
Structure object x.l y.l w.l h.l sprite_index.l vsp.f EndStructure
Structure bloc x.l y.l sprite_index.l EndStructure
Global Dim TileIsMur.l(32, 24)
Procedure place_free(x,y,w,h) i1 = x/#LARGEUR_TILE j1 = y/#HAUTEUR_TILE i2 = (x + w -1)/#LARGEUR_TILE j2 = (y + h -1)/#HAUTEUR_TILE For i=i1 To i2 Step 1 For j=j1 To j2 Step 1 If TileIsMur(i,j)=1 ProcedureReturn 0; EndIf If TileIsMur(i,j)=2 ProcedureReturn 2; EndIf If TileIsMur(i,j)=3 ProcedureReturn 3; EndIf Next Next ProcedureReturn 1; EndProcedure If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Sprite system can't be initialized", 0) End EndIf
OpenWindow(#fenetre,50,50,#RESOLUTION_W,#RESOLUTION_H,"bonjour") OpenWindowedScreen(WindowID(#fenetre),0,0,#RESOLUTION_W,#RESOLUTION_H,0,0,0,0) LoadSprite(#spr_zozor, "image/zozor.bmp", 0) LoadSprite(#spr_bloc, "image/bloc.bmp", 0)
Dim bloc.bloc(33) Dim obj_player.object(0)
For i=0 To 32 Step 1 TileIsMur(i,(#RESOLUTION_H/32)-1) = 1 bloc(i)\y = #RESOLUTION_H-32 bloc(i)\x = i*#LARGEUR_TILE bloc(i)\sprite_index = #spr_bloc Next
TileIsMur(10,(#RESOLUTION_H/32)-2)=2 TileIsMur(9,(#RESOLUTION_H/32)-2)=1 TileIsMur(8,(#RESOLUTION_H/32)-2)=3
obj_player(0)\x = 320 obj_player(0)\y = 0 obj_player(0)\w = 84 obj_player(0)\h = 95 obj_player(0)\sprite_index = #spr_zozor obj_player(0)\vsp = 0.25
Repeat Event.l = WindowEvent() If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT) CheckTime = ElapsedMilliseconds() FlipBuffers() ClearScreen(RGB(128,128,128)) ExamineKeyboard() obj_player(0)\vsp+1 For i=0 To Abs(obj_player(0)\vsp) Step 1 If place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=1 And obj_player(0)\vsp> 0 obj_player(0)\y=obj_player(0)\y+1 ElseIf place_free(obj_player(0)\x,obj_player(0)\y-1,obj_player(0)\w,obj_player(0)\h)=1 And obj_player(0)\vsp< 0 obj_player(0)\y=obj_player(0)\y-1 Else obj_player(0)\vsp = 0 EndIf Next For i=0 To 5 Step 1 If KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=3 obj_player(0)\x-1 obj_player(0)\y+1 ElseIf KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=1 obj_player(0)\x-1 ElseIf KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=2 obj_player(0)\x-1 obj_player(0)\y-1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h+1)=2 obj_player(0)\x+1 obj_player(0)\y+1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h)=1 obj_player(0)\x+1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h)=3 obj_player(0)\x+1 obj_player(0)\y-1 EndIf Next If KeyboardPushed(#PB_Key_Up) If check = 0 And Not place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=1 check = 1 jump=25 EndIf If jump > 0 jump=jump-1 obj_player(0)\vsp = -3 EndIf EndIf If Not KeyboardPushed(#PB_Key_Up) jump = 0 check = 0 EndIf DisplaySprite(obj_player(0)\sprite_index,obj_player(0)\x,obj_player(0)\y) For i=0 To 20 Step 1 DisplaySprite(bloc(i)\sprite_index,bloc(i)\x,bloc(i)\y) Next Else Delay(5) EndIf Until KeyboardPushed(#PB_Key_Escape) |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Ven 11 Mar 2011 - 22:29 | |
| salut j'ai commencé à regarder. déjà, je me permettrai de te faire une remarque générale : - tu devrais mieux organiser ton code, ça te permettrait de mieux voir d'où viennent les bugs. un exemple d'organisation : - Code:
-
***********enumeration*********************
***********variables************************
***********structure / tableaux****************
***********declare procedure*****************
***********initialisation / open window**********
*************boucle*************************
*********** procedures **********************
si besoin :
*********** data section *********************
Tu peux organiser un peu différemment, mais c'est globale l'idée et l'organisation qu'on conseille. Ca t'évite d'avoir des tableaux, déclaration de tableaux, etc éparpillés partout . Pour ton problème, visiblement, le 2ème problème vient d'ici, mais je ne comprends pas trop ta méthode (bon, je n'ai pas regardé très longtemps non plus, à vrai dire :p) : - Code:
-
TileIsMur(10,(#RESOLUTION_H/32)-2)=2 TileIsMur(9,(#RESOLUTION_H/32)-2)=1 TileIsMur(8,(#RESOLUTION_H/32)-2)=3
Mais tu as aussi un soucis avec ta procédures place_free, car si tu vas tout à droite, il y a un plantage. Si j'ai le temps, j'essaie de mieux regarder ce week end. bonne continuation . |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Ven 11 Mar 2011 - 23:24 | |
| C'est vrai que pour l'organisation du code j'ai pas d'excuse surtout que ombre m'avait prévenu mais dés que j'aurais programmé l'éditeur de niveau, il n'y aura plus de tableau qui se balade partout. Pour le moteur de plateforme c'est super simple j'utilise un tableau où les cases sont soit égale à 0 donc rien, soit 1 un bloc, 2 et 3 des pentes.Après tu arriveras à comprendre. Pour la fonction procédure il faut que je regarde ça doit pas êtres trop compliqué. |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Sam 12 Mar 2011 - 9:10 | |
| - jbg77 a écrit:
- C'est vrai que pour l'organisation du code j'ai pas d'excuse surtout que ombre m'avait prévenu mais dés que j'aurais programmé l'éditeur de niveau, il n'y aura plus de tableau qui se balade partout.
et puis, en organisant, ça te permet de bien classer ton code, et d'y retrouver plus facilement : combien tu as de structures, de tableau, d'elements dans tes tableaux, etc.. ça aide pour corriger les bugs :. - Citation :
- Pour le moteur de plateforme c'est super simple j'utilise un tableau où les cases sont soit égale à 0 donc rien, soit 1 un bloc, 2 et 3 des pentes.Après tu arriveras à comprendre.
oui, j'avais compris pour ça . Par contre, je n'ai pas encore compris pourquoi effectivement ça ne marche pas. - Citation :
- Pour la
fonction procédure il faut que je regarde ça doit pas êtres trop compliqué. ok
Dernière édition par blendman le Sam 12 Mar 2011 - 11:50, édité 2 fois |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Sam 12 Mar 2011 - 11:33 | |
| Voilà j'ai régler le bug du tableau hors limites et celui de la pente, il me reste plus qu'a régler celui des bloc qui ne s'affiche pas. - Code:
-
Enumeration #fenetre #spr_zozor #spr_bloc EndEnumeration
If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Sprite system can't be initialized", 0) End EndIf
#FPS_LIMIT=60 #LARGEUR_TILE=32 #HAUTEUR_TILE=32 #RESOLUTION_W=1024 #RESOLUTION_H=768 Global Dim TileIsMur.l(32, 24)
Structure object x.l y.l w.l h.l sprite_index.l vsp.f EndStructure
Structure bloc x.l y.l sprite_index.l EndStructure
Procedure place_free(x,y,w,h) i1 = x/#LARGEUR_TILE j1 = y/#HAUTEUR_TILE i2 = (x + w -1)/#LARGEUR_TILE j2 = (y + h -1)/#HAUTEUR_TILE For i=i1 To i2 Step 1 For j=j1 To j2 Step 1 If i >= 0 And j >=0 And i <= 31 And j <= 23 If TileIsMur(i,j)=1 ProcedureReturn 0; EndIf If TileIsMur(i,j)=2 ProcedureReturn 2; EndIf If TileIsMur(i,j)=3 ProcedureReturn 3; EndIf Else ProcedureReturn 0; EndIf Next Next ProcedureReturn 1; EndProcedure
Dim bloc.bloc(33) Dim obj_player.object(0)
OpenWindow(#fenetre,50,50,#RESOLUTION_W,#RESOLUTION_H,"bonjour") OpenWindowedScreen(WindowID(#fenetre),0,0,#RESOLUTION_W,#RESOLUTION_H,0,0,0,0)
LoadSprite(#spr_zozor, "image/zozor.bmp", 0) LoadSprite(#spr_bloc, "image/bloc.bmp", 0)
For i=0 To 32 Step 1 TileIsMur(i,(#RESOLUTION_H/32)-1) = 1 bloc(i)\y = #RESOLUTION_H-32 bloc(i)\x = i*#LARGEUR_TILE bloc(i)\sprite_index = #spr_bloc Next
TileIsMur(10,(#RESOLUTION_H/32)-2)=2 TileIsMur(9,(#RESOLUTION_H/32)-2)=1 TileIsMur(8,(#RESOLUTION_H/32)-2)=3
obj_player(0)\x = 320 obj_player(0)\y = 0 obj_player(0)\w = 84 obj_player(0)\h = 95 obj_player(0)\sprite_index = #spr_zozor obj_player(0)\vsp = 0.25
Repeat Event.l = WindowEvent() If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT) CheckTime = ElapsedMilliseconds() FlipBuffers() ClearScreen(RGB(128,128,128)) ExamineKeyboard() obj_player(0)\vsp+1 For i=0 To Abs(obj_player(0)\vsp) Step 1 If place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=1 And obj_player(0)\vsp> 0 obj_player(0)\y=obj_player(0)\y+1 ElseIf place_free(obj_player(0)\x,obj_player(0)\y-1,obj_player(0)\w,obj_player(0)\h)=1 And obj_player(0)\vsp< 0 obj_player(0)\y=obj_player(0)\y-1 Else obj_player(0)\vsp = 0 EndIf Next For i=0 To 5 Step 1 If KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x+83,obj_player(0)\y,obj_player(0)\w-1,obj_player(0)\h+1)=3 obj_player(0)\x-1 obj_player(0)\y+1 ElseIf KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=1 obj_player(0)\x-1 ElseIf KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=2 obj_player(0)\x-1 obj_player(0)\y-1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h+1)=2 obj_player(0)\x+1 obj_player(0)\y+1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h)=1 obj_player(0)\x+1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h)=3 obj_player(0)\x+1 obj_player(0)\y-1 EndIf Next If KeyboardPushed(#PB_Key_Up) If check = 0 And Not place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=1 check = 1 jump=25 EndIf If jump > 0 jump=jump-1 obj_player(0)\vsp = -3 EndIf EndIf If Not KeyboardPushed(#PB_Key_Up) jump = 0 check = 0 EndIf If place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=1 y-1 EndIf DisplaySprite(obj_player(0)\sprite_index,obj_player(0)\x,obj_player(0)\y) For i=0 To 20 Step 1 DisplaySprite(bloc(i)\sprite_index,bloc(i)\x,bloc(i)\y) Next Else Delay(5) EndIf Until KeyboardPushed(#PB_Key_Escape) Bon faudrait que je range le code aussi, tu connais des tutos sur la lecture de fichier ? |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Sam 12 Mar 2011 - 11:50 | |
| concernant le scrolling, voici une méthode proposée par comtois, un developpeur de développez.com, qui m'a fait un superbe exemple : - tu crées une structures "s_camera" (ou view) et une autre structure "s_carte" (ou room) (les noms, tu mets ce que tu veux ) - personnellement, j'ai créé d'autres structures : s_Background, s_Objet - tu ajoutes dans ta structure s_carte les tableaux des elements présents sur ta room (logique) Ça peut ressembler à ça : - Code:
-
Structure s_Carte Largeur.l Hauteur.l NbObjet.l Array Background.s_Background(0) Array Objet.s_Objet(0) EndStructure Tu peux créer une structure vector, pour la positionX et Y, ça peut aider . - Code:
-
structure vector x.f y.f endstructure ensuite ta structure s_camera : - Code:
-
Structure s_Camera ; la view Position.vector Largeur.i Hauteur.i ViewPort.vector EndStructure J'ai une structure Sprite que j'utilise pour mon personnage : - Code:
-
Structure s_Sprite Extends s_Objet Vitesse.i EndStructure
j'initialise mon personnage comme ça : - Code:
-
Procedure InitPerso(*Carte.s_Carte, *Perso.s_Sprite) With *Perso \Id = #perso \Largeur = SpriteWidth(\Id) \Hauteur = SpriteHeight(\Id) \PointChaud\x = \Largeur/2 \PointChaud\y = 80 \Position\x = Random(*Carte\Largeur) -\PointChaud\x \Position\y = Random(*Carte\Hauteur) -\PointChaud\y EndWith EndProcedure Ensuite, tu crées un objet qui le centre de ta camera et tu centre la caméra (ou view) en fonction de ce personnage : Et pour l'update : - Code:
-
Procedure evenement(*Carte.s_Carte, *Camera.s_Camera, *Sprite.s_Sprite, *Quit.Integer) If ExamineKeyboard() If KeyboardPushed(#PB_Key_Up) And *Sprite\Position\y > 0 *Sprite\Position\y - *Sprite\Vitesse EndIf If KeyboardPushed(#PB_Key_Down) *Sprite\Position\y + *Sprite\Vitesse EndIf If KeyboardPushed(#PB_Key_Left) And *Sprite\Position\x > 0 *Sprite\Position\x - *Sprite\Vitesse EndIf If KeyboardPushed(#PB_Key_Right) *Sprite\Position\x + *Sprite\Vitesse EndIf
If KeyboardPushed(#PB_Key_Escape) *quit\i = 1 EndIf ;Centre la caméra sur le perso *Camera\Position\x = *Sprite\Position\x - *Camera\Largeur / 2 *Camera\Position\y = *Sprite\Position\y - *Camera\Hauteur / 2
EndProcedure
Tu dois initialiser ta carte (ou room) : - Code:
-
Procedure InitCarte(*Carte.s_Carte) Define i.i *carte\NbSol = 200 ReDim *Carte\Sol(*Carte\NbSol) *Carte\Largeur = 4000 *Carte\Hauteur = 3000 For i=0 To *Carte\NbSol With *Carte\Sol(i) \Id= 50 + Random(5) \Largeur = SpriteWidth(\Id) \Hauteur = SpriteHeight(\Id) \Position\x = Random(*Carte\Largeur) \Position\y = Random(*Carte\Hauteur) EndWith Next i EndProcedure Et pour l'affichage, par exemple : - Code:
-
for i =0 to nbSol DisplaySprite3D(*Carte\Sol(i)\Id, *Camera\ViewPort\x + *Carte\Sol(i)\Position\x - *Camera\Position\x, *Camera\ViewPort\y + *Carte\Sol(i)\Position\y - *Camera\Position\y) next i voilà, normalement, ça devrait marcher. l'exemple complet (de comtois) : ftp://ftp-developpez.com/comtois/fichiers/ARKS/DVP_ARKS2.zipinclus : - depth - scrolling - load/save map - menu (simple - touche F1 ou F2 je ne sais plus) - Citation :
- tu connais des tutos sur la lecture de fichier ?
C'est à dire ? ouvrir un fichier map par exemple ? Si oui, c'est normalement dan sle lien que je t'ai donné juste au dessus |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Sam 12 Mar 2011 - 14:10 | |
| Je veux juste charger un fichier .txt et pour la view pour le moment j'ai pas de carte mais si j'ai bien compris, il suffit juste de déplacer la carte ? Edit : Un dernier problème - Code:
-
Enumeration #fenetre #spr_zozor #spr_bloc #spr_penteG #spr_penteD EndEnumeration If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Sprite system can't be initialized", 0) End EndIf
UsePNGImageDecoder()
#fenetre=0 #FPS_LIMIT=60 #LARGEUR_TILE=32 #HAUTEUR_TILE=32 #RESOLUTION_W=1024 #RESOLUTION_H=768 Global Dim TileIsMur.l(32, 24) For i=0 To 32 Step 1 TileIsMur(i,(#RESOLUTION_H/32)-1) = 1 Next TileIsMur(10,(#RESOLUTION_H/32)-2)=2 TileIsMur(9,(#RESOLUTION_H/32)-2)=1 TileIsMur(8,(#RESOLUTION_H/32)-2)=3
Structure object x.l y.l w.l h.l sprite_index.l vsp.f EndStructure
Structure s_solid x.l y.l sprite_index.l EndStructure
Procedure place_free(x,y,w,h) i1 = x/#LARGEUR_TILE j1 = y/#HAUTEUR_TILE i2 = (x + w -1)/#LARGEUR_TILE j2 = (y + h -1)/#HAUTEUR_TILE For i=i1 To i2 Step 1 For j=j1 To j2 Step 1 If i >= 0 And j >=0 And i <= 31 And j <= 23 If TileIsMur(i,j)=1 ProcedureReturn 0; EndIf If TileIsMur(i,j)=2 ProcedureReturn 2; EndIf If TileIsMur(i,j)=3 ProcedureReturn 3; EndIf Else ProcedureReturn 0; EndIf Next Next ProcedureReturn 1; EndProcedure Procedure draw_level() nb_bloc=0 For j=0 To 24 Step 1 For i=0 To 32 Step 1 If TileIsMur(i,j)=1 nb_bloc+1 ElseIf TileIsMur(i,j)=2 nb_bloc+1 ElseIf TileIsMur(i,j)=3 nb_bloc+1 EndIf Next Next Dim bloc.s_solid(80) For k=0 To nb_bloc Step 1 For j=0 To 24 Step 1 For i=0 To 32 Step 1 If TileIsMur(i,j)=2 bloc(nb_bloc)\x = i*32 bloc(nb_bloc)\y = j*32 bloc(nb_bloc)\sprite_index = #spr_bloc ElseIf TileIsMur(i,j)=2 bloc(nb_bloc)\x = i*32 bloc(nb_bloc)\y = j*32 bloc(nb_bloc)\sprite_index = #spr_penteG ElseIf TileIsMur(i,j)=3 bloc(nb_bloc)\x = i*32 bloc(nb_bloc)\y = j*32 bloc(nb_bloc)\sprite_index = #spr_penteD EndIf Next Next Next For i=0 To 80 Step 1 DisplaySprite(bloc(i)\sprite_index,bloc(i)\x,bloc(i)\y) Next EndProcedure
OpenWindow(#fenetre,50,50,#RESOLUTION_W,#RESOLUTION_H,"bonjour") OpenWindowedScreen(WindowID(#fenetre),0,0,#RESOLUTION_W,#RESOLUTION_H,0,0,0,0)
LoadSprite(#spr_zozor, "image/zozor.bmp", 0) LoadSprite(#spr_bloc, "image/bloc.bmp", 0) LoadSprite(#spr_penteG, "image/penteD.png", 0) LoadSprite(#spr_penteD, "image/penteG.png", 0)
Dim obj_player.object(0)
obj_player(0)\x = 320 obj_player(0)\y = 0 obj_player(0)\w = 84 obj_player(0)\h = 95 obj_player(0)\sprite_index = #spr_zozor obj_player(0)\vsp = 0.25
Repeat Event.l = WindowEvent() If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT) CheckTime = ElapsedMilliseconds() FlipBuffers() ClearScreen(RGB(128,128,128)) ExamineKeyboard() obj_player(0)\vsp+1 For i=0 To Abs(obj_player(0)\vsp) Step 1 If place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=1 And obj_player(0)\vsp> 0 obj_player(0)\y=obj_player(0)\y+1 ElseIf place_free(obj_player(0)\x,obj_player(0)\y-1,obj_player(0)\w,obj_player(0)\h)=1 And obj_player(0)\vsp< 0 obj_player(0)\y=obj_player(0)\y-1 Else obj_player(0)\vsp = 0 EndIf Next For i=0 To 5 Step 1 If KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x+83,obj_player(0)\y,obj_player(0)\w-1,obj_player(0)\h+1)=3 obj_player(0)\x-1 obj_player(0)\y+1 ElseIf KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=1 obj_player(0)\x-1 ElseIf KeyboardPushed(#PB_Key_Left) And place_free(obj_player(0)\x-1,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=2 obj_player(0)\x-1 obj_player(0)\y-1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h+1)=2 obj_player(0)\x+1 obj_player(0)\y+1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h)=1 obj_player(0)\x+1 ElseIf KeyboardPushed(#PB_Key_Right) And place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w+1,obj_player(0)\h)=3 obj_player(0)\x+1 obj_player(0)\y-1 EndIf Next If KeyboardPushed(#PB_Key_Up) If check = 0 And Not place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h+1)=1 check = 1 jump=25 EndIf If jump > 0 jump=jump-1 obj_player(0)\vsp = -3 EndIf EndIf If Not KeyboardPushed(#PB_Key_Up) jump = 0 check = 0 EndIf If place_free(obj_player(0)\x,obj_player(0)\y,obj_player(0)\w,obj_player(0)\h)=1 y-1 EndIf DisplaySprite(obj_player(0)\sprite_index,obj_player(0)\x,obj_player(0)\y) draw_level() Else Delay(5) EndIf Until KeyboardPushed(#PB_Key_Escape) Voilà la fonction draw_level ne marche pas que faire ? |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Dim 13 Mar 2011 - 17:16 | |
| - jbg77 a écrit:
- Je veux juste charger un fichier .txt
il y a quoi dans ton fichier texte ? sinon, tu peux charger un fichier type ini : OpenPreferences(NomFichier$) sinon, regarde du coté de : openfile, readfile - Citation :
- et pour la view pour le moment j'ai pas de carte mais si j'ai bien compris, il suffit juste de déplacer la carte ?
oui, et de lier la caméra au personnage qui lui est fixe - Citation :
- Edit : Un dernier problème
Voilà la fonction draw_level ne marche pas que faire ? il manque deux images pour que je puisse tester les 2 dernières . |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Dim 13 Mar 2011 - 17:36 | |
| Voici mon fichier txt - Code:
-
640 480 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 20000000000000000000 12000000000000000003 11200000000000000031 11111111111111111111 Donc c'est le niveau. Voici les images LienMerci pour ton aide ! |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Dim 20 Mar 2011 - 11:30 | |
| |
| | | blendman Utilisateur confirmé: Rang **
Messages : 433 Projet Actuel : Crée des jeux, logiciels, BD, Romans et nouvelles.
| Sujet: Re: [PureBasic]Topic Aide Lun 21 Mar 2011 - 9:13 | |
| - jbg77 a écrit:
- Alors tu as pu testé ?
salut je comprends ton fichier et ce que c'est sensé faire. Par contre, je n'ai pas encore travaillé sur ce genre de choses, donc je ne pourrais pas trop t'aider à ce niveau-là. Mais dès que j'aurai regardé comment on enregistre et on load un fichier texte (pour une map), j'essaierai de t'aider . |
| | | Oculus Utilisateur confirmé: Rang *****
Messages : 1688
| Sujet: Re: [PureBasic]Topic Aide Lun 21 Mar 2011 - 21:25 | |
| Nan j'arriverais à trouver tout seul pour les fichier c'est surtout pour l'erreur plus haut que je up le topic. |
| | | Contenu sponsorisé
| Sujet: Re: [PureBasic]Topic Aide | |
| |
| | | | [PureBasic]Topic Aide | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |