2017-12-26 8 views
0

Ich versuche, das Breakout-Spiel (https://www.youtube.com/watch?v=hW7Sg5pXAok) mit DrRacket (BSL) zu programmieren. Ich begann damit, den Code für die vom Spieler kontrollierte Bar zu schreiben. Der Balken sollte sich mit der Maus entlang bewegen, bis er der x-Achse folgt und auf der y-Achse unbeweglich bleibt. Mein Code ist der folgende, der Balken bewegt sich, aber das Mausereignis scheint nicht zu funktionieren. Können Sie es bei der Fehlersuche unterstützen?Programmierung Breakout mit Racket

(require 2htdp/universe) 
(require 2htdp/image) 

(define-struct playerState (locPlayer)) 
(define playerRectangle (rectangle 20 10 "solid" "red")) 
(define playerScene (empty-scene 200 200)) 

; WorldState -> Image 
; draws a player's state to an image 
(check-expect (drawPlayer (make-playerState (make-posn 50 99))) (place-image playerRectangle 50 99 playerScene)) 
(define (drawPlayer state) 
(place-image playerRectangle (posn-x (playerState-locPlayer state)) (posn-y (playerState-locPlayer state)) playerScene)) 

; WorldState -> WorldState 
; computes a new player worldstate after a clock tick 
(check-expect (tickPlayer (make-playerState (make-posn 50 99))) (make-playerState (make-posn 51 99))) 
(define (tickPlayer state) 
(make-playerState (make-posn (+ 1 (posn-x (playerState-locPlayer state))) (posn-y (playerState-locPlayer state))))) 

; mouseEvent -> WorldState 
; computes a new player worldstate if the mouse is moved 
(define (mouse state x y mouse-event) 
(cond [(string=? mouse-event "move") 
    (cond 
    [(> x (posn-x (playerState-locPlayer state))) (make-playerState (make-posn (+ 1 (posn-x (playerState-locPlayer state))) (posn-y (playerState-locPlayer state))))] 
    [(< x (posn-x (playerState-locPlayer state))) (make-playerState (make-posn (- 1 (posn-x (playerState-locPlayer state))) (posn-y (playerState-locPlayer state))))])] 
    [else (make-playerState (make-posn (posn-x (playerState-locPlayer state)) (posn-y (playerState-locPlayer state))))])) 


(define (main state) 
(big-bang state (to-draw drawPlayer) (on-mouse mouse) (on-tick tickPlayer))) 

(define initialPlayer (make-playerState (make-posn 100 199))) 
(main initialPlayer) 
+0

Ich empfehle, geschachtelte bedingte Anweisungen nicht zu verwenden, da es einfacher ist, komplizierte Fehler zu machen, die schwer zurückzunehmen sind. Zum Beispiel ist der Else-Status, der fehlt, fatal, was ich bereits beschrieben habe. Wenn Sie von der ersten Bedingung zur anderen übergehen würden, würden Sie einen Fehler bekommen, da x nichts anderes ist als die Position von player-state –

+0

was ich anstelle von geschachtelten Bedingungen empfehle, ist die Verwendung von 'und' oder 'oder' diese sind ziemlich cool. –

Antwort

0

Einige Dinge, die ich hier sehe, ist Ihr Tick-Handler. Dies muss die Position des Spielers nicht aktualisieren, wenn der Mausführer die Spielerposition aktualisieren soll. Von jetzt an, wenn Sie tippen, schlage ich vor, dass Sie auf jedem halben Bildschirm einrücken, das macht es besser gemanagt. Jetzt ist das Problem mit Ihrem On-Maus-Handler einfach. Während Sie entscheiden, auf welche Weise Sie die Maus bewegen, verwirrt sie sich selbst und trifft einige wirklich interessante Entscheidungen. Wenn Sie gleichzeitig auf der rechten Seite des Bildschirms starten und die Maus nach links ziehen, führt dies zu einem Fehler. Um das zu beheben, beschloss ich, dies zu tun.

(define (mouse state x y mouse-event) 
(cond [(string=? mouse-event "move") 
    (make-playerState 
     (make-posn (- 200 x);200 is the width of the screen 
       (posn-y (playerState-locPlayer state))))] 
    [else state])) 

All dies macht dem Spieler die umgekehrte Kontrolle. Das habe ich interpretiert, indem ich gespielt habe, was du gepostet hast.