![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Овцы и Волк [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'и клепать смысла нет.