[jeu] chargement des sprites

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

D'ailleurs, ou en es-tu dans le pathfinding ? C'est un sujet intéressant et compliqué aussi.
Pour un projet cette année, j'ai dus coder une routine qui trouve le plus court chemin pour circuler sur une carte. La carte est constituée par des keypoints, avec la distance entre chaque keypoint donnée. L'algo trouve le chemin le plus intéressant, et pas trop lentement ;)

J'ai aussi une routine qui fonctionne sur des labyrinthes (dans un tableau rectangulaire, mais il est possible de l'adapter sur des formes en l'utilisant comme base. Elle fonctionne même avec plusieurs chemins menant au même endroit.
En gros, tu indique dans le tableau la disponibilité de chaque case, et le programme te trouve par quelle case tu peux passer.

Pour l'algo avec les tableaux, il fonctionne pas mal avec des tableaux de 1000x1000, des chemins dans tous les sens. Il faudrait voir la taille de tes cartes ;) (en cases)

Le petit hic, c'est que je les ai finalisés sur du vb.net -_- (obligé par l'école dans laquelle je suis). Si tu veux y jeter un coup d’œil, je peux t'envoyer le programme résultant de mon boulot en mp (un truc sur les labyrinthes), et je peux aussi me lancer dans le portage sur PB, que je n'ai pas fait jusqu'à présent par flemme :mrgreen: Mais ça m'intéresserais pas mal, et de coder ça, et de pouvoir comparer PB à VB.net
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] chargement des sprites

Message par blendman »

Actuellement, c'est plutôt ombre qui a codé un premier essai de pathfinding. dans le client, on n'a pas encore de pathfinding, on devrait l'intégrer lorsque l'on passera les joueurs en mode multi.

Cela dit, dans mon éditeur de cartes, j'ai une fonction qui me permet de créer des cases bloquées (case de 64*32), donc, logiquement, une fois que ce sera codé, ça devrait être intégrable facilement sur nos cartes.

Si tu le souhaites, tu peux toujours poster un code de pathfinding, on comparera avec celui d'Ombre, et on prendra le plus rapide je pense :).
D'ailleurs, concernant les pathfinding, je pense que l'on va faire calculer ça dans chaque client : chaque pathfinding de chaque joueur, car on envoie les case de départ (là où il se trouve lorsqu'il clique) et d'arrivée (là où le joueur a cliqué), et ensuite c'est chaque client qui calculera le pathfinding des personnage (sauf le mobs). On ne calculera bien sûr que les personnages qui sont à l'écran + 50 pixels (bordure) par exemple.
Il est possible qu'il y ait des pathfinding différents d'un client à l'autre avec cette méthode (ce ne serait pas forcément gênant), mais c'est surtout pour alléger le calcul niveau server qui aura déjà beaucoup d'autres choses à faire :).
Je ne sais pas s'il existe une autre méthode pour les pathdinging dans un jeu multi-joueurs, pour calculer le pathfinding des personnage des clients.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

Alors,
blendman a écrit :case de 64*32
C'est un tableau de 64 cases sur 32 cases ? normalement, d'après mes expériences en calcul de chemin, c'est super rapide.
Je vais essayé de faire un exemple sur les bases que tu as donné, demain.
graph100 a écrit :Je ne sais pas s'il existe une autre méthode pour les pathdinging dans un jeu multi-joueurs, pour calculer le pathfinding des personnage des clients.
Pourquoi tu ne fait pas calculer au client le pathfinding uniquement du perso du client, il envoye ensuite la liste des checkpoints qu'il va parcourir pour faire le trajet. Du coup, le serveur renvoie à chaque client la position suivante de chaque perso affichés, et le client fait l'interpolation pour jouer une animation fluide de déplacements des perso.
Ca devrai rester léger non ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] chargement des sprites

Message par blendman »

graph100 a écrit :Alors,
blendman a écrit :case de 64*32
C'est un tableau de 64 cases sur 32 cases ? normalement, d'après mes expériences en calcul de chemin, c'est super rapide.
Je vais essayé de faire un exemple sur les bases que tu as donné, demain.
je me suis mal exprimé : je voulais dire ce sont des cases de 64 pixels * 32 pixels.
Les maps n'ont pas des tailles fixes, mais disons qu'en général, elles font en moyenne environ 5000*4000
Donc, si je ne me trompe pas ce serait un tableau de 79*125, à peu près.
Donc, ça risque d'être un peu plus long j'imagine.
graph100 a écrit :Je ne sais pas s'il existe une autre méthode pour les pathdinging dans un jeu multi-joueurs, pour calculer le pathfinding des personnage des clients.
Pourquoi tu ne fait pas calculer au client le pathfinding uniquement du perso du client, il envoye ensuite la liste des checkpoints qu'il va parcourir pour faire le trajet. Du coup, le serveur renvoie à chaque client la position suivante de chaque perso affichés, et le client fait l'interpolation pour jouer une animation fluide de déplacements des perso.
Ca devrai rester léger non ?
je pense que l'on va effectivement tester cette méthode, parmi d'autres ;).
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

