|
Опубликовано 18.02.2008 05:45 (17 лет назад) # |
Допустим есть два массива:
enemy, our: array of TSoldier;
пусть TSoldier это класс, в котором важно свойство Coord: TPoint;
Хочу встроить функцию нахождения ближайшего врага в класс TSoldier в виде метода, например function TSoldier.GetEnemy:TPoint;
Как реализовать эту функцию?
Может ламерский вопрос, но каков я есть, таков и вопрос :)
Мои идеи:
Возможно эти массивы нужно запихать в объект типа TWorld и там вычислять данную функцию, но хотелось бы, чтобы каждый "солдат" мог для себя сам искать врага. Поэтому и решил спросить здесь, может подскажите как лучше осуществить мою задумку :).
Спасибо.
редакция от JohnJ, 18.02.2008 05:47 |
|
|
|
Опубликовано 18.02.2008 05:46 (17 лет назад) # |
тупо перебрать все и выбрать наименьшее :) |
|
|
|
Опубликовано 18.02.2008 05:47 (17 лет назад) # |
дык а как отдельный объект будет знать о существовании остальных объектов из самого класса... не понимаю :)
просто хочется сделать класс поуниверсальнее, если я и напишу что-то вроде for i := 0 to High(enemy) do distance := dist(Coord, enemy[i].Coord); то назвав массив по-другому, класс уже не будет работать... да и сами enemy должны будут искать в массивве our, а не в своём...
// немного подумав:
можно, наверное, передавать адрес массива с объектами в функцию?
типа function TSoldier.GetEnemyCoord(penemy: TPointer): TPoint;
или это не лучший способ?
редакция от JohnJ, 18.02.2008 05:59 |
|
|
|
Опубликовано 18.02.2008 06:00 (17 лет назад) # |
сделать глобальный Tlist, в него заносить уккзатели на классы, каждый клас в нем ищет кого нужно. Не ООП уже, но это игра, а не лабораторная работа в институт :) |
|
|
|
Опубликовано 18.02.2008 06:04 (17 лет назад) # |
спасибо, тоже думал так сделать (через TList), но потом решил позаморачиваться ещё с классами... просто потом проще использовать будет, если получится... если с классами не получится, то так и сделаю.
редакция от JohnJ, 18.02.2008 06:05 |
|
|
|
Опубликовано 18.02.2008 06:10 (17 лет назад) # |
а еще в array of обычно кладут данные, а не структуру, просто потому, что можно по указателю на первый элемент потом по всем разом пройтись (типа картинка - куча байтов обрабатывается в цикле последовательно). зачем хранить классы в array не пойму :) |
|
|
|
Опубликовано 18.02.2008 06:48 (17 лет назад) # |
а как их сделать лучше? тем же списком? в массиве для простоты сделал... думал так попроще будет :) |
|
|
|
Опубликовано 18.02.2008 09:17 (17 лет назад) # |
Я обычно помещаю все возможные объекты в единое пространство - напрмер класс CLevel. И у каждого класса объекта есть статический указатель на CLevel, в котором он находится. Таким образом можно получить не только все объекты, но и самого себя "через одно место". (:
Работает отлично. (: |
|
|
|
Опубликовано 18.02.2008 17:12 (17 лет назад) # |
У меня проблема хуже. Есть класс, который рулит всем. В нём лежат(он их создает он их и мочит) движки типа: Bots,Bullets,Effects,Teams и Lines. Каждый из этих двигов рулит типичными ему объектами. Теперь надо придумать, куда засунуть оружие (которое будет не только валятся на карте, но и его будут таскать боты). Ещё будут бонусы, их тоже надо, куда-нибудь затолкать.
PS: Пока писал пост допёр, что лучше сделаю оружие бонусам и с привинченными данными, так будет правильнее.))) |
|
|
|
Опубликовано 18.02.2008 19:31 (17 лет назад) # |
Если я тебя правильно понял, то я решил эту проблему так:
у каждого бота есть свойство iWeapon, в котором хранится указатель на объект - оружие, которое у него в руках, а если nil - то нет оружия...
Хотя, наверное, лучше и у каждого оружия делать указатель на владельца (типа Parent). Тогда все оружия, которые не имеют владельца, рисовать на земле, остальных в руках у владельцев :). |
|
|
|
Опубликовано 18.02.2008 21:05 (17 лет назад) # |
Ну, это само собой. Я то думал, кто будет следить за обрисовкой оружия и его уничтожение, а то, что у бота свойство Weapon должно быть это и ежу понятно. |
|
|