http://wotbonus.by/ Протанки модпак скачать бесплатно
Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Просмотр темы
 Распечатать тему
Танчики (Денди) с миникартой
LLEEVV2009
#1 Распечатать сообщение
Опубликовано 23.03.2012 22:06:41
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

Всем привет!!! Спасибо что нашли время, читаете;)

Сложность возникла в следующем (постараюсь объяснить, что же мне нужно):

Всё началось с того, что я решил воссоздать дендевские танчики (Battle City) и внедрить туда мини карту. Создавать стал на XNA 4.0 .
И всё шло в начале хорошо. Создал текстурки, написал код движения и стрельбы танчиков, ввел миникарту. То есть вот что
imagepost.ru/images/1/11/11124.JPG

Но проблема возникла, когда стал думать о том чтоб пули не просто летали, но и чтоб взрывались(вместе с танком) при встрече с танком. Хотя реализовать
и это можно без проблем, если например весь игровой мир помещается на на игровом поле, как мы знаем есть в Battle City(денди). Но в моём случае сложнее, у меня игровой мир в размере 200 Х 80 текстур , а каждая текстурка игрового мира 40 Х 40 пикселей. Поставил на карте 300 вражеских танков. Из стволов этих танков как минимум снаряд вылетает.
То есть, суть в том , что нужно делать множество проверок каждой пули, на столкновении с игроком и наоборот.
И нужно это сделать так, чтоб ресурсы компа не так жрало.
Ну так вот идея у меня следущая в голову пришла: надо игровое поле (карту) разбить на сектора, и проверять движение каждой пули только в данном секторе на столкновение с танком. И этим можно съэкономить ресурсы компа.
И вопрос заключается в следующем: как это можно реализовать, хотя бы дайте совет, идеи, или хоть где-то статьи или исходники ( на любом языке программирования).
Может быть кто-нибудь с этой проблемой сталкивался, отпишитесь хоть вкратце :)
Заранее спасибо!!!!!!



PS: Все игровые объекты я добавляю в коллекцию List.
Вот например здесь я удаляю пули, которые достигают краёв игрового мира


Загрузить источник  GeSHi: C#
  1. public override void Update(GameTime gameTime)
  2. {
  3. for (int i = SpritesListClass.spritesList.Count - 1; i >= 0; --i) // коллекция List
  4. {
  5. IBinding s = SpritesListClass.spritesList[i];
  6. s.Update(gameTime);
  7. if (s.GetType() == (typeof(Bullet)) || s.GetType() == (typeof(Explosion)))
  8. {
  9. if (s.Cap()) // если метод вернёт true, то объект данной итерации удаляться, то есть пуля
  10. {
  11. SpritesListClass.spritesList.RemoveAt(i);
  12. continue;
  13. }
  14. }
  15.  
  16. }
  17.  
  18.  
  19. base.Update(gameTime);
  20. }
Добавлено за 0.008 секунд, используя GeSHi 1.0.8.2

Изменил(а) beaver, 24.03.2012 10:19:15
 
niksan321
#2 Распечатать сообщение
Опубликовано 23.03.2012 22:30:32
Старший специалист


Сообщений: 252
Зарегистрирован: 24.09.11

Ну... главное правило оптимизации - не нужно делать оптимизации :-) для вашей задачи я вообще не вижу смысла что-то оптимизировать (слишком мало объектов) нечего тут голову себе забивать.
Насчёт кода - каждый объект - отдельный класс и в нужном классе делать цикл проверки на столкновения и границы.
У вас же, в одном листе все объекты напичканы (как я понял у вас SpritesListClass содержит не только пули, но и вообще все игровые объекты), а это - лишняя итерация в цикле - зачем проверять то, что не нужно проверять, зачем переберать 1000 объектов, если из них проверить нужно только 10 и ты точно занешь какие? от функции typeof - вообще откажитесь, нечего её юзать в ресурсозависимых приложениях (будете клепать бизнесприложения - хоть всесь код делайте из typeof, а в играх - не стоит, нечего тут абстрагировать на столь высоком уровне, чтобы все объекты под одну гребёнку клепать)
Изменил(а) niksan321, 23.03.2012 22:37:04
 
LLEEVV2009
#3 Распечатать сообщение
Опубликовано 23.03.2012 23:03:48
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

