Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Овцы и Волк [Delphi, Windows]


NZed ©   (2004-01-21 07:26:00) 

Народ ! Помогите разобраться... Пишу я "Овец и Волка", т.к.
исходников не нашел :] пишу сам... Вот одна из моих проблем :
  Дано шахматное поле 8х8, каждая клетка -
отдельный TImage, есть фигура, тоже Image, фигура может
передвигаться только влево, вправо,вверх, вниз - на 1 клетку...
В начале фигура возникает на доске в произвольном месте, далее
фигура должна возникать на той клетке, на которой юзер
кликнул, так вот, как зделать так, что бы не писать
обработчик для каждой из 64 Image'ов, с проверками может
ли быть "сюда" поставлена фигура или юзер переборщил - выбрал
не ближайшую из клеток, а далёёёёёкую и не достижимую...
  Если кто тут чего не разобрал - не ругаццца! :] У меня
уже мозги отключаються, заранее всем спасибо!


NZed   (2004-01-22 10:44:00) [1]

2 Всеволод Солловьёв >>>
 ^_^ Это всё я уже проходил, у меня были одни и те же
 кнопки для овец и волка, а по клику по тому же овце
 или волку, присваивалась переменная, и у же при нажатии кнопки,
 (они появлялись вокруг фигуры) определялось чего куда двигать...
  Но всё равно спасиба !


Всеволод Соловьёв   (2004-01-21 22:22:00) [2]

[10] nexxiss ©   (21.01.04 19:44)
Дело-то дело он говорит, и по правилам надо бы так и делать, но мой способ вапсче оригинальный ;)


nexxiss   (2004-01-21 19:44:00) [3]

Послушай Oystera, дело говорит.


Всеволод Соловьёв   (2004-01-21 19:27:00) [4]


> если у нас размеры одной кнопочки 20*20, тогда имадж должен
> быть размером 60*60

в смысле имадж с волком должен быть 60*60, а волк в центре этого имаджа


Всеволод Соловьёв   (2004-01-21 19:25:00) [5]

есть одна очень прикольная идея
у нас есть один имадж фоновый, с нарисованными кнопочками
у нас есть имадж с волком
если у нас размеры одной кнопочки 20*20, тогда имадж должен быть размером 60*60
а потом отслеживаем клик по координатам картинки с волком
т.е. если координаты высоты от 0 до 20 и ширины от 20 до 40, тогда перемещаем вверх

ну как, мысль ясна?


NZed   (2004-01-21 18:24:00) [6]

Хорошо, возьмём пример, с 1 картинкой в качестве фона :
"Волк" находиться в центре поля, пользователь хочет его
переместить и кликает в нижний левый угол, здесь в принципе
можно вычислять координаты мыши и работать с ними, но,
согласитесь, достаточно неудобно, а на счёт квадратиков -
все они в совокупности представляют единую 3'х мерную картинку...
так что с циклом, ИМХО, здесь не стоит...


Zorge   (2004-01-21 14:03:00) [7]

2 NZed

> Начальная задумка в использовании такого множества
> TImage была как фон, для визуального отоборажения
> что это поле 8х8


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


NZed   (2004-01-21 12:13:00) [8]

2 Zorge >>> Начальная задумка в использовании такого множества
           TImage была как фон, для визуального отоборажения что              
           это поле 8х8, т.е. каждая Image - просто частичка
           фона и  являеться статичной, а изображение "волка"
           просто меняет свои координаты, ну а потом мне стукнуло
           [будь проклят тот день...:]]повесить на них обработчик
           клика мыши [сначала планировалось 4 кнопки - менять  
           координаты изображения - волка - вверх, вниз, и т.д.]  
           Ну а как ещё здесь поступить можно было? - Рисовать
           одну боооольшую картинку с разлиновкой? это было
           приемлимо с кнопками...


Zorge   (2004-01-21 10:53:00) [9]

2 NZed

> Да нет, я ен саздаю новый Image, он 1 и тот же
То ли я чего то не понял, то что, но ты до этого писал
> каждая клетка - отдельный TImage

pavel_k прав - использовать отдельный TImage для каждой клетки - это не правильно - лучше использовать только один TImage для всего поля. Если же использовать один TImage, то перерасчет графичеcких координат в логические (клетку) можно IHMO сделать как то так (клетка (0,0) находится в левом верхнем углу)


const
 WidthCell=20;  // Ширина клетки
 HeightCell=20; // Высота клетки

var
 CurX,CurY:Integer;
 CellX,CellY:Word;

procedure TForm1.Image1Click(Sender: TObject);
begin
 // Получаем логические координаты (отсчет с 0!!!)
 CellX:=Trunc(CurX/Width);
 CellY:=Trunc(CurY/Height);
 // Здесь можно анализировать лог. координаты на корректность
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 // Созраняем графические координаты
 CurX:=X;
 CurY:=Y;
end;


Но если все же будешь использовать много TImage (что с точки зрения размера программы в пямяти не есть хорошо), то можно поиграть со свойством Tag. Т.е. назначаешь разные Tag для разных TImage, обработчик ставишь один, а в нем уже и анализируешь Tag как то так

 ...
 CellX:=(Sender as TImage).Tag mod 8;
 CellY:=(Sender as TImage).Tag div 8;
 ...

P.S. Я так подозреваю, что ты используешь так много TImage для того, что бы отображать фигурку в клетке через Picture.LoadFromFile(). Я прав?


Oyster   (2004-01-21 10:46:00) [10]

По-моему, можно для каждого поля задать Tag от 0 до 63, написать обработчик для одного Image, а потом всем остальным поставить обработчиком эту процедуру, а в ней по (Sender as TImage).tag узнавать, чтог это за поле.


NZed   (2004-01-21 08:58:00) [11]

Да нет, я ен саздаю новый Image, он 1 и тот же, только
меняются координаты, и фигруа всего 1 - типа Волк, проблема
в другом, в передвиженнии Волка в погоне за Овцами...


pavel_k   (2004-01-21 08:07:00) [12]

Создавать новый image для каждой фигуры - это глупость. Зайди на DelphiGFX, там есть примеры по выводу в image (в 1) всего, что надо. А так image'и клепать смысла нет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо