случайность из spritemap в spritebatch - PullRequest
0 голосов
/ 18 февраля 2011

Я уверен, что это легко исправить, и я искал как высоко, так и низко, проходил по сети восток, запад, север и юг, но без преобладания ...

Моя проблема в этом.Я пытаюсь сделать украшенный драгоценными камнями клон, только чтобы начать работать в xna.Однако я застрял на случайной прорисовке драгоценных камней / иконок / картинок.

Это то, что у меня есть.

Сначала сгенерированный список позиций, случайный объект и прямоугольник:

List<Vector2> platser = new List<Vector2>();
Random slump = new Random();
Rectangle bildsourcen;

protected override void Initialize()
{

for (int j = 0; j < 5; j++)
        {
            for (int i = 0; i < 5; i++)
            {
                platser.Add(new Vector2((i*100),(j*100)));
            }
        }
base.Initialize();
}

Довольно просто.

Я также загрузил текстуру с 5 иконками / драгоценными камнями / картинками -> 5 * 100px = ширина 500 пикселей.

allImage = Content.Load<Texture2D>("icons/all");

Затем наступает«ошибка».

protected override void Draw(GameTime gameTime)
{
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        int x = slump.Next(2);
        bildsourcen = new Rectangle((x * 100), 0, 100, 100);

        for (int i = 0; i < platser.Count; i++)
        {
        spriteBatch.Draw(allImage, new Rectangle((int)platser[i].X, (int)platser[i].Y, 100, 100), bildsourcen, Color.White);

        }

Итак, мой код.И вот что происходит: я хочу, чтобы он случайно выбрал часть моего изображения и нарисовал ее с заданными координатами, взятыми из списка vector2.Тем не менее, он помещает одно и то же изображение во все координаты и постоянно заменяет их, не случайными изображениями, а одинаковыми.Таким образом, вся доска продолжает мигать одинаковыми значками.То есть, вместо генерации 15231 и сохранения его в замороженном состоянии, на одну секунду ставится 11111, а на следующую - 33333.

Кто-нибудь понимает, что я пытаюсь описать?Я почти выдернул свои волосы.Кошачья шерсть уже выдернута ...

Спасибо заранее

1 Ответ

1 голос
/ 18 февраля 2011

Функция Draw вызывается один раз для каждого кадра. Эта строка:

int x = slump.Next(2);

Генерирует случайное число (в данном случае 0 или 1) каждого кадра, отсюда и мерцание.

Строка после этого выбирает спрайт из вашего атласа спрайтов на основе этого числа (в частности, он указывает прямоугольник, содержащий этот спрайт). И в следующем цикле вы рисуете несколько копий этого спрайта (всегда одно и то же изображение).

Вы должны выполнять всю игровую логику в функции Update. Эта функция даст вам время, и вы, вероятно, захотите внедрить метод ожидания определенного количества времени, прежде чем вы создадите случайный блок (поэтому продолжайте накапливать время, которое проходит между каждым Update, пока оно не достигнет некоторого порог). Точная механика того, когда вы хотите создать свой случайный блок, зависит от вас.

Конечно, это не говоря о том, что в структуре вашего кода есть и другие недостатки. Bejeweled играется на доске фиксированного размера с разными цветными блоками (каждый блок, который вы можете представить с числом от 1 до X). Расположение блоков должно быть неявным в вашей структуре данных (поэтому вам не нужно создавать список platser).

Так что ваш класс Game должен иметь что-то вроде:

const int BoardWidth = 10;
const int BoardHeight = 10;
int[,] board = new int[BoardWidth, BoardHeight];

Тогда в вашей функции Initialize вы должны заполнить board и, возможно, использовать 0 в качестве пустого пространства и от 1 до X, чтобы представить ваши цвета, например:

for(int x = 0; x < BoardWidth; x++) for(int y = 0; y < BoardHeight; y++)
{
    board[x,y] = slump.Next(1, 6); // gives 5 different sprites
}

Затем в Update дождитесь ввода данных пользователем или тайм-аута перед изменением игрового поля (в зависимости от вашего игрового процесса).

Затем в вашей функции Draw сделайте что-то вроде этого:

for(int x = 0; x < BoardWidth; x++) for(int y = 0; y < BoardHeight; y++)
{
    if(board[x,y] == 0) continue; // don't render an empty space

    Vector2 position = new Vector2(100*x, 100*y);
    Rectangle bildsourcen = new Rectangle(100*(board[x,y]-1), 0, 100, 100);
    sb.Draw(allImage, position, bildsourcen, Color.White);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...