За typeof спасибо!
Проверку на столкновения с границами я делаю именно в классах игровых объектов. Ту проверку (в приведённом выше коде) я деляю чтоб только удалить не использующийся объект(то есть там пуля и взрыв).
Я с вами согласен, то что, я делаю этой коллекцией множество лишних проверок.
То есть вы предлагаете, мне совсем убрать эту коллекцию List ? Или сделать несколько коллеций по объектам?
Для каждого игрового объекта я изначально создал класс. Сейчас посмотрю как можно в нужном классе объекта сделать цикл проверки на столкновения с другими объектами.
Изменил(а) LLEEVV2009, 23.03.2012 23:05:05
 
niksan321
#4 Распечатать сообщение
Опубликовано 24.03.2012 00:18:43
Старший специалист


Сообщений: 252
Зарегистрирован: 24.09.11

Да, лучше делать для каждого объекта свой лист, я делаю примерно так-
Загрузить источник  GeSHi: C#
  1. public class Enemy
  2. {
  3. public static List<Enemy> list=new List<Enemy>();
  4. //дальше сам класс
  5. }
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2

На самом деле, я сам ещё новичёк, но в своей первой игре мне потребовалось обрабатывать на уровне много объектов, порядка 1000 противников, и когда я понял что это всё безобразие тормозит на моём 4х ядернике, то пришлось оптимизировать и более менее разобратся в этом вопросе. Про вашу же задачу, я ещё раз повторюсь - не нужно ничего оптимизировать, пока это не тормозит, а судя по вашей задаче, это вообще тормозить не должно, по крайней мере я не представляю как нужно загадить код, чтобы танчики тормозили :-) даже если вы оставите всё как есть - ничего тормозить не должно, а раз не тормозит - то нефиг заморачиватся. Как закончите проэкт и если захотите и будет время - то пожалуйста, оптимизируйте сколько душе угодно, а пока уделите время на проработку функционала и графики.
Изменил(а) niksan321, 24.03.2012 00:25:39
 
LLEEVV2009
#5 Распечатать сообщение
Опубликовано 24.03.2012 08:47:44
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

Да, лучше делать для каждого объекта свой лист

Хорошая идея я так и сделаю!!!
Заморачиваться я стал от того , что в самом начале у меня игровое поле было размером 200 Х 200 элементов, но когда туда ввел 800-1000 танков, то игра стала притармажевать. Поэтому я резко и сократил размер поля и танков.

Например управление танками, я делаю через этот код:
Загрузить источник  GeSHi: C#
  1.  
  2. switch (stepShagi)
  3. {
  4. case 1:
  5. {
  6. //При нажатии кнопки "Вверх"
  7. MoveUp(ref positionVector2Map, speed);
  8.  
  9. rotation = 1.570796f;
  10. //уменьшим переменную, хранящую число шагов
  11. stepNumber--;
  12.  
  13. Ymm -= speed.Y;
  14.  
  15. // делаем передвижение игрока на миникарте
  16. if (Ymm < -47)
  17. {
  18. miniMapPosition.Y--;
  19.  
  20. Ymm = 0;
  21.  
  22. }
  23.  
  24. break;
  25. }
  26. case 2:
  27. {
  28. //При нажатии кнопки "Вниз"
  29. MoveDown(ref positionVector2Map, speed);
  30.  
  31. rotation = -1.570796f;
  32. //уменьшим переменную, хранящую число шагов
  33. stepNumber--;
  34.  
  35. Ymm += speed.Y;
  36.  
  37. // делаем передвижение игрока на миникарте
  38. if (Ymm > 46)
  39. {
  40. miniMapPosition.Y++;
  41.  
  42. Ymm = 0;
  43. }
  44.  
  45. break;
  46. }
  47. case 3:
  48. {
  49. //Точно так же обрабатывается
  50. //нажатие кнопки "Влево"
  51. MoveLeft(ref positionVector2Map, speed);
  52.  
  53. rotation = 0f;
  54. stepNumber--;
  55.  
  56. // делаем передвижение игрока на миникарте
  57. Xmm -= speed.X;
  58. if (Xmm < -55)
  59. {
  60. miniMapPosition.X--;
  61. Xmm = 0;
  62. }
  63.  
  64. break;
  65. }
  66. case 4:
  67. {
  68. //Аналогично - перемещение вправо
  69. MoveRight(ref positionVector2Map, speed);
  70.  
  71. rotation = 3.141592f;
  72. //уменьшим переменную, хранящую число шагов
  73. stepNumber--;
  74.  
  75. // делаем передвижение врага на миникарте
  76. Xmm += speed.X;
  77. if (Xmm > 54)
  78. {
  79. miniMapPosition.X++;
  80. Xmm = 0;
  81. }
  82.  
  83.  
  84. break;
  85. }
  86. }
  87. if (shetshik == 0)
  88. {
  89. bulletExplosion.Fire(positionVector2Map, new Vector2(
  90. -4 * (float)Math.Cos(rotation),
  91. -4 * (float)Math.Sin(rotation)));
  92. shetshik = randNum.Next(70, 190);
  93. }
  94. shetshik--;
