2013-07-27 5 views
0

Я работаю над игрой Runner HTML5, объект работает непрерывно, а на мыши - «щелчок», он прыгает. Затем я добавляю препятствие в игру и обнаруживаю столкновение, но оно работает неправильно. Проблема заключается в том, что когда препятствие сталкивается один раз с запущенным объектом и обнаруживает столкновение, очищайте все объекты, а затем перерисовывайте препятствия на холсте, но по мере того, как препятствие сталкивается снова и снова с быстротой и быстротой объекта hurdle .... :( Вопрос в том, как преодолеть Вот код:.Проблема с обнаружением столкновений с холстом для HTML5

function clearHurdle(){ 

    h.clearRect(100,hy,160,250); 
    //if(hx==paiX||hy==paiY){ 
    bl= new Image(); 
    bl.onload= function(){ 
     h.drawImage(bl,100,hy-20,160,250); 
    }; 
    bl.src= "blast.png"; 
    setTimeout(function(){ 
    h.clearRect(100,hy-20,160,250); 
    show_char=0; 
    clearAll(); 
    //drawpai(); 
    hurdle(); 
    },100); 

} 

function hurdle(){ 

    if(hx>(paiX-2) && hx<(paiX+2) && hy>(paiY-2) && hy<(paiY+2)){ 
     console.log(hx +'===='+(paiX-2)); 
     clearHurdle(); 
     hx=1360;  
    } 

    h.clearRect(hx,hy,170,250); 

    var img = new Image(); 

    img.onload= function(){ 
     h.drawImage(img,hx,hy,170,250); 
    } 

    img.src="hurdle.png"; 
    hx-= 4.5; 

    if(hx>-400){ 
     setTimeout(hurdle,1000/60); 
    } 

    show_char=1; 
} 
+0

Я считаю, что это из-за setInterval в вашей функции clearHurdle. Он работает отлично в первый раз, но поскольку setTimeout вызывает функцию 'hurdle' (которая затем вызывает' clearHurdle' обратно в бесконечно непрерывный цикл), добавляя, таким образом, второй setInterval. Чтобы исправить это, вам нужно объявить имя переменной для setInterval и использовать 'clearInterval (varName)' для каждого сброса –

+0

, благодаря @Zeaklous, это работает. :) Спасибо за помощь Бадди. –

ответ

1

Из того, что я могу сказать, что проблема с увеличением скорости, как игра идет на это из-за повторяющееся setTimeouts созданного в вашей clearHurdle функции так, как вы это его работает первый прогон, но поскольку setTimeout вызывает функцию hurdle (которая затем вызывает clearHurdle обратно в бесконечно непрерывный цикл), она добавляет второй, третий, четвертый и т. д. setTimeout для запуска.

Если это действительно ваша проблема, вы можете это исправить, объявив имя переменной для SetTimeout внутри функции clearHurdle, используя формат var varName = setTimeout(function(){ ...Code Here... }); и использовать clearTimeout("varName") переустанавливать SetTimeout каждый раз (если вы просто перестраивать программу не требуют функций, вызывающих друг друга)

Смежные вопросы