voila un premier jet, il faut bien garder en mémoire que je n'autorise les déplacements que sur l'horizontale et la verticale pour l'exemple.
Je n'ai pas fini le code. Je pense que je vais ajouter un genre d'algo pour aller en ligne droite entre 2 obstacles, il faut donc détecter les obstacles. Le retour final de la procédure seras une liste des checkpoints (séparés par une case ou plus, pas forcément alignés horizontalement ou verticalement), permettant au perso de se déplacer en ligne droite entre les différents obstacles.

Code : Tout sélectionner


;{ Structure, variables globales, variables du code principal

Structure size_d
	cx.d
	cy.d
EndStructure


carte.SIZE\cx = 64
carte\cy = 32

w = 600 / 32 * carte\cx
h = 600 / 32 * carte\cy

Dim CarteMap.l(carte\cx - 1, carte\cy - 1)

; explication sur la carte :
; cette carte représente la possibilité de marché ou non sur chaque case.
; on prend comme hypothèse qu'on ne peux se déplacer que horizontalement et verticalement (bien sur ça n'est pas limité à cela, suffit de le coder)
; 1 : obstacle sur la case
; 0 : case libre
; autre chose : aucune signification pour le moment

; on rempli la carte d'objet aléatoires :
For a = 0 To carte\cx * carte\cy / 25
	x = Random(carte\cx - 1)
	y = Random(carte\cy - 1)
	
	If CarteMap(x, y) = 1
		a - 1
	Else
		CarteMap(x, y) = 1
	EndIf
Next

; on ajoute une zone fermée pour tester
For a = 0 To 20
	CarteMap(20, a) = 1
	CarteMap(a, 20) = 1
Next


NewList Path.POINT()


; position du joueur 
joueur.POINT\x = Random(carte\cx - 1)
joueur\y = Random(carte\cy - 1)

CarteMap(joueur\x, joueur\y) = 0

; dimensions des cases
casesize.size_d\cx = (w - 1) / carte\cx
casesize\cy = (h - 1) / carte\cy

; arrive voulue dans le pathfinding (déclaration de la variable)
Define arrive.POINT

;}

