Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.10.2011, 22:46
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию Буксировка изображения...

Всем привет.
Разбил изображение на 9 частей, сделал перетаскивание, как можно сделать так, что бы изображение разбивалось в сетке StringGrid (DrawGrid) и там не происходило перехлёста изображений (наложения друг на друга) при перетаскивании или в StringGrid (DrawGrid) принцип игры "пятнашки" только возможен?
То что имеется на данный момент
http://zalil.ru/31941006
Заранее благодарен за помощь.
Ответить с цитированием
  #2  
Старый 26.10.2011, 22:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Запрети передвижку по диагонали и постоянно проверяй на соприкосновение, если коснулись - всё, в эту сторону стоп движение.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 26.10.2011, 22:59
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Запрети передвижку по диагонали и постоянно проверяй на соприкосновение, если коснулись - всё, в эту сторону стоп движение.
а если не запрещать движение по диагонали, никак?
И как проверять на соприкосновение?
Ответить с цитированием
  #4  
Старый 26.10.2011, 23:03
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Какую игру вы делаете, думаю тут все на много проще можно поступить, и ни каких коллизий обрабатывать не придется ...
Ответить с цитированием
  #5  
Старый 26.10.2011, 23:07
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pilot_Red
Какую игру вы делаете, думаю тут все на много проще можно поступить, и ни каких коллизий обрабатывать не придется ...
по сути игру "Пазл", но не пятнашки...
Как то нужно сделать так, что бы при перетаскивании если одно изображение задевает другое, то оно не ложилось на него, а к нему как бы присоединялось как деталь в мозаике
Ответить с цитированием
  #6  
Старый 26.10.2011, 23:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В принципе, запрещать по диагонали не обязательно. Картинки являются прямоугольниками, в массиве типа array[8] of TRect храним координаты картинок. При передвижении картинки обновляем её координаты в массиве. По циклу проходимся по всем координатам и проверяем на столкновение - IntersectRect.
И для такой игры использование VCL - издевательство, пиши на API.
Дополнительно можно проверить, сколько осталось до соприкосновения и, если, к примеру, меньше пяти пиксел - "слепить" их.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 26.10.2011 в 23:12.
Ответить с цитированием
  #7  
Старый 26.10.2011, 23:11
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
В принципе, запрещать по диагонали не обязательно. Картинки являются прямоугольниками, в массиве типа array[8] of TRect храним координаты картинок. При передвижении картинки обновляем её координаты в массиве. По циклу проходимся по всем координатам и проверяем на столкновение - IntersectRect.
И для такой игры использование VCL - издевательство, пиши на API.
Да, вот про IntersectRect читал, но так и не понял как с помощью него проверять на соприкосновение? http://www.codenet.ru/progr/delphi/W...ersectRect.php
Пример бы...
Ответить с цитированием
  #8  
Старый 26.10.2011, 23:16
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
В принципе, запрещать по диагонали не обязательно. Картинки являются прямоугольниками, в массиве типа array[8] of TRect храним координаты картинок. При передвижении картинки обновляем её координаты в массиве. По циклу проходимся по всем координатам и проверяем на столкновение - IntersectRect.
И для такой игры использование VCL - издевательство, пиши на API.
Дополнительно можно проверить, сколько осталось до соприкосновения и, если, к примеру, меньше пяти пиксел - "слепить" их.
вы пишете конечно всё по делу, но как реализовать я понятия не имею
Ответить с цитированием
  #9  
Старый 26.10.2011, 23:20
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

DectRect - куда скидывается результат сравнения остальных TRect-ов. Если результат не важен игнорируем его, важно что вернёт функция, при соприкосновении вернёт не нулевое значение - иными словами True.
Код:
  if not IntersectRect(DestRect, PrevRect, SecRect) then
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 26.10.2011, 23:23
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от AlexKop
по сути игру "Пазл", но не пятнашки...
Как то нужно сделать так, что бы при перетаскивании если одно изображение задевает другое, то оно не ложилось на него, а к нему как бы присоединялось как деталь в мозаике
AlexKop а зачем это делать, для красоты или для какого-нибудь мегафункционала. Просто если это действительно нужно то нужно решить следующие вопросы:
  1. Что делать если одна фигура толкает другую а другая третью и т.д.
  2. Что делать если фигура, например третья, упрется в стенку.
  3. Так как движения мышки дискретно, то соответственно обрабатываться у тебя все это дело будет в определенные моменты времени(следовательно нужно немного по-другому рассчитывать столкновения)
Ответить с цитированием
  #11  
Старый 26.10.2011, 23:31
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pilot_Red
AlexKop а зачем это делать, для красоты или для какого-нибудь мегафункционала. Просто если это действительно нужно то нужно решить следующие вопросы:
  1. Что делать если одна фигура толкает другую а другая третью и т.д.
  2. Что делать если фигура, например третья, упрется в стенку.
  3. Так как движения мышки дискретно, то соответственно обрабатываться у тебя все это дело будет в определенные моменты времени(следовательно нужно немного по-другому рассчитывать столкновения)
нужны для того, что такое задание
Цитата:
Написать программу пазл для 9 квадратов, запрет перехлест квадратов при их перемещении по форме.
Ответить с цитированием
  #12  
Старый 26.10.2011, 23:31
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

1. Игнорировать - стоим.
2. Игнорировать - стоим.
3. Никаких определённых моментов, обработка должна идти в таймере. Всё будет очень "гладко".
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 26.10.2011, 23:42
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
DectRect - куда скидывается результат сравнения остальных TRect-ов. Если результат не важен игнорируем его, важно что вернёт функция, при соприкосновении вернёт не нулевое значение - иными словами True.
Код:
  if not IntersectRect(DestRect, PrevRect, SecRect) then
А не могли бы вы пжл пример для 2-х Image'ов написать?
Ответить с цитированием
  #14  
Старый 26.10.2011, 23:46
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А какая разница?
Код:
if not IntersectRect(DestRect, Imag1.BoundsRect, Image2.BoundsRect) then
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #15  
Старый 26.10.2011, 23:58
AlexKop AlexKop вне форума
Прохожий
 
Регистрация: 17.10.2011
Сообщения: 12
Репутация: 10
По умолчанию

Спасибо angvelem'у и Pilot_Red'у за отзывчивость.
Завтра попробую сделать)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025