Добавлено за 0.018 секунд, используя GeSHi 1.0.8.2


То есть наверно от switch тратиться много ресурсов.
Ну да ладно, суть не в этом. У меня на этой почве и возникла желание оптимизировать. Просто хочу в игру эту много чего ввести.
Хотя в этом вы правы, забить на заморочки, и просто кодить, а как пойдут тормоза, вот толко тогда и надо думать.
 
niksan321
#6 Распечатать сообщение
Опубликовано 24.03.2012 10:56:20
Старший специалист


Сообщений: 252
Зарегистрирован: 24.09.11

я думал у вас классические танчики, а тут 800-1000 танков на поле :-) тут будет притормаживать без оптимизации, оператор Case вы вызываете в методе Update? если возможно выложите проэкт, я посмотрю что можно улучшить и дам советы.
 
LLEEVV2009
#7 Распечатать сообщение
Опубликовано 24.03.2012 15:11:34
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

оператор Case вы вызываете в методе Update?

нет я создал специальный для него метод.
если возможно выложите проэкт
да без проблемSmile Это же не комерческая игра, а салянка только для себя. Там жалко проек много весит, так как музыку и картинки туда натыкал, хотя програмного кода очень мало. Да там не обращайте внимание на три почти одинаковых класса, делающих одну и туже функцию
(BasicLogicSprite,
BasicLogicSprite_Mini,
BasicLogicSpriteBullet
), всё пока лень объединить в один класс.
Я тоже новичёк в программировании, надеюсь сможете разобраться в моём запутанном кодеSmile
я посмотрю что можно улучшить и дам советы.

спасибо!

вот игра, то есть исходники танчиков
http://narod.ru/disk/44312802001.c6c643272d844e38b4c1e5a928b5aa07/LargeBattleTank.rar.html
http://depositfiles.com/files/bjifpql7o
Изменил(а) LLEEVV2009, 24.03.2012 15:22:20
 
niksan321
#8 Распечатать сообщение
Опубликовано 24.03.2012 23:55:15
Старший специалист


Сообщений: 252
Зарегистрирован: 24.09.11

ок завтра згляну, сегодня дел по горло
поглядел.... ну и говнокод Smile, ладно, москва не сразу строилась и я таким был Smile итак, пару граблей на которые я наступил, и возможно наступишь ты:
1. разделяй все объекты - класс противника, класс окружения(стены, вода, трава ...), класс главного героя, класс бонусов, класс пуль, отдельный статический класс глобальных переменных и общих методов, класс скринменеджера, класс меню, класс уровней - на вскиду больше не могу придумать
2. сделай простой скрин мэнеджер (тут я сильно в лужу наступил, делая игру без скринменеджера, пришлось половину переписывать) тут по теме - http://www.xnadev...cle_id=105 - без этого никакой более-менее сложной игы не сделать.
3. лично я отказался от "DrawableGameComponent" и в каждом классе (допустим противников) создавал свой рендертаргет и туда рисовал всех противников, потом попорядку отрисовывал все эти рендертаргеты на экран
4. вот это вообще не делай никогда - if (ScrollxX + dx >= 0 && ScrollxX + dx <= levelLength + 945) - что за магическое число 945? выноси все константы в область объявления переменных и объявляй там константы, давая им понятные имена
5. managementArtificialIntelligence.Update() - ты бы ещё подлиннее придумывал имена классам :-), краткость - сестра таланта, слышал такое?
6. вместо "rotation = 1.570796f;" напиши статический класс констант углов, и твоя запись примет вид "rotation = MathHelper.35grad;" - согласись, лучше читается?
7. нигде при расчёте движения противников/игрока/пуль я не увидел привязку ко времени, или ты надеешься на IsFixedTimeStep=true? в принципе, можно и так делать, но лично у меня были большие проблемы с таким значением