;{ procedures

; Global 	Dim ZCarte(ArraySize(CarteMap(), 1), ArraySize(CarteMap(), 2)) ; DEBUG ONLY

;{ initialisation d'un tableau en dehors de la procedure pour aller plus vite
Global Dim _map_.POINT(3)

_map_(0)\x = 0
_map_(0)\y = -1

_map_(1)\x = -1
_map_(1)\y = 0

_map_(2)\x = 0
_map_(2)\y = 1

_map_(3)\x = 1
_map_(3)\y = 0

Global NewList _tmp_(), NewList _tmp2_()
AddElement(_tmp_())
_tmp_() = 0

AddElement(_tmp_())
_tmp_() = 1

AddElement(_tmp_())
_tmp_() = 2

AddElement(_tmp_())
_tmp_() = 3

;}

Procedure PathFinding(*pos_joueur.POINT, *pos_arrive.POINT, Array carte.l(2), List chemin.POINT())
	Protected nb_modif.l, w.l, h.l
	
	; on met à zéro la liste
	ClearList(chemin())
	
	w = ArraySize(carte(), 1)
	h = ArraySize(carte(), 2)
	
	; on dimensionne la carte de travail
	Dim ZCarte(w, h)
	
	; initialisation
	ZCarte(*pos_arrive\x, *pos_arrive\y) = 1
	
	; écriture du nombre de pas mini pour arrivé à la case voulue
	Repeat
		nb_modif = 0
		
		For a = 0 To w
			For b = 0 To h
				If carte(a, b) <> 1
					If a > 0 And ZCarte(a - 1, b) <> 0 And (ZCarte(a - 1, b) + 1 < ZCarte(a, b) Or ZCarte(a, b) = 0) : ZCarte(a, b) = ZCarte(a - 1, b) + 1 : nb_modif + 1 : EndIf
					If b > 0 And ZCarte(a, b - 1) <> 0 And (ZCarte(a, b - 1) + 1 < ZCarte(a, b) Or ZCarte(a, b) = 0) : ZCarte(a, b) = ZCarte(a, b - 1) + 1 : nb_modif + 1 : EndIf
					If a < w And ZCarte(a + 1, b) <> 0 And (ZCarte(a + 1, b) + 1 < ZCarte(a, b) Or ZCarte(a, b) = 0) : ZCarte(a, b) = ZCarte(a + 1, b) + 1 : nb_modif + 1 : EndIf
					If b < h And ZCarte(a, b + 1) <> 0 And (ZCarte(a, b + 1) + 1 < ZCarte(a, b) Or ZCarte(a, b) = 0) : ZCarte(a, b) = ZCarte(a, b + 1) + 1 : nb_modif + 1 : EndIf
					
				EndIf
			Next
		Next
		
	Until nb_modif = 0
	
	; on en déduie le chemin à prendre en allant toujours dans la case de valeur plus petite que celle actuelle
	a = *pos_joueur\x
	b = *pos_joueur\y
	
	
	While ZCarte(a, b) <> 1
		CopyList(_tmp_(), _tmp2_())
		ok.b = #False
		
		For c = 0 To 3
			SelectElement(_tmp2_(), Random(ListSize(_tmp2_()) - 1))
			
			If a + _map_(_tmp2_())\x > 0 And b + _map_(_tmp2_())\y > 0 And a + _map_(_tmp2_())\x < w And b + _map_(_tmp2_())\y < h
				If ZCarte(a + _map_(_tmp2_())\x, b + _map_(_tmp2_())\y) <> 0 And ZCarte(a + _map_(_tmp2_())\x, b + _map_(_tmp2_())\y) < ZCarte(a, b)
					a + _map_(_tmp2_())\x
					b + _map_(_tmp2_())\y
					
					ok = #True
					Break
					; 			If a > 0 And ZCarte(a - 1, b) <> 0 And ZCarte(a - 1, b) < ZCarte(a, b)
					; 				a - 1
					; 			ElseIf b > 0 And ZCarte(a, b - 1) <> 0 And ZCarte(a, b - 1) < ZCarte(a, b)
					; 				b - 1
					; 			ElseIf a < w And ZCarte(a + 1, b) <> 0 And ZCarte(a + 1, b) < ZCarte(a, b)
					; 				a + 1
					; 			ElseIf b < h And ZCarte(a, b + 1) <> 0 And ZCarte(a, b + 1) < ZCarte(a, b)
					; 				b + 1
					; 				Else
					; coordonnée inacessibles demandée
					; 					ProcedureReturn
				EndIf
			EndIf
			
			DeleteElement(_tmp2_())
		Next
		
		If ok = #False
			ProcedureReturn 
		EndIf
		
		AddElement(chemin())
		
		chemin()\x = a
		chemin()\y = b
	Wend
	
EndProcedure

;}


;{ initialisation

If InitSprite() = 0 Or InitKeyboard() = 0
	End
EndIf

;}


