Функция 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);
}