Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 使用绘制回调在Scheme中的现有画布上绘制新对象_Oop_Canvas_Scheme_Racket - Fatal编程技术网

Oop 使用绘制回调在Scheme中的现有画布上绘制新对象

Oop 使用绘制回调在Scheme中的现有画布上绘制新对象,oop,canvas,scheme,racket,Oop,Canvas,Scheme,Racket,一些背景知识,我正在制作《太空入侵者》作为CS课程的一个项目。目前我正致力于让玩家飞船发射射弹,不用担心碰撞,只需要产生射弹 (define projectile% (class object% (init-field [image (make-bitmap 10 10)] [x 100] [y 100] [speed 1]) (define/public (get-image) image) (define/private

一些背景知识,我正在制作《太空入侵者》作为CS课程的一个项目。目前我正致力于让玩家飞船发射射弹,不用担心碰撞,只需要产生射弹

(define projectile%
(class object%
(init-field [image (make-bitmap 10 10)]
            [x 100]
            [y 100]
            [speed 1])
(define/public (get-image) image)
(define/private (move-up)
  (set! y (- y speed)))
(define/public (render dc)
  (let ((w (send image get-width))
        (h (send image get-height)))
    (move-up)
    (send dc translate (+ x (/ w 2)) (+ y (/ h 2)))
    (send dc draw-bitmap image (- (/ w 2)) (- (/ h 2)))
    (send dc translate (- (+ x (/ w 2))) (- (+ y (/ h 2))))))
(super-new)))



(define player-ship%
  (class object%
    (init-field [image (make-bitmap 30 25)]
            [x 400]
            [y 300]
            [speed 3])
(define/public (get-image) image)
(define/public (get-x) x)
(define/public (get-y) y)
(define/private (shoot)  
  ;Spawning a projectile would go here
(define/public (render dc)
  (let ((w (send image get-width))
        (h (send image get-height)))
    (send dc translate (+ x (/ w 2)) (+ y (/ h 2)))
    (send dc draw-bitmap image (- (/ w 2)) (- (/ h 2)))
    (send dc translate (- (+ x (/ w 2))) (- (+ y (/ h 2))))))
(define/public (key-down key-code)
  (cond ((equal? key-code 'left) (move-left))
        ((equal? key-code 'right) (move-right))
        ((equal? key-code 'up) (shoot))))
(super-new)))
这是两个相关的类,一些用于生成投射物的失败代码被删除

关于如何绘制窗口和其他内容的一些代码:

(define *my-game-canvas*
  (new game-canvas%
       [parent *game-window*]
       [paint-callback (lambda (canvas dc)
                         (begin
                           (send *my-ship* render dc)
                           (send *ship-projectile* render dc)))]
       [keyboard-handler (lambda (key-event)
                           (let ((key-code (send key-event get-key-code)))
                             (if (not (equal? key-code 'release))
                                 (send *my-ship* key-down key-code))))]))
(define *my-timer* (new timer%
                        [notify-callback (lambda ()
                                           (send *my-game-canvas* refresh))]))

(make-ship-projectile (send *ship-projectile* get-image))
;creating a projectile just seeing whether they work or not
(make-ship (send *my-ship* get-image))
“制造船舶”和“制造船舶投射物”功能的工作原理如下:

(define (make-ship-projectile bitmap-target)
 (let ((dc (new bitmap-dc% [bitmap bitmap-target])))
    (send dc set-brush (make-object brush% "black" 'solid))
    (send dc draw-ellipse 0 0 10 10)))

当我尝试在玩家飞船%中使用射击方法创建一个新的投射物时,问题就出现了,它根本不起作用。我目前假设它不起作用,因为新投射物不在游戏画布的绘制回调中,但是,我不知道如何更新该属性。我是否从错误的方向接近它?

是的,如果投射物的绘图不是从
绘制回调触发的(或从中调用的另一个函数/方法),则刷新画布时,它将不会显示在画布中

一种可能是有一个现有投射物列表(可能是
player ship%
中的属性),并且应该触发
paint callback
(可能通过
player ship%
render
方法,或通过
player ship%
中的另一种方法,如从
绘制回调调用的
渲染投射物
)在画布上显示所有这些射弹。当从船上发射新射弹时,应将其添加到现有射弹列表中,当射弹击中某物或从板上逃脱时,应将其从该列表中删除