2015年12月26日土曜日 21時54分52秒 UTC+9 Matthew Flatt:
> At Fri, 25 Dec 2015 22:17:21 -0800 (PST), Taro Annual wrote:
> > I make "pong" game in big-bang(2hdp/universe).
> > But, moving a racket(not language!) by keyboard("up", "down", ...), the 
> > racket 
> > freezes in 0.3~0.5s sometimes.
> > 
> > I think it is due to the beginner's platform.
> > What modules/syntaxes are used in action games in Racket language.
> 
> It sounds like you're seeing pauses related to garbage collection. The
> current pre-release version of Racket includes improvements aimed
> specifically at this problem.
> 
> Can you try a current snapshot to see whether it eliminates pauses?:
> 
>   http://pre.racket-lang.org/
> 
> The program should run better within DrRacket. For best results,
> though, you may need to run outside of DrRacket (either by starting the
> program with `racket` on the command line or by choosing "Create
> Executable" in DrRacket's "Racket" menu).
> 
> If the pauses are still not eliminated in the current snapshot, I'm
> interested to take a closer look at your program.
> 
> Thanks,
> Matthew

Matthew,

Sorry, it doesn't work well. Try the follows:

---source code---

#lang racket
(require 2htdp/universe 2htdp/image point-free)
;(require lux mode-lambda)

; Tennis for two
;
; [Original Version]
; https://kyorohiro.gitbooks.io/doc_scratch/content/tennis_of_two/index.html

(struct world (player1 player2 ball) #:transparent)
(struct ball (x y dx dy) #:transparent)
(struct player (y keycnt) #:transparent)

(define BALL-IMAGE (circle 10 "solid" "orange"))
(define RACKET1-IMAGE (rectangle 5 100 "solid" "red"))
(define RACKET2-IMAGE (rectangle 5 100 "solid" "blue"))

(define (direction x)
  (cond ((= x 0) 0)
        ((> x 0) 1)
        (else -1)))
(define (saturate x a b) (max a (min b x)))
(define (from-to? x a b) (and (>= x a) (<= x b)))

(define (on-tick-func w)
  (let ((player1 (world-player1 w)) (player2 (world-player2 w))
        (ball1 (world-ball w)))
    (let ((y1 (player-y player1)) (keycnt1 (player-keycnt player1))
          (y2 (player-y player2)) (keycnt2 (player-keycnt player2))
          (x (ball-x ball1)) (y (ball-y ball1))
          (dx (ball-dx ball1)) (dy (ball-dy ball1)))
      (let* ((n?x (+ x dx)) (n?y (+ y dy))
             (top1 (- y1 50)) (btm1 (+ y1 50))
             (top2 (- y2 50)) (btm2 (+ y2 50))
             (collision1 (and (from-to? 50 n?x x)
                              (or (from-to? y top1 btm1)
                                  (from-to? n?y top1 btm1))))
             (collision2 (and (from-to? 550 x n?x)
                              (or (from-to? y top2 btm2)
                                  (from-to? n?y top2 btm2))))
             (nx (cond (collision1 (max n?x 50))
                       (collision2 (min n?x 550))
                       (else n?x)))
             (ny (saturate n?y 0 400))
             (ndx (cond (collision1 (abs dx))
                        (collision2 (- (abs dx)))
                        (else dx)))
             (ndy (cond ((<= y 0) (abs dy))
                        ((>= y 400) (- (abs dy)))
                        (else dy)))
             (next-player1
              (player
               (saturate (+ y1 (* (direction keycnt1) 10)) 50 350)
               (- keycnt1 (direction keycnt1))))
             (next-player2
              (player
               (saturate (+ y2 (* (direction keycnt2) 10)) 50 350)
               (- keycnt2 (direction keycnt2))))
             (next-ball (ball nx ny ndx ndy)))
        (when collision1 (display "collision1"))
        (when collision2 (display "collision2"))
        (world next-player1 next-player2 next-ball)))))
  
(big-bang
  (world (player 200 0) (player 200 0) (ball 300 200 -5.1111 2.51111))

  {on-key
   (lambda (w key)
     (case key
       [("up")   (world (world-player1 w)
                        (player (player-y (world-player2 w)) -10)
                        (world-ball w))]
       [("down") (world (world-player1 w)
                        (player (player-y (world-player2 w)) 10)
                        (world-ball w))]
       [("a")    (world (player (player-y (world-player1 w)) -10)
                        (world-player2 w)
                        (world-ball w))]
       [("z")    (world (player (player-y (world-player1 w)) 10)
                        (world-player2 w)
                        (world-ball w))]
       [("b")    (display w)
                 w]
       [else w]))}

  {on-release
   (lambda (w key)
     (world (player (player-y (world-player1 w)) 0)
            (player (player-y (world-player2 w)) 0)
            (world-ball w)))}

  {on-tick on-tick-func}

  {on-draw
   (lambda (w)
     (~> (empty-scene 600 400)
         (curry place-image/align
           RACKET1-IMAGE 50 (player-y (world-player1 w))
           "right" "center")
         (curry place-image/align
           RACKET2-IMAGE 550 (player-y (world-player2 w))
           "left" "center")
         (curry place-image/align
           BALL-IMAGE (ball-x (world-ball w)) (ball-y (world-ball w))
           "center" "center")))})

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to