J'ai besoin d'aide avec mon code sur ma 2D isométrique en Monogame. J'ai réussi à créer un moteur de tuiles de 500 * 750 (format 128x64) à 60FPS (mais mon ordinateur est en feu), mais le problème est sur les plus grandes tailles où les FPS tombent beaucoup.Monogame - Tuiles isométriques, faible FPS sur les grandes cartes
Je vais d'abord charger toutes les tuiles dans la liste des tuiles:
for (int i = 0; i < 500; i++)
{
for (int j = 0; j < 750; j++)
{
int x = j * 128/2;
int y = i * 64;
int ix = x - y;
int iy = (x + y)/2;
tiles.Add(new Tile("001", new Vector2(ix, iy), new Vector2(j, i), spriteBatch, spriteFont, content));
}
}
puis quand je dois dessiner je suis méthode Colling qui attirera les tuiles visibles:
public void drawMap(Camera camera)
{
if (spriteBatch != null)
{
tilesDrawed = 0;
foreach (Tile tile in tiles) // the problem
{
if (camera.isTileVisibe((int)tile.position.X, (int)tile.position.Y))
{
Point isoCoords = new Point((int)tile.position.X, (int)tile.position.Y);
isoCoords.X -= camera.xOffset;
isoCoords.Y -= camera.yOffset;
tile.drawTile(isoCoords);
tilesDrawed++;
}
}
}
}
Je sais que les question est que je passe par chaque carreau posible. Mais je ne sais pas comment aborder cela: /. Je pensais que je vais ajouter à la liste des tuiles seulement visibles, mais à la fin c'est pareil, il faut que j'aille penser à toutes les tuiles pour vérifier si elles sont visibles à la caméra.
Résultat: Result
je vraiment besoin d'aide, je suis assis sur ce depuis longtemps.
Merci.
modifier: donc je remplacer mon foreach sur everytile avec seulement ceux qui sont visibles:
List<Tile> visibleTiles = tiles.FindAll(r => (
(int)r.position.X + 128 > camera.width + camera.xOffset - camera.width && (int)r.position.X - 128 < camera.width + camera.xOffset) &&
((int)r.position.Y + 64 > camera.height + camera.yOffset - camera.height && r.position.Y - 64 < camera.height + camera.yOffset));
foreach (Tile tile in visibleTiles)
{
Point isoCoords = new Point((int)tile.position.X, (int)tile.position.Y);
isoCoords.X -= camera.xOffset;
isoCoords.Y -= camera.yOffset;
tile.drawTile(isoCoords);
tilesDrawed++;
}
aucune aide, il est findAll je pense lent, il est juste un peu plus rapide.
je suis passé à tableau 2D je dois trouver des tuiles visibles .. quand je suis avec le calcul:
int si = (-camera.xOffset - tileWidth)/64;
int ei = (-camera.xOffset + camera.width + tileWidth)/64;
int sj = (-camera.yOffset - tileHeight)/64;
int ej = (-camera.yOffset + camera.height + tileHeight)/64;
Point start = twoDToIso(new Point(si,sj));
Point end = twoDToIso(new Point(ei, ej));
il est peu hors ,, si elle va outfobound je vais vérifier si la tuile existe .
Je ne peux pas le découvrir .. assis ici en pensant à 03h00
Merci pour la réponse, iso je l'ai mis dans tile [] [] tableau 2d, maintenant j'essaie de calculer ce qui doit être dessiné .. pas encore bon:/ –
Vous avez optimisé votre dessin avant, en limitant la nombre de tuiles dessinées. Utilisez le même algorithme mais utilisez-le pour obtenir la zone que vous voulez voir à la place. –
hmm, je suis vraiment perdu en ce moment la méthode avant était limitée mais si je dessine une tuile spécifiée c'est plus efficace, j'ai essayé de calculer le coin en haut à droite et de dessiner ça mais ça n'est pas correct pour une raison quelconque caluculer mal et le nombre de tuiles dessinées augmente. –