Форум: "Игры";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизОвцы и Волк Найти похожие ветки
← →
NZed © (2004-01-21 07:26) [0]Народ ! Помогите разобраться... Пишу я "Овец и Волка", т.к.
исходников не нашел :] пишу сам... Вот одна из моих проблем :
Дано шахматное поле 8х8, каждая клетка -
отдельный TImage, есть фигура, тоже Image, фигура может
передвигаться только влево, вправо,вверх, вниз - на 1 клетку...
В начале фигура возникает на доске в произвольном месте, далее
фигура должна возникать на той клетке, на которой юзер
кликнул, так вот, как зделать так, что бы не писать
обработчик для каждой из 64 Image"ов, с проверками может
ли быть "сюда" поставлена фигура или юзер переборщил - выбрал
не ближайшую из клеток, а далёёёёёкую и не достижимую...
Если кто тут чего не разобрал - не ругаццца! :] У меня
уже мозги отключаються, заранее всем спасибо!
← →
pavel_k (2004-01-21 08:07) [1]Создавать новый image для каждой фигуры - это глупость. Зайди на DelphiGFX, там есть примеры по выводу в image (в 1) всего, что надо. А так image"и клепать смысла нет.
← →
NZed © (2004-01-21 08:58) [2]Да нет, я ен саздаю новый Image, он 1 и тот же, только
меняются координаты, и фигруа всего 1 - типа Волк, проблема
в другом, в передвиженнии Волка в погоне за Овцами...
← →
Oyster © (2004-01-21 10:46) [3]По-моему, можно для каждого поля задать Tag от 0 до 63, написать обработчик для одного Image, а потом всем остальным поставить обработчиком эту процедуру, а в ней по (Sender as TImage).tag узнавать, чтог это за поле.
← →
Zorge (2004-01-21 10:53) [4]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(). Я прав?
← →
NZed © (2004-01-21 12:13) [5]2 Zorge >>> Начальная задумка в использовании такого множества
TImage была как фон, для визуального отоборажения что
это поле 8х8, т.е. каждая Image - просто частичка
фона и являеться статичной, а изображение "волка"
просто меняет свои координаты, ну а потом мне стукнуло
[будь проклят тот день...:]]повесить на них обработчик
клика мыши [сначала планировалось 4 кнопки - менять
координаты изображения - волка - вверх, вниз, и т.д.]
Ну а как ещё здесь поступить можно было? - Рисовать
одну боооольшую картинку с разлиновкой? это было
приемлимо с кнопками...
← →
Zorge (2004-01-21 14:03) [6]2 NZed
> Начальная задумка в использовании такого множества
> TImage была как фон, для визуального отоборажения
> что это поле 8х8
Это все хорошо, но что мешает использовать в качестве фона одну большую картинку с нарисованными на ней клетками и отслеживать onClick только на этой картинке? Кроме того, если изображение фона элементарно (т.е. квадратики определенного цвета), то можно данный фон и в цикле неплохо нарисовать.
← →
NZed © (2004-01-21 18:24) [7]Хорошо, возьмём пример, с 1 картинкой в качестве фона :
"Волк" находиться в центре поля, пользователь хочет его
переместить и кликает в нижний левый угол, здесь в принципе
можно вычислять координаты мыши и работать с ними, но,
согласитесь, достаточно неудобно, а на счёт квадратиков -
все они в совокупности представляют единую 3"х мерную картинку...
так что с циклом, ИМХО, здесь не стоит...
← →
Всеволод Соловьёв © (2004-01-21 19:25) [8]есть одна очень прикольная идея
у нас есть один имадж фоновый, с нарисованными кнопочками
у нас есть имадж с волком
если у нас размеры одной кнопочки 20*20, тогда имадж должен быть размером 60*60
а потом отслеживаем клик по координатам картинки с волком
т.е. если координаты высоты от 0 до 20 и ширины от 20 до 40, тогда перемещаем вверх
ну как, мысль ясна?
← →
Всеволод Соловьёв © (2004-01-21 19:27) [9]
> если у нас размеры одной кнопочки 20*20, тогда имадж должен
> быть размером 60*60
в смысле имадж с волком должен быть 60*60, а волк в центре этого имаджа
← →
nexxiss © (2004-01-21 19:44) [10]Послушай Oystera, дело говорит.
← →
Всеволод Соловьёв © (2004-01-21 22:22) [11][10] nexxiss © (21.01.04 19:44)
Дело-то дело он говорит, и по правилам надо бы так и делать, но мой способ вапсче оригинальный ;)
← →
NZed © (2004-01-22 10:44) [12]2 Всеволод Солловьёв >>>
^_^ Это всё я уже проходил, у меня были одни и те же
кнопки для овец и волка, а по клику по тому же овце
или волку, присваивалась переменная, и у же при нажатии кнопки,
(они появлялись вокруг фигуры) определялось чего куда двигать...
Но всё равно спасиба !
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c