Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 23:33   #1
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию Делаю тетрис на делфи немогу решить проблему

Дорогие программисты, буквально несколько часов назад столкнулся с проблемой -
Делаю тетрис.
Есть массив 28 на 12 клеток, в этот массив пишу фигуры.
Обозначаю клетки принадлежащие фигуре единицами.
Сделал коллизию по X и Y.
В таймере поставил прорисовку занятых клеток, и сдвиг по Y до тех пор пока не наступит коллизия.
Когда происходит коллизия по Y его значение сбрасывается и создаётся новая фигурка.
Решил сгладить движение фигур появилась ошибка.
Я добавил новую переменную YL и начал прибавлять ей значение от 1 до 20 то есть когда таймер тикает увеличивается сначала YL и если достигает 20 то YL сбрасывается и к основной координате (то есть Y) прибавляется единица. По задумке всё хорошо вот только на практике, все клетки со значением 1 стали двигаться от 1 до 20 пикселей.
Я решил это обойти переименовав фигурки другой цифровой.
Вроде всё просто когда коллизия по Y истинна (то есть фигурке некуда больше падать) обозначить все её клетки цифрой 2.
И графически цифру 2 отображать по другому (без использования переменной YL).
Всё просто! ага не тут-то было, когда я ставлю в своей программе выполнение чего либо после ложности коллизии всё хорошо но когда коллизия истинна и я пытаюсь переписать (записать, затереть) фигурку в программе вылетает ошибка.
Цитата:
Access volation at address 004594f5 in module 'tetris1.exe'. Read of address 00000360.
вот процедура таймера
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     if (colisionY=false)and(YL<20)then
     begin
     YL:=Yl+1;
     end
     else
     if (ColisionY=false)and(YL=20) then
     begin
     YL:=0;
     figure(0);
     y:=y+1;
     figure(1);
     end  else
     begin
     figure(0);   // <------- вот в этом месте ошибка
     del;
     y:=6;
     newForm;
     end;
     draw;
end;
Помогите пожалуйста, в чём я ошибся?

Выкладываю исходник и почти рабочий Exe, с двумя текстурками, управление стрелками вверх вправо и влево, стрелку вниз не нажимать она была для тестов.
Вложения
Тип файла: rar Тетрис.rar (295.1 Кб, 28 просмотров)
Тип файла: rar Исходник.rar (11.8 Кб, 24 просмотров)
Чтобы наделать ошибок надо для начала уметь хоть что то делать!

Последний раз редактировалось Gigabit; 04.12.2009 в 10:01.
Gigabit вне форума Ответить с цитированием
Старый 04.12.2009, 15:10   #2
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

такая ошибка возникает, например, когда что-пишешь за границами массива
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 04.12.2009, 15:41   #3
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Juffin Посмотреть сообщение
такая ошибка возникает, например, когда что-пишешь за границами массива
Спасибо Juffin, я не знаю что привело к этой ошибке но я нашёл выход -
Вместо того чтобы лепить фигуру другими цифрами, я просто заменил все единицы массива на 2ки после коллизии, ведь когда коллизия произошла мне фигурка больше ненужна, вот я и перебираю всё поле в тот момент пока новая фигурка ещё не создана!
Вот решение, надо было просто поискать другой вариант.
Код:
for I := 4 to 27 do
  for k := 1 to 11 do
  if AR[k,i]=1 then
  AR[k,i]:=2;
Единственный минус это то что компьютеру придётся лишний раз перебрать массив, что может сказатся на производительности(((
Чтобы наделать ошибок надо для начала уметь хоть что то делать!
Gigabit вне форума Ответить с цитированием
Старый 04.12.2009, 21:43   #4
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

Цитата:
Единственный минус это то что компьютеру придётся лишний раз перебрать массив, что может сказатся на производительности(((
сомневаюсь, что это серьезно скажется
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 05.12.2009, 13:45   #5
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Juffin Посмотреть сообщение
сомневаюсь, что это серьезно скажется
Да я согласен именно это не скажется, но весь механизм отображения уже привел развитие программы в тупик, дело в том что - для того чтоб показать следующий кадр программа выполняет следующие действия.
1 Отображает фон
2 переберает весь массив
3 Отображает части фигур в тех местах где они записаны в массиве
4 Проверяет коллизию
Мой старенький компьютер ели как с этим справляется, загрузка ЦП на 100%,
и что самое важное программа выполняется медленно, то есть
чтоб фигурки двигались с нормальной скоростью интервал таймера должен быть минимальный. Но ведь надо в игре сделать хотя бы 10 уровней на на каждом из которых фигурки должны двигаться быстрей чем на предыдущим. (((((
В одной из своих программ я уже обходил это с помощью сокращения расчётов, в ней любой движущийся Юнит прорисовывался на две клетки вокруг себя, а всё остальное не прорисовывалось.
Но моя фантазия на этот раз меня подвела и я никак не могу придумать алгоритм, сокращающий перебор массива.
Если у вас буду какие нибудь идеи с удовольствием приму во внимание.
Чтобы наделать ошибок надо для начала уметь хоть что то делать!
Gigabit вне форума Ответить с цитированием
Старый 05.12.2009, 14:10   #6
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию

Прошу прощения, задал вопрос и нашел ответ воспользовавшись поиском.
Админ удали этот пост пожалуйста.
Чтобы наделать ошибок надо для начала уметь хоть что то делать!

Последний раз редактировалось Gigabit; 05.12.2009 в 17:46.
Gigabit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить проблему nismo Microsoft Office Excel 7 12.09.2008 08:59
Немогу решить задачу Санячос Общие вопросы Delphi 2 11.06.2008 15:35
помогите решить проблему ... alexey7 Microsoft Office Excel 2 16.10.2007 13:25