【问题标题】:canvas% in frame% doesn't have the frame% sizeframe% 中的 canvas% 没有 frame% 大小
【发布时间】:2018-07-16 21:00:14
【问题描述】:

我在球拍中创建了一个小蛇游戏,并尝试显示边框。

我定义了一些常量:

(define WIDTH 500)

(define HEIGHT 500)

(define BLK_SIZE 10)

所以,所有块都是一个 50px 的正方形。

我已经创建了一个框架%

(define frame 
  (new (class frame%
         (define/augment (on-close)
           (send timer stop)
           (printf "ending...\n"))
         (super-new))
       [label "Snake"]
       [width WIDTH]
       [height HEIGHT]))

还有一个画布%

(define game-canvas%
  (class canvas%
    (define/override (on-char e)
      (case (send e get-key-code)
        [(left) (unless (eq? last-dir 'right)
                  (set! dir 'left))]
        [(right) (unless (eq? last-dir 'left)
                   (set! dir 'right))]
        [(up) (unless (eq? last-dir 'down)
                (set! dir 'up))]
        [(down) (unless (eq? last-dir 'up)
                  (set! dir 'down))]
        [else (void)]))
    
    (super-new)))
;...
(define game-canvas (new game-canvas% (parent frame)))

我定义了边界:

(define (create-border)
  (let (
        [nbr-block-x (/ WIDTH BLK_SIZE)]
        [nbr-block-y (/ HEIGHT BLK_SIZE)])
    (append
     (for/list ([x (in-range nbr-block-x)])
       (make-cell x 0))
     (for/list ([x (in-range nbr-block-x)])
       (make-cell x (sub1 nbr-block-x)))
     (for/list ([y (in-range nbr-block-y)])
       (make-cell 0 y))
     (for/list ([y (in-range nbr-block-y)])
       (make-cell (sub1 nbr-block-y) y)))))

(define borders (create-border))

最后我画了边框:

(define-struct cell (x y))

(define (real-world-coordinate elem)
  (make-cell
   (* BLK_SIZE (cell-x elem))
   (* BLK_SIZE (cell-y elem))))

(define (draw-list-of-square! dc square-list)
  (for-each (lambda (elem)
              (send dc draw-rectangle
                    (cell-x (real-world-coordinate elem))
                    (cell-y (real-world-coordinate elem))
                    BLK_SIZE
                    BLK_SIZE))
            square-list))

使用该代码,我只能在窗口中看到边框。 那是代码的结果(没有调整框架的大小):

如您所见,右下边框在我的框架之外。

由于我从 0 到 (sub1 nbr-block-x) (49)(像素 490)绘制块,所以边框应该出现在我的框架中。

我检查了 frame% 和 canvas% 的文档。 Canvas% 定义设置为 0 的边距,frame% 定义也设置为的 borderspacing 0.

【问题讨论】:

    标签: canvas racket


    【解决方案1】:

    现在可能为时已晚,但它可能对其他人仍然有用。

    你应该让框架自动适应画布而不是相反:

    #lang racket/gui
    
    (define WIDTH 500)
    (define HEIGHT 500)
    
    (define frame (new frame% [label "Snake"])) ; no size is specified
    
    (define game-canvas
      (new canvas% [parent frame]
           [min-width WIDTH]
           [min-height HEIGHT]
           [stretchable-width #f] ; To make sure the canvas' sizes stay constant even if the frame is resized with the mouse
           [stretchable-height #f]
           [paint-callback
            (λ(cv dc)
              (send dc set-background "yellow")
              (send dc clear)
              )]))
    
    ; Before being shown, the sizes are automatically adjusted.
    (send frame show #t)
    

    如果需要,也可以强制重新计算大小

    (send frame reflow-container)
    

    如果框架显示后任何尺寸发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多