| | [ENGINE 2D] Blocs Dynamiques | |
|
+4Topaze22 onilink_ Termite Caly 8 participants | Auteur | Message |
---|
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: [ENGINE 2D] Blocs Dynamiques Lun 17 Oct 2011 - 22:19 | |
| Bonsoir, je vais vous monter içi un système de ma création qui permet de réduire énormément le nombre d'instances "sol/mur" dans vos jeux 2D. D'habitude on utilise une instance par case ce qui donne quelque chose comme ça: Comme vous pouvez le voir on est à 48 instances dans la salle. Le système que je vous propose quant à lui créer exactement la même salle mais avec seulement 10 instances. Voici comment procéder. On va commencer par créer trois lutins sprites et trois instances (objets): obj_blockFixed:obj_blockGoDown:Parent: obj_blockFixed obj_blockGoRight:Parent: obj_blockFixed On va maintenant créer un script. s_blocs_dynamiques - Code:
-
var X, Y;
if(object_get_name(object_index) == object_get_name(obj_blockGoRight)){ X=1; Y=0; }
if(object_get_name(object_index) == object_get_name(obj_blockGoDown)){ X=0; Y=1; }
while( !place_meeting(x+X,y+Y,obj_blockFixed) and x+sprite_width<room_width and y+sprite_height<room_height){ image_xscale+=X; image_yscale+=Y; } Reste plus qu'à mettre dans le "create" de "obj_blockGoDown" et "obj_blockGoRight" - Code:
-
s_blocs_dynamiques(); On créer notre salle: On exécute et voici le résultat final. La salle est exactement la même que le premier exemple mais avec seulement 10 instances. |
| | | Termite Utilisateur confirmé: Rang ****
Messages : 1005 Localisation : Dans ta charpente ! Projet Actuel : RayEngine 5.0
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Lun 17 Oct 2011 - 22:47 | |
| Autant utiliser un tableau, c'est nettement plus rapide |
| | | Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Lun 17 Oct 2011 - 22:50 | |
| - Code:
-
Autant utiliser un tableau, c'est nettement plus rapide Explique |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Lun 17 Oct 2011 - 23:23 | |
| Collisions bbox par tableau tout simplement. J'ai fait un exemple quelque part dans la section entraide débutants. Fin ton truc est cool quand même :p Plus simple a implémenter pour un débutant quoi. Et ça prend peut être moins de mémoire. Edit : Ah ben voila http://www.host-a.net/u/onilink_/array%202d%20collisions.gm6 |
| | | Termite Utilisateur confirmé: Rang ****
Messages : 1005 Localisation : Dans ta charpente ! Projet Actuel : RayEngine 5.0
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Lun 17 Oct 2011 - 23:41 | |
| - onilink_ a écrit:
- Collisions bbox par tableau tout simplement. J'ai fait un exemple quelque part dans la section entraide débutants.
Fin ton truc est cool quand même :p Plus simple a implémenter pour un débutant quoi. Et ça prend peut être moins de mémoire.
Edit : Ah ben voila http://www.host-a.net/u/onilink_/array%202d%20collisions.gm6 C'est surtout que le système d'instance de GM est assez lent Sinon le principe en soit est pas compliqué, tu créé une matrice (tableau deux dimensions) du style 0000000 0000000 1111111 où "0" représente le vide, 1 représente un bloc. Ensuite, tu utilises une fonction pour créé des coordonnées x&y attachés à un grille, ça ressemble à ça : xs & ys sont les coordonnées de x&y attaché sur une grille de 32x32 par exemple. Tu les calcule comme ça : - Code:
-
xs = x; moduloX = x mod 32
if (moduloX>16) xs+=32-moduloX else xs-=moduloX;
ys = y; moduloY = y mod 32
if (moduloY>16) ys+=32-moduloY; else ys-=moduloY;
Après tu génère ton tableau, dans ce cas on l'appelle 'map'. map[0][0] représente alors la case au coordonnées 0,0 (en haut à gauche) Du coups, pour tester une collision, tu fais par exemple : - Code:
-
if (map[xs/32][ys/32]!=0 && yspeed>0) { yspeed=0; y=ys; }
Et hop, t'as un sol.Bon, c'est moins pratique, vu qu'il faut générer un tableau. Tu peux à la rigueur, placer toutes tes instances sur ta carte dans GM, puis utiliser une boucle for afin de générer une matrice par rapport aux instances sur ta map, niveau rapidité c'est nettement meilleur Après pour les slopes, tu fais varier y en fonction de la distance entre x & xs et c'est dans la poche :p |
| | | Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 0:07 | |
| J'ai retrouver le sujet dont tu parle onilink_ : https://cbna.forumactif.com/t11170-resolu-utiliser-le-moins-de-memoire-possibleMerci à vous deux pour les explications. En fait je résume si j'ai bien compris. -Il n'y auras qu'une seule instance pour tout le sol. -Cette instance génère juste du draw par rapport aux données d'une matrice. -Les collisions ce font avec le dit draw. Avantages: Une seule instance. Inconvénients: Créer une matrice pour chaque salle. Beaucoup plus de vérifications (une par case) au démarrage de la salle. Beaucoup plus long à mettre en place. En fait pour l'histoire de la matrice ce n'est pas vraiment un problème, on peut vite coder un programme qui la génère. Par contre je pense que ton système est beaucoup plus groumant en ressource sur de très grandes maps. Je pense que pour un petit jeu de plateforme/A-RPG/etc mon système est plus simple à mettre en place. Par contre pour un MMO et surtout pour un jeu qui génère des cartes aléatoires ton système l'emporte haut la main.
Dernière édition par Caly le Mar 18 Oct 2011 - 0:16, édité 1 fois |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 0:14 | |
| Surtout le système est pas terrible sous GM a cause du coup des variables qui sont toutes des double. Mais en C/C++ ce genre de système n'a que des avantages :p |
| | | Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 0:20 | |
| - Code:
-
Mais en C/C++ ce genre de système n'a que des avantages :p Oui j'avais vus ce système dans le tutoriel d’apprentissage du C sur le SDZ. Enfait en C c'est pas mal car l’éditeur de maps c'est toi qui le conçois alors que sous GM il est dejà fait. Donc je reste sur ma possition sur le fait que pour des jeux de base mon systeme est mieu - Code:
-
Surtout le système est pas terrible sous GM a cause du coup des variables qui sont toutes des double. Et tu le confirme |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 9:47 | |
| Fin jvois mal quelqu'un faire un terraria like en utilisant un autre système par contre, même avec les inconvénients de GM :p |
| | | Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 11:42 | |
| En fouillant dans la doc je suis tombé sur ça : - Citation :
- Grilles (Grids)
Une grille est tout simplement un tableau à deux dimensions. Une grille présente une largeur et une hauteur définies par des entiers. La structure de la grille vous permet de déterminer et supprimer les valeurs de cellules de la grille en fournissant un index (devant débuter par 0 et ce pour les deux directions x et y). Mais il est également possible de déterminer des plages de valeurs, ajouter des valeurs particulières, de déterminer la somme, le maximum, le minimum ainsi que la valeur moyenne d'une plage donnée. Une grille peut être utile pour représenter par exemple un terrain de jeu. Bien que toutes ces fonctionnalités puissent également être réalisées à l'aide de tableaux à deux dimensions, les opérations sur des régions ou plages sont réalisées beaucoup plus rapidement en employant des grilles. Les fonctions suivantes existent :
ds_grid_create(w,h) Crée une nouvelle grille de largeur w et de hauteur h. La fonction retourne un entier représentant l'id de la grille qui devra être utilisé par toutes les fonctions devant accéder à la nouvelle grille créée. ds_grid_destroy(id) Détruit la grille d'ID id, libérant ainsi la mémoire utilisée. Ne pas oublier d'invoquer cette fonction quand vous n'aurez plus besoin d'utiliser cette grille. ds_grid_resize(id,w,h) Redimensionne la grille d'ID id avec les nouvelles largeur w et hauteur h. Les cellules déjà existantes conserveront leur valeur originale. ds_grid_width(id) Retourne la largeur de la grille d'ID id. ds_grid_height(id) Retourne la hauteur de la grille d'ID id. ds_grid_clear(id,val) Initialise le contenu de la grille d'ID id, avec la valeur indiquée val (val peut être aussi bien un nombre qu'une chaîne). ds_grid_set(id,x,y,val) Initialise la cellule indiquée x,y de la grille d'ID id avec la valeur mentionnée val (qui peut être un nombre ou une chaîne). ds_grid_add(id,x,y,val) Ajoute la valeur val dans la cellule indiquée x,y de la grille d'ID id. En ce qui concerne les chaînes, cela correspond à une concaténation. ds_grid_multiply(id,x,y,val) Multiplie la valeur val par la cellule indiquée x,y de la grille d'ID id. Cette fonction ne concerne uniquement que les nombres. ds_grid_set_region(id,x1,y1,x2,y2,val) Initialise toutes les cellules d'une région donnée x1,y1,x2,y2 de la grille d'ID id avec la valeur indiquée val (concerne aussi bien les nombres que les chaînes de caractères). ds_grid_add_region(id,x1,y1,x2,y2,val) Ajoute la valeur val aux cellules de la plage x1,y1,x2,y2 dans la grille d'ID id. En ce qui concerne les chaînes, cela correspond à une concaténation. ds_grid_multiply_region(id,x1,y1,x2,y2,val) Multiplie par la valeur val les cellules de la plage x1,y1,x2,y2 de la grille d'ID id. Cette fonction ne concerne uniquement que les nombres. ds_grid_set_disk(id,xm,ym,r,val) Initialise avec la valeur val toutes les cellules du disque avec comme centre xm,ym et rayon r. ds_grid_add_disk(id,xm,ym,r,val) Ajoute la valeur val à toutes les cellules du disque de centre xm,ym et de rayon r. ds_grid_multiply_disk(id,xm,ym,r,val) Multiplie par la valeur val toutes les cellules du disque de centre xm,ym et de rayon r. ds_grid_get(id,x,y) Retourne la valeur de la cellule indiquée x,y de la grille d'ID id. ds_grid_get_sum(id,x1,y1,x2,y2) Retourne la somme des valeurs de cellules de la plage x1,y1,x2,y2 de la grille d'ID id. Ne fonctionne que si les cellules ne contiennent que des nombres. ds_grid_get_max(id,x1,y1,x2,y2) Retourne le maximum des valeurs de cellules de la plage x1,y1,x2,y2 de la grille d'ID id. Ne fonctionne que si les cellules ne contiennent que des nombres. ds_grid_get_min(id,x1,y1,x2,y2) Retourne le minimum des valeurs de cellules de la plage x1,y1,x2,y2 de la grille d'ID id. Ne fonctionne que si les cellules ne contiennent que des nombres. ds_grid_get_mean(id,x1,y1,x2,y2) Retourne la moyenne des valeurs de cellules de la plage x1,y1,x2,y2 de la grille d'ID id. Ne fonctionne que si les cellules ne contiennent que des nombres. ds_grid_get_disk_sum(id,xm,ym,r) Retourne la somme des valeurs des cellules du disque. ds_grid_get_disk_min(id,xm,ym,r) Retourne le minimum des valeurs des cellules du disque. ds_grid_get_disk_max(id,xm,ym,r) Retourne le maximum des valeurs des cellules du disque. ds_grid_get_disk_mean(id,xm,ym,r) Retourne la moyenne des valeurs des cellules du disque. ds_grid_value_exists(id,x1,y1,x2,y2,val) Indique si la valeur val apparaît quelque part dans la plage x1,y1,x2,y2. ds_grid_value_x(id,x1,y1,x2,y2,val) Retourne l'abscisse x de la cellule dans laquelle la valeur val apparaît dans la plage x1,y1,x2,y2. ds_grid_value_y(id,x1,y1,x2,y2,val) Retourne l'ordonnée y de la cellule dans laquelle la valeur val apparaît dans la plage x1,y1,x2,y2. ds_grid_value_disk_exists(id,xm,ym,r,val) Indique si la valeur val apparaît quelque part dans le disque. ds_grid_value_disk_x(id,xm,ym,r,val) Retourne l'abscisse x de la cellule dans laquelle la valeur val apparaît dans le disque. ds_grid_value_disk_y(id,xm,ym,r,val) Retourne l'ordonnée y de la cellule dans laquelle la valeur val apparaît dans le disque. Si on utilise les grilles au lieu des tableaux les résultats sont les même niveau performances? |
| | | Termite Utilisateur confirmé: Rang ****
Messages : 1005 Localisation : Dans ta charpente ! Projet Actuel : RayEngine 5.0
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 12:30 | |
| Je pense que les ds_grid sont plus rapide
Mais pour un usage pareil, je sais pas si tu y verra une grosse différence |
| | | Topaze22 *Excellent utilisateur*
Messages : 6213 Localisation : Sur la Lune Projet Actuel : Projet HELLO/TOPAZE22 Mario Bros World
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 20:41 | |
| Si ton système savait fusionner intelligemment les blocs pour faire des 3X10 par exemple (donc fusionner sur l’horizontale et la vertical en même temps, ce serait encore meilleur ^^ [c'est ce que je fais dans le projet Mario]). Perso, je suis resté simple, la fusion se fait quand la room se lance, et après, les blocs actifs sont ceux dans la view. Comme ça déjà, les perfs sont vraiment bonnes, mais c'est vrais qu'avec un système de tableau, ça serait plus performant, mais plus consommateur de mémoire alors que coté mémoire, je n'ai pas de soucis en utilisant des blocs comme instance avec mon système, et je ne suis pas obliger d'aligner mes blocs sur des grilles. Au cas où ça interesse quelqu'un : dans creat event : - Citation :
- xorigine=x
yorigine=y xetat=1 yetat=1 actif=true x_close=0 IDCAPTEE=0 cpt=0 Dans step event : - Citation :
- instance_activate_object(obj_solide_32x32VD)
actif=true
if(cpt==0)//pour l'horizontale { while(actif==true) { IDCAPTEE=0 IDCAPTEE=collision_rectangle(bbox_left,bbox_top,bbox_right+1,bbox_bottom,object_index,false,true) if(IDCAPTEE>1) { if(IDCAPTEE.xorigine == xorigine+32*xetat && IDCAPTEE.yorigine == yorigine)//vers droite { actif=true x_close=1 xetat=xetat+IDCAPTEE.xetat//1 image_xscale=xetat with(IDCAPTEE){instance_destroy()} } else { actif=false } } else { actif=false } } } if(cpt==1 && x_close==0)//pour la verticale { while(actif==true) { IDCAPTEE=0 IDCAPTEE=collision_rectangle(bbox_left,bbox_top,bbox_right,bbox_bottom+1,object_index,false,true) if(IDCAPTEE>1) { if(IDCAPTEE.yorigine == yorigine+32*yetat && IDCAPTEE.xorigine == xorigine && IDCAPTEE.xetat==1)//vers le bas { actif=true yetat=yetat+IDCAPTEE.yetat//1 image_yscale=yetat with(IDCAPTEE){instance_destroy()} } else { actif=false } } else { actif=false } } } if(cpt==2)//pour transformer en objet "vide" de code {instance_change(obj_solide_32x32_repos,false)}
cpt=cpt+1;
Et on cree un second obj bloc dans lequel il y a rien et qui se nomme : obj_solide_32x32_repos L'idée étant que dans les premiers step, les blocs de gauche bouffent ceux de droite et s'étirent... Et qu'à la fin, il ne reste que des blocs ayant un sprite de 32x32 mais étiré vers la droite et vers bas si nécessaire. Oui, j'ai programmé ça comme un cochon, et pour les perfs, c'est top puisque à la fin il ne reste que des instance vierge de tout code. Garanti sans bug et ça permet de continuer à utiliser les place free et toutes les fonctions lié à solid dans n'importe quel système de plateforme. |
| | | Sekigo Le Magnifique Utilisateur confirmé: Rang *****
Messages : 1720
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 20:47 | |
| J'ai pas tout suivi vos problèmes de performance. Mais franchement, vous tuez des mouches à coup de bazooka là. La mémoire utilisé, tant que ça dépasse pas les 200 Mo à la louche, faut pas se prendre la tête plus que cela. Le plus important, c'est les cycles CPU et les accès disque. |
| | | Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mar 18 Oct 2011 - 23:49 | |
| Bonsoir, Topaz je n'ai pas du comprendre comment ton système fonctionne car je ne vois aucun changement quand je le lance mis à par que les blocs ce changent pour d'autres. J'ai fait un petit gmk de test disponible içi: http://www.fufox.net/?d=4F4E11B7A0F6(il faut switcher les rooms manuellement pour les comparer car ça bug avec les "room_goto".) - Citation :
- J'ai pas tout suivi vos problèmes de performance.
En fait, moi, c'est plus par soucis de rapidité à la création de rooms et par la même occasion d'avoir moins d'instances dans celle-ci. Là si je veux avoir un sol continu dans ma room je n'ai qu'à mettre une seule instance et mon sol est finis. |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mer 19 Oct 2011 - 0:13 | |
| En fait le top ça aurais été la possibilité d'attribuer un masque de collision au tiles. Mais bon ils nous sortent des GM machin, GM truc, et le plus important n'arrive jamais |
| | | Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mer 19 Oct 2011 - 0:21 | |
| Comme dans RPG MAKER qui a au passage les tuiles dynamiques et animés... alors qu'il est gratuit... |
| | | Qual Utilisateur confirmé: Rang ****
Messages : 1450 Projet Actuel : Tower Defence
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Mer 19 Oct 2011 - 3:03 | |
| Box2D sera intégré a GM même si ca n'as rien a voir |
| | | Iluvyou Nouveau
Messages : 9
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Jeu 20 Oct 2011 - 5:25 | |
| - Caly a écrit:
- Comme dans RPG MAKER qui a au passage les tuiles dynamiques et animés... alors qu'il est gratuit...
RPG Maker n'est pas gratuit. :) Il coute même cher si je me souviens bien 80 euros un truc dans le genre. |
| | | Qual Utilisateur confirmé: Rang ****
Messages : 1450 Projet Actuel : Tower Defence
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Jeu 20 Oct 2011 - 8:52 | |
| Tout est gratuit |
| | | anonim Débutant
Messages : 23
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques Lun 12 Mar 2012 - 22:04 | |
| Qual - Citation :
- Tout est gratuit
Le logiciel et la BDD oui, mais pas la licence. Tu ne pourra donc commercialiser les jeux. PS : désoler du méga up. |
| | | Contenu sponsorisé
| Sujet: Re: [ENGINE 2D] Blocs Dynamiques | |
| |
| | | | [ENGINE 2D] Blocs Dynamiques | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |