2012-03-16 11 views
10

Robię grę Pong w javascript, aby nauczyć się tworzenia gier, i chcę, aby była zorientowana obiektowo. Nie można uzyskać clearRect do pracy. Wszystko, co robi, to narysować linię, która rośnie dłużej. Oto odpowiedni kod:clearRect nie działa

function Ball(){ 
    this.radius = 5; 
    this.Y = 20; 
    this.X = 25; 
    this.draw = function() { 
     ctx.arc(this.X, this.Y, this.radius, 0, Math.PI*2, true); 
     ctx.fillStyle = '#00ff00'; 
     ctx.fill(); 
    }; 
} 

var ball = new Ball(); 

function draw(){ 
    player.draw(); 
    ball.draw(); 
} 

function update(){ 
    ctx.clearRect(0, 0, 800, 400); 
    draw(); 
    ball.X++; 
} 

Próbowałem umieścić ctx.clearRect udział w funkcjach draw() i ball.draw() i to nie działa. Próbowałem również fillRect z białym, ale daje takie same wyniki. Jak mogę to naprawić?

+3

Czy można ustawić to na jsFiddle, aby pomóc wyjaśnić * narysować linię, która rośnie dłużej *? – alex

+0

Próbowałem go wcześniej i nie mogłem go uruchomić, spróbuję jeszcze raz. – justanotherhobbyist

+0

Nie wiem, jak używać JSFiddle, nic z fragmentu javascript nie jest dołączony. Zapisałem tam kod, więc możesz go uruchomić: http://jsfiddle.net/hustlerinc/25qWe/ – justanotherhobbyist

Odpowiedz

22

Twój problem z nie zamykasz ścieżki twojego koła.

Dodaj ctx.beginPath() zanim narysujesz okrąg.

jsFiddle.

także kilka wskazówek ...

  • Twoje aktywa nie powinien być odpowiedzialny za siebie (rysunek ich metoda draw()). Zamiast tego, może zdefiniuj ich właściwości wizualne (czy to jest okrąg? Promień?) I pozwól swojej głównej funkcji renderowania obsługiwać konkretny rysunek canvas (ma to również tę zaletę, że możesz łatwo zmienić swój renderer na zwykłe elementy DOM lub WebGL) .
  • Zamiast setInterval(), użyj requestAnimationFrame(). Obsługa nie jest w tej chwili świetna, więc możesz chcieć zaprezentować jej funkcjonalność za pomocą wzoru setInterval() lub rekurencyjnego setTimeout().
  • Twoje wymiary powinny być podane z elementu canvas (lub mieć je zdefiniowane gdzieś). Włączenie ich do funkcji renderowania jest zbliżone do magicznych numerów i może prowadzić do problemu konserwacji w dalszej części ścieżki.
+0

Wow, to było nieoczekiwanie proste. Co dokładnie robi ten kod? – justanotherhobbyist

+0

@hustlerinc Który kod? Dodałem też kilka wskazówek :) – alex

+0

"viewport.width = viewport.width" part Mam na myśli clearRect wyjaśnia sam siebie, nie dostaję tego, co robi drugi, aby wyczyścić płótno. Dziękuję za porady. =) – justanotherhobbyist