;{ ouverture de la fenetre

If OpenWindow(0, 0, 0, w, h, "PathFinding sur une carte", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
	If OpenWindowedScreen(WindowID(0), 0, 0, w, h, 0, 0, 0)
		
	Else
		End
	EndIf
Else
	End
EndIf

;}




;{ boucle principale

Repeat
	event = WaitWindowEvent(100)
	ExamineKeyboard()
	
	;{ clavier
	
	If KeyboardReleased(#PB_Key_Escape) : event = #PB_Event_CloseWindow : EndIf
	
	;}
	
	;{ evenement souris
	
	If event = #WM_LBUTTONDOWN
		; je laisse la possibilité de mettre l'arrivé sur un obstacle pour voir comment réagit l'algo
		arrive\x = Round(WindowMouseX(0) / casesize\cx, #PB_Round_Down)
		arrive\y = Round(WindowMouseY(0) / casesize\cy, #PB_Round_Down)
		
		If Not (arrive\x < 0 Or arrive\x > carte\cx Or arrive\y < 0 Or arrive\y > carte\cy)
			PathFinding(joueur, arrive, CarteMap(), Path())
		EndIf
	EndIf
	
	;}
	
	
	;{ graphismes
	
	ClearScreen(0)
	
	If StartDrawing(ScreenOutput())
		; 		DrawingMode(#PB_2DDrawing_Transparent)
		
		Line(carte\cx * casesize\cx, 0, 1, h, #White)
		Line(0, carte\cy * casesize\cy, w, 1, #White)
		
		For a = 0 To carte\cx - 1
			Line(a * casesize\cx, 0, 1, h, #White)
			
			For b = 0 To carte\cy - 1
				If a = 0 : Line(0, b * casesize\cy, w, 1, #White) : EndIf
				
				If CarteMap(a, b) = 1
					; dessin obstacle
					Box(a * casesize\cx, b * casesize\cy, Round(casesize\cx, #PB_Round_Up), Round(casesize\cy, #PB_Round_Up), #Gray)
				EndIf
				
				; 				DrawText(a * casesize\cx + 1, b * casesize\cy + 1, Str(ZCarte(a, b))) ; DEBUG ONLY
				
			Next
		Next
		
		Circle((joueur\x + 0.5) * casesize\cx, (joueur\y + 0.5) * casesize\cy, casesize\cx / 2, #Red)
		
		Circle((arrive\x + 0.5) * casesize\cx, (arrive\y + 0.5) * casesize\cy, casesize\cx / 2, #Blue)
		
		ForEach Path()
			Circle((path()\x + 0.5) * casesize\cx, (path()\y + 0.5) * casesize\cy, casesize\cx / 5, #Yellow)
		Next
		
		StopDrawing()
	EndIf
	
	FlipBuffers()
	
	;}
	
	
Until event = #PB_Event_CloseWindow

;}

End
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [jeu] chargement des sprites

Message par djes »

Très bon! On pourrait facilement faire un super pacman avec ça :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] chargement des sprites

Message par blendman »

Ah oui, pas mal du tout :)
Manque plus que le déplacement en diagonal et faire se déplacer le personnage bleu et hop ce serait nickel :D.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

bah le bleu c'est la cible du clic de la souris (la destination du personnage qui lui est rouge ^^)

Pour la taille de la carte, ne t'inquiète pas, ça commence à sentir que ça rame vers des cartes de 500*500 selon les pc :mrgreen:
je t'ai dis que j'ai traité des labyrinthe de 1900 sur 1200 cases.

Bon, j'ai commencé un site web, (pour ainsi dire à cause de ce post :mrgreen: ) : CeriseCode
avec pour le moment, les seules pages disponibles présentant trèèèèès rapidement un programme que j'avais fait sur les labyrinthes, et le code de l'exemple que j'ai posté ci-dessus, mis à jour.

C'est surtout pour que tu vois l'application Labyrinthe, je te conseille d'essayer le mode de création 2, avec les paramètres suivant :
w = 1500, h = 1000, Taille des cases y = 1 (<--- pour pas que l'image soit bcp trop grande)

Pour voir le path finding en action, faut mettre soit le mode 1, soit 1+2.
Par contre, ne met pas une définition trop grande !!! Ça fonctionne, mais ça prend un temps important, car le programme génère un labyrinthe comportant plusieurs possibilités (des boucles) et lorsque tu as précisé une entré (en cliquant avec la souris, ça dessine un carré vert) et une sortie (un carré rouge, il faut dérouler la combobox de gauche) et pressé [entré], le programme calcul de manière récurrente le chemin le plus court, et le rend inaccessible, puis recommence, de sorte qu'à la fin, il ne reste qu'un seul chemin valable entre l'entré et la sortie.
Mais celui-ci est très long et compliqué.

La méthode 3, elle, génère en une seule fois un labyrinthe qui ne possède qu'un seul chemin quel que soit le couple d'entré-sortie qu'on prend.
Ce qui réduit considérablement le temps pour trouver la solution (il suffit de boucher les cul-de-sac ;)


***
pour revenir au programme PB, actuellement il y a un soucis de temps généré par la structure même du code.

Code : Tout sélectionner

		For a = 0 To w
			For b = 0 To h

			Next
		Next
Ces boucles font que le remplissage du tableau d'accessibilité se fait préférentiellement dans 2 directions : celle de gauche vers la droite (a = 0 to w, et de haut en bas (b = 0 to h)

On peut le mettre en évidence en plaçant la destination dans un coin et en mettant le joueur dans les autres coin (faire bouger pour voir la différence de vitesse. (Je vais éditer le post ci-dessus pour remplacer le code avec celui à jour)

J'ai une solution pour pallier à ces problèmes, cependant, elle utilise les liste chainées, et j'ai peur que ça ne ralentisse tout. Il faut faire des essais (utiliser les *pointers serais une bonne solution mais dur dur de pas faire d'erreurs)

voila voila ;)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] chargement des sprites

Message par blendman »

graph100 a écrit :bah le bleu c'est la cible du clic de la souris (la destination du personnage qui lui est rouge ^^)
heu, oui, c'est ce que je voulais dire :)

Sinon, j'ai testé ta nouvelle version ça commence à être vraiment sympa :).
J'aurai une question à ce propos :
- serait-il possible d'ajouter ceci : lorsque l'on clique gauche, le personnage (rouge donc) se déplace tout seul empruntant le chemin créé par le pathfinding ?
cela me permettra de voir comme tu fais cela (suivre chaque case). D'ailleurs, je me demandais si on ne pouvait mettre comme 'check pojnt" uniquement les changements de direction ? :)

En tout cas c'est très intéressant comme exemple, merci ;).
Pour la taille de la carte, ne t'inquiète pas, ça commence à sentir que ça rame vers des cartes de 500*500 selon les pc :mrgreen:
je t'ai dis que j'ai traité des labyrinthe de 1900 sur 1200 cases.
ok, il faudra que je teste ça avec 10 personnages à l'écran pour voir :D.
Bon, j'ai commencé un site web, (pour ainsi dire à cause de ce post :mrgreen: ) : CeriseCode
avec pour le moment, les seules pages disponibles présentant trèèèèès rapidement un programme que j'avais fait sur les labyrinthes, et le code de l'exemple que j'ai posté ci-dessus, mis à jour.
Bonne idée pour ce site ;).
C'est surtout pour que tu vois l'application Labyrinthe, je te conseille d'essayer le mode de création 2, avec les paramètres suivant :
w = 1500, h = 1000, Taille des cases y = 1 (<--- pour pas que l'image soit bcp trop grande)
J'ai testé et c'est vrai que c'est impressionnant comme labyrinthe :D.

pour revenir au programme PB, actuellement il y a un soucis de temps généré par la structure même du code.

Code : Tout sélectionner

		For a = 0 To w
			For b = 0 To h

			Next
		Next
Ces boucles font que le remplissage du tableau d'accessibilité se fait préférentiellement dans 2 directions : celle de gauche vers la droite (a = 0 to w, et de haut en bas (b = 0 to h)

On peut le mettre en évidence en plaçant la destination dans un coin et en mettant le joueur dans les autres coin (faire bouger pour voir la différence de vitesse. (Je vais éditer le post ci-dessus pour remplacer le code avec celui à jour)

J'ai une solution pour pallier à ces problèmes, cependant, elle utilise les liste chainées, et j'ai peur que ça ne ralentisse tout. Il faut faire des essais (utiliser les *pointers serais une bonne solution mais dur dur de pas faire d'erreurs)
ah oui, les pointeurs, on a souvent des invalid memory access avec ça :).

En tout cas, encore merci pour cet exemple.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

blendman a écrit :J'aurai une question à ce propos :
- serait-il possible d'ajouter ceci : lorsque l'on clique gauche, le personnage (rouge donc) se déplace tout seul empruntant le chemin créé par le pathfinding ?
cela me permettra de voir comme tu fais cela (suivre chaque case). D'ailleurs, je me demandais si on ne pouvait mettre comme 'check pojnt" uniquement les changements de direction ? :)
Oui, tu décris le fonctionnement que je veux obtenir. Malheureusement, hier je me égaré sur internet en créant mon site :mrgreen: donc je n'ai pas pris le temps de terminer le code entièrement.
De plus, je suis limité par un soucis qui n'est pas nouveau pour moi : comment tracer une ligne droite passant par 2 points, en ne mettant que des pixel consécutif (jamais 2 fois le même), et en évitant que 3 pixels se touchent (sur les cotés ou en diagonale).

En effet : voici comment je prévois de ne garder que les changements de direction :
- en 1er lieu je calcule le chemin avec l'algo déjà posté.
- j'initialise le point de départ courant sur la position du perso

- ensuite, on se déplace en ligne entre le point de départ courant
- - pour parcourir cette ligne, il faut passer de case en case sur le tableau map, dans la bonne direction. Je vais me débrouiller, d'ailleurs il me viens une idée assez simple ;)
- - On test chaque case autour de la case actuelle pour détecter un obstacle.
- si on trouve un obstacle, alors la case actuelle est stocké dans la liste des checkpoints et elle deviens la nouvelle case courante.
- on recommence depuis "ensuite, on se déplace en ligne..."

- on stop lorsque le point est le point de destination

Quand on a tout les checkpoints, il me semble que se serais une bonne idée de faire se déplacer le perso selon une courbe cattmull-rom (un code est passé sur le fofo il n'y a pas longtemps) qui est définie par les checkpoints.

note : pour les tests de vitesse, n'oublie pas de virer le débugger ;), chez moi le code passe de 280ms à 16ms
Dernière modification par graph100 le mer. 22/juin/2011 13:53, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

Et hop ! une nouvelle version ;)

Je n'ai pas encore implémenté le système pour les checkpoints, mais simplement j'ai accéléré l'algo pas mal !
j'ai mis à jour le code sur mon site : PathFindind V2

Question perf, voila ce que j'ai obtenu en testant :

Code : Tout sélectionner

;##############################
; test de vitesse de l'algo :
;##############################

;______________________________
; avant modification : MODE ARRAY

; sans delay aucun ( pas de Waitwindow() ou Delay()

; boucle normale - ordi DELL Studio 17 - T4200, dual core 2.00Ghz
; avec debugger : 309 ms
; sans debugger : 29 ms

; boucle normale + ouverture vers Zone vide - ordi DELL Studio 17 - T4200, dual core 2.00Ghz
; avec debugger : 44 ms
; sans debugger : 17 ms


;______________________________
; après modification : MODE LIST

; sans delay aucun ( pas de Waitwindow() ou Delay()

; boucle normale - ordi DELL Studio 17 - T4200, dual core 2.00Ghz
; avec debugger : 17 ms
; sans debugger : 17 ms

; boucle normale + ouverture vers Zone vide - ordi DELL Studio 17 - T4200, dual core 2.00Ghz
; avec debugger : 17 ms
; sans debugger : 17 ms

;##############################
; RAPPEL : 	17 ms pour une boucle correspond au minimum possible
; 				car il s'agit de 1/60ème de sec ce qui correspond à 60 FPS
;				Le Fps est limité par la fonction FlipBuffer(), qui syncronise la mise à jour de l'écran
;				sur une base de 60 image par seconde.
;##############################
Pour ce qui est des "Zone vide", c'est que je me suis dessiné un labyrinthe, et que j'ai fait des zones ou il n'est pas nécessaire d'aller. Mais le programme, lui, il va quand même investiguer ce qui s'y passe, et ça lui fait perdre son temps. C'est pour ça que j'ai différentié.

Ici on vois un gain de temps pour la 1er méthode, mais c'est inhérent à cette méthode... Mais lorsque j'ai codé la 2ème, je m'étais mal débrouillé dans l'ordre de traitement des éléments de la liste, et la boucle était super lente... mais c'est corrigé maintenant ;)

Je ne pense pas que tu ais des problèmes de temps avec cette procédure :mrgreen:
Je passe maintenant sur la suite du problème, comme évoquée plus haut 8)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

@Blendman : Comment tu entends le déplacement en diagonale ?

actuellement j'ai ça :
Image

Je vais simplifier le chemin pour passer à ça :
Image

Mais, comme je représente le terrain par des cases pleines, je pars sur le principe qu'on ne peux pas passer entre 2 cases en diagonale comme dans l'exemple suivant :
Image
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] chargement des sprites

Message par blendman »

graph100 a écrit :@Blendman : Comment tu entends le déplacement en diagonale ?

actuellement j'ai ça :
Image

Je vais simplifier le chemin pour passer à ça :
Image

Mais, comme je représente le terrain par des cases pleines, je pars sur le principe qu'on ne peux pas passer entre 2 cases en diagonale comme dans l'exemple suivant :
Image
en fait, pour répondre simple, je dirais qu'on ne peut pas marcher sur une case interdite, mais c'est tout :D.

Donc, logiquement ta solution N°3 devrait être ok (comme la 2 aussi) ;)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

Voila :mrgreen:

Image

Le lien pour le code : PathFinding v3

Pour les checkpoints, je pense qu'il suffit de regarde les points qui sont alignés et prend les extrémités.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: [jeu] chargement des sprites

Message par graph100 »

Bon j'ai fini une version de test de déplacement.

sur la page : https://sites.google.com/site/cerisecod ... athfinding

et le code direct : https://sites.google.com/site/cerisecod ... xemple_c01
Qu'en pense-tu ??
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre