Рейтинг:
9
OriginalGriff
Посмотрите на это: это просто вложенный условный знак.
a == player_ ? a : (b == player_ ? b : 0)
Если a == player_, то он возвращает a.
В противном случае, если b == player_, то он возвращает b.
Если оба теста не она возвращает 0
Думайте об этом как о "на месте, если":
if (a == player_)
return a;
else if (b == player_)
return b;
return 0;
Siddhant Bhati
О, Спасибо, чувак.
Могу я задать вам еще несколько вопросов по поводу этого кода? Я просто хочу, чтобы вы намекнули мне, на что я должен пойти.
Так что это игра типа астероида и когда игрок или пуля сталкивается с астероидом игра падает и забирает меня сюда :-
void Collision::DoCollisions(Game *game) const
{
for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
colliderAIt != конец;
++colliderAIt)
{
ColliderList::const_iterator colliderBIt = colliderAIt;
for (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
}
}
Исключение первого шанса при 0x00CFD250 в AsteroidsTest_2012.exe: 0xC0000005: нарушение доступа к местоположению чтения 0xFEEEFEF6.
OriginalGriff
Вы действительно должны задать этот новый вопрос, но на первый взгляд - а я не могу запустить ваш код, так что это все, что может быть - один из ваших указателей не прав.
Используйте отладчик для изучения того, что происходит во время выполнения кода, и это должно помочь вам выяснить, какой указатель плох, и это должно помочь вам найти, почему он плох!
Siddhant Bhati
Эй, Спасибо,
я думаю, что в этом для (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
ColliderA не будет получать значения или получать какую-либо выделенную память. Так ведь? или каждый раз он может получать одно и то же значение ColliderAIt.
Это может быть проблемой?
OriginalGriff
Проверьте с помощью отладчика - он покажет вам точно, что находится в какой переменной, и это единственный способ быть уверенным.
Вы присваиваете значение colliderA (от colliderAlt), но я никак не могу узнать, что, черт возьми, там содержится! :смеяться:
Серьезно, вам нужно использовать отладчик - это самый простой способ узнать, а не гадать.
Siddhant Bhati
Он говорит, что невозможно прочитать память для radius, entity и enabled. Возможно они пусты вот почему
OriginalGriff
Так что посмотрите, почему. Установите точки останова там, где они должны быть установлены, и посмотрите, что произойдет.
Siddhant Bhati
Я попытался отладить его, но не смог понять, в чем проблема -:
void Collision::DoCollisions(Game *game) const
{
for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
colliderAIt != конец;
++colliderAIt)
{
ColliderList::const_iterator colliderBIt = colliderAIt;
for (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
}
}
это и есть Collision.cpp
void Game::DoCollision(GameEntity *a, GameEntity *b)
{
Корабль *игрок = метод static_cast&ЛТ;корабль *&ГТ;(а == player_ ? a : (b == player_ ? b : 0));
Пуля *пуля = метод static_cast&ЛТ;пуля *&ГТ;(IsBullet(а) ? а : (IsBullet(б) ? б : 0));
Астероид *Астероид = static_cast<астероид *>(IsAsteroid(a) ? a : (IsAsteroid(b) ? b : 0));
если (игрок && астероид)
{
AsteroidHit(астероид);
DeletePlayer();
}
если (пуля && астероид)
{
AsteroidHit(астероид);
DeleteBullet(пуля);
}
}
это и есть Game.cpp
bool Collision::CollisionTest(Collider *a, Collider *b)
{
if (a->enabled == false)
возвращать false;
if (b->enabled == false)
возвращать false;
D3DXVECTOR3 diff;
D3DXVec3Subtract(&ампер;дифференциал, &амп;а->в положении &амп;б-&ГТ;положение);
float distance = D3DXVec3Length(&diff);
если (расстояние < (a->радиус + b->радиус))
{
вернуть true;
}
возвращать false;
}
это коллизионтест в Collision.cpp
OriginalGriff
Мы не можем запустить этот код в тех же условиях, что и вы, поэтому мы не можем дублировать вашу проблему.
Вот почему у вас есть отладчик - так что вы можете точно узнать, что "пусто", а затем использовать отладчик для отслеживания через ваш код, чтобы выяснить, почему. Но для этого нужно, чтобы вы запускали код и имели проблему - и единственный человек, который может это сделать, - это вы!
Итак, что именно вы сделали с отладчиком и что именно он показал?
Siddhant Bhati
О, я только что использовал отладчик, и отладчик показывает, что он не может считывать память угла поворота, размера астероида и вращения основного игрока тоже. Я думаю, что с этим есть какая-то проблема.
OriginalGriff
Как вы использовали отладчик?
Где вы поставили точку останова?
Что именно он вам показал?
Что было в различных переменных?
Это звучит так, как будто вы понятия не имеете, что такое отладчик, а тем более как его использовать! :смеяться:
Siddhant Bhati
Я использовал точки останова, где инициализируются коллайдеры. Например. Астероид *Астероид = метод static_cast&ЛТ;астероид *&ГТ;(IsAsteroid(а) ? а : (IsAsteroid(б) ? б : 0)); здесь
когда я смотрю на местных жителей, он дает правильные значения a и b, но когда я смотрю на компоненты игрока и астероида, он показывает, что он не может прочитать память угла, угловой скорости и размера. То же самое и для игрока
OriginalGriff
Поместите точку останова в верхней части метода и выполните пошаговые инструкции.
Вам нужно посмотреть, что именно входит в качестве А и В, и что они в конечном итоге устанавливают игрок, пуля и астероид. Потому что если вы начинаете смотреть на свой код, он не смотрит на угол, скорость или размер! Так что либо это не код, выдающий ошибку, либо вы предполагаете что-то, что не обязательно верно. Не предполагайте, проверьте!
Siddhant Bhati
В A астероид инициализируется, а в B пуля инициализируется, даже когда я не стреляю.
Кроме того, у меня тоже есть этот метод
пустота игры::AsteroidHit(астероид *Астероид)
{
int oldSize = asteroid->GetSize();
if (oldSize > 1)
{
int smallerSize = oldSize -1;
D3DXVECTOR3 position = астероид->GetPosition();
SpawnAsteroidAt(позиция, меньший размер);
SpawnAsteroidAt(позиция, меньший размер);
}
Делетеастероид(астероид);
}
вы уверены, что размер не повлияет на него, потому что он не смог прочитать размер?
OriginalGriff
И почему ты так думаешь?
Проверяли ли вы, откуда берутся объекты, которые вы передаете этому методу?
Так как это - кажется - неправильные объекты, вы должны знать, что они должны быть!
Siddhant Bhati
А и Б должны быть либо астероидом, либо игроком, пока я не выстрелю ни одной пули. да, я проверил, откуда они берутся ... Collision.cpp
Отсюда -:
void Collision::DoCollisions(Game *game) const
{
for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
colliderAIt != конец;
++colliderAIt)
{
ColliderList::const_iterator colliderBIt = colliderAIt;
for (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
}
}
OriginalGriff
И что же показывает отладчик там есть?
Да ладно, это займет целую вечность, если мне придется сказать вам, чтобы вы проверяли каждую переменную всю обратную дорогу... :смеяться:
Siddhant Bhati
Ха-ха, Он показывает а как астероид и Б как пулю, когда начинается игра. Это то, о чем вы спрашиваете, верно?
OriginalGriff
Так как же твоя пуля попадает туда, куда не должна?
Давай - следуй коду, пока он работает, и он должен где-то появиться...
Siddhant Bhati
Могу я связаться с вами лично? Я имею в виду почту или что-нибудь еще?
OriginalGriff
Нет, извините!