Trafiło mi się to w trakcie ćwiczeń nad podobną gierką. Miałem m.in. takie zmienne, jak:
- położenie obiektu
- granice canvasa
- speed.
Kiedy obiekt jest na pozycji np. 1, i ma prędkość -7, to w następnej iteracji powinien znaleźć sie na -6. If teoretycznie zablokuje taką sytuację, ale niestety, bedzie to widać w postaci efektu "tłuczenia" się o barierkę (jak to inaczej sensownie napisać :-) ). Oczywiście będzie to też uzależnione od prędkości odświeżania itp.
Zdecydowanie lepszym rozwiązaniem jest uzależnienie położenia obiektu (obliczonego z wyprzedzeniem), od zwracanej wartości. Jak wygląda taki myk i kod doniego w przypadku JS?
paddleX = Math.max(0, Math.min(paddleX+paddleSpeed,
canvas.width-paddleWidth));
Ta linijka akurat definiuje położenie paletki Arkanoida, gdzie paddleX to współrzędne poziome, paddleSpeed to prędkość, a paddleWith to oczywiście szerokość.
W tym konkretnym wypadku nie zaimplementowałem badania kierunku ruchu, co wymusza zastosowanie drugiej linii z ujemnym paddleSpeed. Niemniej idea jest ta sama.
paddleX = Math.max(0, Math.min(paddleX-paddleSpeed, canvas.width-paddleWidth));
Zależnie od położenia obiektu zwracamy odpowiednią wartość, która staje się jego współrzędną.