Вобщем - займись структурой игры, иначе потом 200 раз будет всё переписывать, из-за не продуманности структуры.
Прежде чем продолжать делать игру обязательно сделай меню, как показала практика - не так-то просто его встроить в проэкт, в котором ты забыл про меню и думал "а потом сделаю, что тут сложного" (тут тебе как раз пригодится скринмэнеджер).

ЗЫ: если постаратся то и из батлсити можно сделать отличный ремейк, не бросай своё дело и всё у тебя получится :-)
Изменил(а) niksan321, 25.03.2012 01:32:10
 
LLEEVV2009
#9 Распечатать сообщение
Опубликовано 25.03.2012 07:10:48
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

поглядел.... ну и говнокод

так и думал , что так ответитеSmile
Я этот проект несколько раз переделывал, и например раньше размер одной из текстур окружения был 40 Х 40. Но потом увеличил размер.
if (ScrollxX + dx >= 0 && ScrollxX + dx <= levelLength + 945) эта могическая цифра появилась именно с тех времён. Потом мне было лень всё скорректировать.( Вроде, типа всё работает, да и ладноSmile ) С rotation = 1.570796f тоже самое, даже создал отдельный клас для него.
DrawableGameComponent

К DrawableGameComponent у меня зависимость появилась, от книг про XNA, там наверно все примеры с ни делаютьсяSmile

Огромное спасибо, что выделили время. Теперь по вашим советам, у меня открылся огромный фронт работы. Можно сказать, таки нарвалсяSmile . Не куда не денешься от этого. Как со мной часто было, что проходила какое-то время, когда я не занимался проектом, и когда снова начинал им заниматься, то не мог нормально ни в чём разобраться.
Это служило поводом переписывать код.
Эта последняя версия проекта, что вы посмотрели, наверно самая лучшая, ввёл туда комментарии, многие части кода разместил по классам. Но всё равно до совершенства мой код очень долёк.

, не бросай своё дело и всё у тебя получится :-)

Даже не надейтесьSmile Сейчас уже врятли брошу. Занимаюсь этим проектом уже месяцев 9. Это всё вошло в привычку.
Кто знает, а может что и получиться!!!Всем привет
Изменил(а) LLEEVV2009, 25.03.2012 07:11:33
 
LLEEVV2009
#10 Распечатать сообщение
Опубликовано 30.03.2012 17:38:43
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

Выход из своей трудности нашёл. Проверять не все клатки игрового поля на столкновение с каждой пули, а лишь те, которые окружают пулю (8 клеток).
Вот этот фрагмент
Загрузить источник  GeSHi: C#
  1. void BulletCollisions()
  2. {
  3. // Получить прямоугольник пули и найти соседние плитки.
  4. Rectangle bounds = boundingRectangle;
  5.  
  6. // находим граничещие с пулей верхние тайлы
  7. int topTile = (int)Math.Floor((float)bounds.Top / Tile.Height);
  8. // находим граничещие с пулей нижние тайлы
  9. int bottomTile = (int)Math.Ceiling(((float)bounds.Bottom / Tile.Height)) - 1;
  10.  
  11. // находим граничещие с пулей левые тайлы
  12. int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width);
  13. // находим граничещие с пулей правые тайлы
  14. int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1;
  15.  
  16.  
  17. // Для каждого потенциально сталкивающихся плитки,
  18. for (int y = topTile; y <= bottomTile; ++y)
  19. {
  20. for (int x = leftTile; x <= rightTile; ++x)
  21. {
  22. ...
Добавлено за 0.008 секунд, используя GeSHi 1.0.8.2

Изменил(а) LLEEVV2009, 30.03.2012 17:40:53
 
niksan321
#11 Распечатать сообщение
Опубликовано 30.03.2012 17:41:25
Старший специалист


Сообщений: 252
Зарегистрирован: 24.09.11

нужно не 8 клеток проверять, а 1у, ту, в которую летит пуля, как только пуля её пересекла, то следующую по направлению полёта
 
LLEEVV2009
#12 Распечатать сообщение
Опубликовано 30.03.2012 17:45:55
Специалист


Сообщений: 66
Зарегистрирован: 25.03.11

niksan321 написал:
нужно не 8 клеток проверять, а 1у, ту, в которую летит пуля, как только пуля её пересекла, то следующую по направлению полёта

Спасибо!!
 
Перейти на форум:
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,77 секунд 8,709,779 уникальных посетителей