2010-10-31 20 views
3

Je travaille sur un rpg descendant, et je veux mettre en œuvre des cartes de défilement sans couture. C'est-à-dire que lorsque le joueur explore le monde, il n'y a pas d'écran de chargement entre les cartes et pas de «portes» vers la zone suivante.tilemaps de défilement sans soudure

J'ai deux façons de briser le monde. Au niveau supérieur, j'ai des "zones" qui sont simplement une collection de 9 "cartes" (Ces zones ne sont représentées que par des répertoires). Dans la zone, les 9 cartes sont organisées en une grille de 3x3. Je n'ai pas encore trouvé la meilleure façon de représenter ces cartes, que ce soit par index ou par coordonnées relatives à la zone parente. Ces cartes sont ce qui est réellement rendu à l'écran de l'utilisateur. Compte tenu de la taille de chaque carte, et de la taille de la fenêtre, je sais que l'utilisateur ne pourra voir qu'un maximum de quatre cartes quand elles sont au coin d'une carte.

Mon problème est, comment puis-je suivre les cartes et leurs décalages respectifs dans le code que le joueur explore le monde? Je pensais avoir un map<Point, Map*> avec 0,0 étant la carte dans laquelle se trouve le joueur. Si le joueur était dans le coin inférieur gauche de la carte, alors la carte à l'est serait stockée comme 1,0, le carte au sud serait de 0,1 et la carte sud-est serait de 1,1. Le problème que je prévois avec ceci est, je ne suis pas sûr des points sont mutables, et si reconstruire la liste chaque fois que le joueur se déplace dans une autre carte ou une section différente de la carte poserait un problème.

+0

Le monde entier sera-t-il en mémoire à la fois? Ou allez-vous charger des zones adjacentes lorsque le joueur marche? –

+0

Ils seront chargés pendant que le joueur marche. Je pensais à ce problème un peu plus, et peut-être que ce n'est pas aussi dur que je le pensais. Je pourrais juste garder une liste des cartes chargées. Comme je parcours la liste pour les rendre, je fais juste quelques contrôles pour voir quelle est leur relation avec la carte dans laquelle se trouve le joueur. Je peux garder un pointeur sur la "carte actuelle" disponible pour vérifier toutes les cartes de la liste . Si le joueur est hors de portée de la carte, je peux le décharger. – rcapote

Répondre

2

C'est exactement ce que j'essaie de faire avec un jeu que j'écris dans FreeBASIC. Ce que je fais est légèrement différent, mais peut-être que cela peut être utile.

J'ai une carte du monde de 1024^2 (donc je peux la générer de manière fractale). Chaque carré terrestre sur la carte du monde est une carte REGION (un royaume miniature avec une histoire procédurale), mais j'ai rendu les cartes des régions très faciles à générer. Les cartes de région sont 128^2 et j'en ai quatre dans un tableau 256^2. Quand vous approchez du bord, il déplace les cartes et crée 2-3 nouvelles régions (bien que cela ne fasse qu'UN seul historique - la région dans laquelle se trouve le joueur).

À l'intérieur de ceux-ci sont 256^2 cartes ZONE, qui carreaux 2x2 également dans un tableau 512^2. Encore une fois, en approchant le bord, il se déplace et en génère de nouveaux.

J'ai essayé une grille 3x3 il y a quelque temps, mais j'ai dû la rejeter comme inefficace.

1

Considérons un deque de deques. De cette façon, les insertions et les suppressions sur les 4 côtés sont faciles.

1

Eh bien, si vous avez un tableau de pointeurs 3x3 de cartes et vous avez 0,0 être en haut à gauche, ce que vous pouvez faire si vous allez dans la salle au nord de vous, vous pouvez juste faire quelque chose comme maps[1,1] = maps[1,0]; déplacer chaque carte vers le bas et recharger la rangée du haut.

Bonne chance! J'espère que vous trouverez une solution efficace!

1

Une suggestion: viewport.

J'ai travaillé sur un périphérique GPS qui définissait une grande zone de dessin, mais l'écran ne définissait qu'une partie, ou zone de visualisation, de toute la zone. Le défilement implique le déplacement de la fenêtre (ou le changement de l'emplacement de la mémoire pour l'affichage), et le rechargement de l'écran (en utilisant la puce graphique).

Le concept est similaire à une grille 3x3. La fenêtre commence au centre. En se déplaçant vers la gauche, change l'adresse de la mémoire d'affichage.

Espérons que cela aide.Par ailleurs, il s'agissait d'un système intégré dans lequel l'application pouvait contrôler à 100% tous les périphériques matériels (et non partager avec d'autres applications).