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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2021, 10:16   #1
tonya3
 
Регистрация: 02.05.2021
Сообщений: 8
Вопрос спрайты на Image-ах - Pac Man код в теме Delphi7 / как сделать игровое поле так, чтобы не столкнуться с преградами. Делфи

Как сделать стены, чтоб персонаж не проходил сквозь них? Использовала Image1(фон) и Image2 (персонаж). Помогите, пожалуйста.
tonya3 вне форума Ответить с цитированием
Старый 02.05.2021, 10:49   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Да пусть попробует - расшибёт лоб и одумается
Кто же знает, что там намалёвано в Image1. Если стены фиксированной толщины по краям image1, то по x < Image1.left + d и х > (Image1.left+ Image1.width) -d. Если они - другого цвета, то по цвету пикселей.
Речь идёт, я так понимаю, о самой примитивной 2D игре ?
digitalis вне форума Ответить с цитированием
Старый 04.05.2021, 09:23   #3
tonya3
 
Регистрация: 02.05.2021
Сообщений: 8
По умолчанию

Да. Но это курсовой проект, поэтому тут не должно быть ошибок. Все сайты просмотрела и нет информации как сделать игровое поле так, чтобы не столкнуться с преградами. Прикрепила фото самой формы при запуске и переходе к игре. Не совсем понимаю как сделать стены.
Изображения
Тип файла: png 1.png (52.0 Кб, 42 просмотров)
tonya3 вне форума Ответить с цитированием
Старый 04.05.2021, 10:17   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от tonya3 Посмотреть сообщение
как сделать игровое поле так
Персонаж движется не по картинкам, а по матрице, двухмерному массиву.
Преграды лишь отображение занятых частей матрицы, например там где еденицы, и пересместиться туда нельзя, а где нули туда перемещаться можно.

Персонаж в свою очередь перемещается по другой матрице, или хранит информацию о своём местоположении в другой матрице. и каждый раз идёт запрос к матрице - можно ли туда переместиться.
Alar вне форума Ответить с цитированием
Старый 04.05.2021, 10:19   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Я не специалист по играм, но если бы мне пришлось прогить такую афигнею, у меня было бы 2 пути:
1. Кроме выведенного на экран Image, завёл бы в памяти массив запрещённых для персонажа позиций, где он стукался бы об стенки. Массив рассчитывается статически один раз при загрузке (стены ведь не двигаются?) . И при попытке войти на недопустимую точку она (попытка) бы игнорировалась. Возможно, с выдачей звукового сигнала "БУМ!"
2. Без дополнительного массива. Анализировать по цвету пикселей Bitmap этого Image, и если они отличаются от цвета фона (чёрный) - не пущать.
Первый способ вроде быстрее, но при интерактивной игре скорость не сильно и нужна, человек - медленный. Так что я выбрал бы второй.
Игрописатели, возможно, выдадут другие варианты.
digitalis вне форума Ответить с цитированием
Старый 04.05.2021, 15:51   #6
tonya3
 
Регистрация: 02.05.2021
Сообщений: 8
По умолчанию

Alar, Это всё понятно. Но как именно это сделать?
Уже не первый день ищу информацию об этом. Находила похожие игры, но там либо код переписан на другом языке, либо нет того, что нужно мне.

digitalis, Хм...2 способ звучит круто, но как это сделать...
Спасибо огромное за Вашу помощь
tonya3 вне форума Ответить с цитированием
Старый 04.05.2021, 15:52   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Если лабиринт это лишь картинка, а цвет фона всегда точно известен (черный), то да, можно смотреть по цвету пикселя, если впереди персонажа есть хотя бы один не черный пиксель, значит не давать двигаться (не менять координату при нажатии кнопки движения).
Arigato вне форума Ответить с цитированием
Старый 04.05.2021, 16:01   #8
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от tonya3 Посмотреть сообщение
Но как именно это сделать?
If true then переместить

ВСЁ! )
Alar вне форума Ответить с цитированием
Старый 04.05.2021, 16:25   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

