使用球拍编程突破

问题描述 投票:0回答:1

我正在尝试使用DrRacket(BSL)编制突破游戏(https://www.youtube.com/watch?v=hW7Sg5pXAok)。我开始编写播放器控制的栏的代码。条形应与鼠标一起移动,直到跟随x轴并在y轴上保持不动。我的代码是以下,条形图正在移动,但鼠标事件似乎不起作用,你可以帮助调试吗?

(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)
debugging mouseevent racket
1个回答
0
投票

我在这里看到的一些东西就是你的滴答处理程序。如果您希望鼠标处理程序更新玩家位置,则无需更新玩家位置,因此现在可以将其取出。从现在开始,当你输入我建议你在每半个屏幕上缩进时,这使它看起来更加管理。现在你的鼠标处理程序的问题很简单。在决定移动鼠标的方式时,它会让自己感到困惑并做出一些非常有趣的决定。同时,如果您从屏幕的右侧开始并将鼠标向左拖动,则会导致错误。所以为了解决这个问题,我决定这样做。

(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]))

所有这一切都是为玩家提供了相反的控制。这就是我通过播放您发布的内容而解释的内容。

© www.soinside.com 2019 - 2024. All rights reserved.