gael12334 Ответов: 1

Как исправить "system.indexoutofrangeexception" в моей 2D-игре?


Привет,
Итак, я кодирую игру, и чтобы загрузить плитки, код будет читать файл .map, где находится информация о карте. Но это дает мне эту ошибку.

файл .map выглядит следующим образом:
Это всего лишь одна строчка...

48:48:00:06 48:48:00:06 48:00:00:07 1F:00:00:07 22:00:00:07 22:00:00:07 20:00:00:06 22:00:00:06 22:00:00:07 1F:00:00:06 82:00:00:06 87:52:00:06 81:52:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06 00:00:00:06



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace Core
{
    public class Core
    {
        //-----------Core------------//
        //-structs-//
        public struct XY
        {
            public int
                X,
                Y;
            public XY(int x, int y)
            {
                X = x; Y = y;
            }
        }

        //-Static Member-//
        public class Members
        {
            public static Panel VIEW = new Panel
            {
                Location = new Point(100, 0),
                Size = new Size(570, 570),
                Visible = true
            };
            public static Panel WORLD;
            public static Engine ENGINE = new Engine();
            public static Tile[,] TILE = new Tile[T_XCOUNT, T_YCOUNT];
            public static Init INIT = new Init();
            public static int
                T_XCOUNT,
                T_YCOUNT;
            public static bool
                FIRST_TIME_ENGINE_INIT = false,
                PLAYER_RENDER = false;

        }

        //-Player-//
        public class Player
        {
            public static Bitmap TEXTURE;
            public static Rectangle DIMENSION;
            public static XY LOCATION;
            public static char
                PLAYER_LOOKING_AT = 'S';
            public const int
                DEFAULT_XLOC = 9,
                DEFAULT_YLOC = 8,
                DEFAULT_XSIZE = 30,
                DEFAULT_YSIZE = 30;
            public const string
                DEFAULT_SPRITE = @"Sprites/Animated/Character/Gael/Gael-LSW.png";
            public static bool LookingAt(char direction)
            {
                PLAYER_LOOKING_AT = direction;
                if (PLAYER_LOOKING_AT == 'S')
                {
                    TEXTURE = new Bitmap(DEFAULT_SPRITE);
                }
                else if (PLAYER_LOOKING_AT == 'E')
                {
                    TEXTURE = new Bitmap(DEFAULT_SPRITE);
                }
                else if (PLAYER_LOOKING_AT == 'N')
                {
                    TEXTURE = new Bitmap(DEFAULT_SPRITE);
                }
                else if (PLAYER_LOOKING_AT == 'W')
                {
                    TEXTURE = new Bitmap(DEFAULT_SPRITE);
                }
                else
                {
                    TEXTURE = new Bitmap(DEFAULT_SPRITE);
                }
                return true;
            }
        }

        //-Constant Value-//
        #region Const
        public const int
        #region Values
            WINDOW_XSIZE = 770,
            WINDOW_YSIZE = 570,
            MAX_XTILE = 49,
            MAX_YTILE = 49;
        #endregion
        public const string
        #region Values
            WINDOW_TITLE = "Game",
            DEBUG_WINDOW_TITLE = "Debug",
            SPRITE_FOLDER = "Sprites/",
            DEFAULT_SPRITE_EXT = ".png";
        #endregion
        #endregion

        //-Tiles-//
        public class Tile
        {
            public XY LOCATION;
            public Rectangle DIMENSION;
            public Bitmap FORE_TEXTURE;
            public Bitmap BACK_TEXTURE;
            public bool COLLSION = false;
            public const int
                XSIZE = 30,
                YSIZE = 30;
            public void SetLocation(int x, int y)
            {
                LOCATION = new XY(x, y);
                DIMENSION = new Rectangle(LOCATION.X * 30, LOCATION.Y * 30, XSIZE, YSIZE);
            }
        }

        //-Methods-//
        public class Init
        {
            public void _Player()
            {
                //must be run only at first load. If runned twice, it will reset the location.
                Player.LOCATION = new XY(Player.DEFAULT_XLOC, Player.DEFAULT_YLOC);
                Player.DIMENSION = new Rectangle(Player.LOCATION.X, Player.LOCATION.Y, Player.DEFAULT_XSIZE, Player.DEFAULT_YSIZE);
                Player.TEXTURE = new Bitmap(Player.DEFAULT_SPRITE);
            }
            public void _Window(Form window)
            {
                window.Size = new Size(WINDOW_XSIZE, WINDOW_YSIZE);
                window.Text = WINDOW_TITLE;
                window.BackColor = Color.Black;
                window.Controls.Add(Members.VIEW);
                Members.VIEW.BringToFront();
            }

//ERROR - ERROR - ERROR - ERROR//
            public void _SetTiles(string mapFile)
            {
                int Y = 0, X = 0;
                string[] Parameter = new string[4];
                string[] TilesInfo = File.ReadAllLines(mapFile);
                for (int y = 0; y < TilesInfo.Count(); y++)
                {
                    string[] WordsInfo = TilesInfo[y].Split(' ');
                    Y = TilesInfo.Count();
                    for (int x = 0; x < WordsInfo.Count(); x++)
                    {
                        X = WordsInfo.Count();
                        Parameter = WordsInfo[x].Split(':');
                    }
                }
                Members.T_XCOUNT = X;
                Members.T_YCOUNT = Y;
                Members.WORLD = new Panel { Location = new Point(0, 0), Size = new Size(X * 30, Y * 30), Visible = true, BackColor = Color.Gray };
                Members.VIEW.Controls.Add(Members.WORLD);
                Members.WORLD.BringToFront();
                for (int y = 0; y < Y; y++)
                {
                    for (int x = 0; x < X; x++)
                    {
                        Members.TILE[x, y].FORE_TEXTURE = new Bitmap(SPRITE_FOLDER + Parameter[0] + DEFAULT_SPRITE_EXT); //ERROR IS HERE <<<<<<<<<<<<<<
                        Members.TILE[x, y].BACK_TEXTURE = new Bitmap(SPRITE_FOLDER + Parameter[1] + DEFAULT_SPRITE_EXT);
                        if (Parameter[3] == "06")
                            Members.TILE[x, y].COLLSION = true;
                        else
                            Members.TILE[x, y].COLLSION = false;
                    }
                }
            }
            public void _StartEngine()
            {
                Members.WORLD.Paint += new PaintEventHandler(_OnRender);
            }
            public void _OnRender(object sender, PaintEventArgs e)
            {
                if (Members.FIRST_TIME_ENGINE_INIT == false)
                {
                    Members.ENGINE.Init(e.Graphics);
                    Members.ENGINE.StartRender();
                    Members.FIRST_TIME_ENGINE_INIT = true;
                }
                else
                {
                    if (Members.PLAYER_RENDER == true)
                    {
                        Members.ENGINE.RenderPlayer();
                    }
                    else
                    {
                    }
                }

            }

        }
        public static void Render(bool RenderPlayer) //SetTile must have been run before this method, or else it'll throw an Execption.
        {
            if (RenderPlayer == true)
            {
                Members.WORLD.Paint += new PaintEventHandler(Render);
                void Render(object sender, PaintEventArgs e)
                {

                }
            }
            else
            {
                Members.WORLD.Paint += new PaintEventHandler(Render);
                void Render(object sender, PaintEventArgs e)
                {

                }
            }

        }
    }

}


Что я уже пробовал:

Я попытался посмотреть, идет ли он выше индекса, но исключение появляется, когда
TILES[0,0] = new Bitmap(...)
призванный...

1 Ответов

Рейтинг:
6

Patrice T

Этого нет в вашем коде:

TILES[0,0] = new Bitmap(...)

Цитата:
Как исправить "system.indexoutofrangeexception" в моей 2D-игре?

Где-то вы пытаетесь получить доступ к элементу массива, который не существует. это означает, что вы пытаетесь получить доступ к элементу 15 в массиве размером 10.
Совет: поскольку мы не можем сделать это за вас, запустите ваш код под отладчиком и, когда вы достигнете ошибки, проверьте массивы и переменные, где есть ошибка, есть несогласованное значение.

Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладка кода C# в Visual Studio - YouTube[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.