У тебя картинка сохранена в файл как картинка, или рисуется их программы?
Kronos913 вне форума Ответить с цитированием
Старый 04.05.2021, 16:45   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Не самый лучший способ строить спрайты на Image-ах. Но набросал пример по вашему заданию, вот код с движением, управлением и обработкой препятствий:

Код:
procedure TFMain.FormCreate(Sender: TObject);
begin
  Direction.X := 1;
  Direction.Y := 0;
  Mouth := 0;
  MoveTimer.Enabled := True;
end;

procedure TFMain.MoveTimerTimer(Sender: TObject);
var
  x, y, p, img: Integer;
  isMove: Boolean;
begin
  img := 0;
  x := Image2.Left + Direction.X;
  y := Image2.Top + Direction.Y;
  isMove := True;
  if Direction.X = 1 then begin
    img := 0;
    if x + Image2.Width < Image1.Width then begin
      for p := y to y + Image2.Height do
        if Image1.Canvas.Pixels[x+Image2.Width,p] <> clBlack then begin
          isMove := False;
          Break;
        end;
    end;
  end;
  if Direction.Y = 1 then begin
    img := 1;
    if y + Image2.Height < Image1.Height then begin
      for p := x to x + Image2.Width do
        if Image1.Canvas.Pixels[p,y+Image2.Height] <> clBlack then begin
          isMove := False;
          Break;
        end;
    end;
  end;
  if Direction.X = -1 then begin
    img := 2;
    if x >= 0 then begin
      for p := y to y + Image2.Height do
        if Image1.Canvas.Pixels[x,p] <> clBlack then begin
          isMove := False;
          Break;
        end;
    end;
  end;
  if Direction.Y = -1 then begin
    img := 3;
    if y >= 0 then begin
      for p := x to x + Image2.Width do
        if Image1.Canvas.Pixels[p,y] <> clBlack then begin
          isMove := False;
          Break;
        end;
    end;
  end;
  if isMove then begin
    if x < -Image2.Width then x := Image1.Width;
    if x > Image1.Width + Image2.Width then x := -Image2.Width;
    if y < -Image2.Height then y := Image1.Height;
    if y > Image1.Height + Image2.Height then y := -Image2.Height;
    Image2.Left := x;
    Image2.Top := y;
  end;
  Inc(Mouth);
  if Mouth = 8 then begin
    Image2.Tag := 1 - Image2.Tag;
    Mouth := 0;
  end;
  with Image2.Canvas do begin
    Brush.Color := clBlack;
    Rectangle(0, 0, Image2.Width, Image2.Height);
  end;
  ImageList1.Draw(Image2.Canvas, 0, 0, img * 2 + Image2.Tag);
end;

procedure TFMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_RIGHT: begin
      Direction.X := 1;
      Direction.Y := 0;
    end;
    VK_DOWN: begin
      Direction.X := 0;
      Direction.Y := 1;
    end;
    VK_LEFT: begin
      Direction.X := -1;
      Direction.Y := 0;
    end;
    VK_UP: begin
      Direction.X := 0;
      Direction.Y := -1;
    end;
  end;
end;
В архиве готовый проект под Делфи 7. Дальше можете дорабатывать в соответствии со своим заданием.
Вложения
Тип файла: zip Pac-Man.zip (16.7 Кб, 18 просмотров)
Arigato вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пожалуйста. Код заменяет русские буквы на английские, как сделать, чтобы и наоборот так же делал? КотикБегемотик C# (си шарп) 1 24.02.2021 12:20
Вызов процедуры в массиве. делфи. Как правильно вызвать процедуру и сделать так, чтобы результаты вписывались в memo1.Lines. vallera Помощь студентам 1 30.05.2017 22:45
как сделать так чтобы при нажатии на ComboBox выводилось поле из таблицы DBGrid? jawa250t БД в Delphi 4 21.04.2012 21:57
мой фотошоп - Как сделать так чтобы image принимал размеры той картинки которую я загружаю? bill Мультимедиа в Delphi 9 26.05.2007 23:17