none
Проблема с реализацией собственной проверки(функции) коллизии, C#, WPF. RRS feed

  • Вопрос

  • Добрый вечер.
    имеется Canvas на нем в рандомальной последовательности появляются 
    прямоугольники (ось Х определяется рандомально и во время движения не изменяется)
    и движутся вниз (по оси Y).
    есть еще один прямоугольник внизу (ось Y не изменяется) может двигаться по оси Х в влево
    и вправо .
    нужно при пересечение  любого из прямоугольников с сверху и прямоугольника снизу,
    отнять один от переменной (int lives) которая имеет значение 3 , проблема в том что проверка происходит в Timer_tick очень
    быстро поэтому пересекаясь отнимается не один каждый раз а сразу 3.

    хотелось бы услышать совет/мнение по этому поводу. 

     код который я использовал в функции проверки:

            //// Check Collision of two objects
            public virtual bool IsCollide(GameObject[] objCollideWith)
            {
                foreach (GameObject objecCollide in objCollideWith)
                {
                    if (this.GameObjectRect.IntersectsWith(objecCollide.GameObjectRect))
                    {
                        this.alive = false;
                        objecCollide.alive = false;
                        return true;
                    }
                }
                return false;
            }
    
    


    • Изменено Konrud 13 февраля 2013 г. 17:35
    13 февраля 2013 г. 17:33

Ответы

  • На сколько я помню в играх того рода после столкновения мы какое то время не уязвимы. То есть в Timer_tick вам нужно поставить флаг, что столкновение было и вести отсчет в N секунд. Время N истекло, снимаем флаг и проверка столкновения снова осуществляется. Можете на время неуязвимости добавить объекту 50% прозрачности.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Konrud 15 февраля 2013 г. 13:46
    14 февраля 2013 г. 3:13
  • Привет

    Спасибо, что не забыли отметить ответ.

    А таймер можно просто запустить на 2 секунды (в пространстве System.Threading.Timer есть такая возможность одноразового запуска), либо прямо внутри события TimerTick вы можете вызвать Stop метод таймера.


    Для связи [mail]

    • Помечено в качестве ответа Konrud 15 февраля 2013 г. 14:50
    15 февраля 2013 г. 14:01
  • Вы Гений, спасибо, обязательно попробую.
    только вот как мне остановит Таймер после (например) 2 секунд, 
    что бы он не повторялся ?
    На С# не пишу, поэтому опишу алгоритм словами. Создаете глобальную переменную типа Boolean и еще одну типа Int (Integer на VB) и когда происходит попадание присваиваете буленовской значение True. В месте, где идет проверка попадания так же проверяете, что бы данная переменная была равна False. Если вдруг она True то переменной типа Int прибавляем одно значение. Далее по достижении у этой переменной некого порога мы сбрасываем ее значение на ноль и у нашего флага Boolean ставим False. Порог определяете по тому какое у вас стоит значение Interval у таймера. например если интервал 100, то 2 секунды это 20 срабатываний, значит пока переменная Int не достигнет числа 20 мы игнорируем проверку попадания. Надеюсь смог объяснить понятно :)

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Изменено LXGDARK 15 февраля 2013 г. 14:05
    • Помечено в качестве ответа Konrud 15 февраля 2013 г. 14:49
    15 февраля 2013 г. 14:04

Все ответы

  • На сколько я помню в играх того рода после столкновения мы какое то время не уязвимы. То есть в Timer_tick вам нужно поставить флаг, что столкновение было и вести отсчет в N секунд. Время N истекло, снимаем флаг и проверка столкновения снова осуществляется. Можете на время неуязвимости добавить объекту 50% прозрачности.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Konrud 15 февраля 2013 г. 13:46
    14 февраля 2013 г. 3:13
  • Вы Гений, спасибо, обязательно попробую.
    только вот как мне остановит Таймер после (например) 2 секунд, 
    что бы он не повторялся ?
    15 февраля 2013 г. 13:46
  • Привет

    Спасибо, что не забыли отметить ответ.

    А таймер можно просто запустить на 2 секунды (в пространстве System.Threading.Timer есть такая возможность одноразового запуска), либо прямо внутри события TimerTick вы можете вызвать Stop метод таймера.


    Для связи [mail]

    • Помечено в качестве ответа Konrud 15 февраля 2013 г. 14:50
    15 февраля 2013 г. 14:01
  • Вы Гений, спасибо, обязательно попробую.
    только вот как мне остановит Таймер после (например) 2 секунд, 
    что бы он не повторялся ?
    На С# не пишу, поэтому опишу алгоритм словами. Создаете глобальную переменную типа Boolean и еще одну типа Int (Integer на VB) и когда происходит попадание присваиваете буленовской значение True. В месте, где идет проверка попадания так же проверяете, что бы данная переменная была равна False. Если вдруг она True то переменной типа Int прибавляем одно значение. Далее по достижении у этой переменной некого порога мы сбрасываем ее значение на ноль и у нашего флага Boolean ставим False. Порог определяете по тому какое у вас стоит значение Interval у таймера. например если интервал 100, то 2 секунды это 20 срабатываний, значит пока переменная Int не достигнет числа 20 мы игнорируем проверку попадания. Надеюсь смог объяснить понятно :)

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Изменено LXGDARK 15 февраля 2013 г. 14:05
    • Помечено в качестве ответа Konrud 15 февраля 2013 г. 14:49
    15 февраля 2013 г. 14:04
  • А таймер можно просто запустить на 2 секунды (в пространстве System.Threading.Timer есть такая возможность одноразового запуска)



    Спасибо за ответ,
    Только что то я не нашел возможности одноразового запуска,
    не подскажите где именно или как это сделать.

    спасибо.
    15 февраля 2013 г. 15:05