graphics - 使用 SDL2 和 Lisp 的多个图形窗口?

标签 graphics lisp common-lisp sdl-2

我正在尝试使用 cl-sdl2Clozure Common Lisp (在 MS-Windows 上,虽然我认为它应该在其他平台和编译器上按原样工作)绘制到两个单独的图形窗口。当我尝试下面的代码时:

(ql:quickload "sdl2")
(require :sdl2)

(defun make-two-SDL-2-windows ()
  (let* ((win1 (sdl2:create-window :title "Win 1" :w 400 :h 400))
         (ren1 (sdl2:create-renderer win1))
         (win2 (sdl2:create-window :title "Win 2" :w 300 :h 300))
         (ren2 (sdl2:create-renderer win2)))
    (sdl2:with-event-loop (:method :poll)
      (:keyup
        (:keysym keysym)
        (when (sdl2:scancode= (sdl2:scancode-value keysym) :scancode-escape)
           (sdl2:push-event :quit)))
      (:idle ()
        (progn
          (sdl2:render-present ren1)
          (sdl2:render-present ren2)))
      (:quit () 
        (progn 
          (sdl2:destroy-renderer ren1)
          (sdl2:destroy-renderer ren2)
          (sdl2:destroy-window win1)
          (sdl2:destroy-window win2)
          t)))))

(defun main ()
  (sdl2:init :everything)
  ;;;Clozure...
  (process-run-function "window" #'make-two-SDL-2-windows))

(main)

...两个新窗口都创建了“挂起”,并且不响应/重绘按键或鼠标移动。我试图将此片段基于我在 SDL2 examples 中找到的内容.我一定是误解了如何将 cl-sdl2 包装器用于事件循环或类似的东西。有没有人成功地将多个窗口和 SDL2 与 Common Lisp 一起使用?


这是一个工作版本,感谢 Rei 的帮助:

(defun make-two-SDL-2-windows ()
  (sdl2:with-init (:everything)
    (sdl2:with-window (win1 :title "Win1" :flags '(:shown))
      (sdl2:with-window (win2 :title "Win2" :flags '(:shown))
        (sdl2:with-renderer (ren1 win1 :flags '(:renderer-accelerated))
          (sdl2:with-renderer (ren2 win2 :flags '(:renderer-accelerated))
             (sdl2:with-event-loop (:method :poll)
               (:keyup
                 (:keysym keysym)
                   (when (sdl2:scancode= (sdl2:scancode-value keysym)  :scancode-escape)
                      (sdl2:push-event :quit)))
                 (:idle
                   ()
                   (progn
                     (sdl2:set-render-draw-color ren1 0 0 255 255)
                     (sdl2:set-render-draw-color ren2 0 255 0 255)
                     (sdl2:render-draw-line ren1 150 20 100 300)
                     (sdl2:render-draw-line ren2 20 20 150 150)
                     (sdl2:render-present ren1)
                     (sdl2:render-present ren2)))
                 (:quit () t))))))))

最佳答案

您定义了两个窗口和渲染器,但没有在事件循环中实际使用它们;使用 sdl2:with-renderer 和 sdl2:with-window 来绑定(bind)它们。

关于graphics - 使用 SDL2 和 Lisp 的多个图形窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757970/

相关文章:

graphics - 有效计算视线和一组对象之间的第一个交点的最佳方法是什么?

Java - 递归地交替循环颜色

lisp - 如何从 REPL 获得离线 CLHS?

lisp - 来自 On Lisp 的奇异引用列表示例

delphi - 如何正确实现TBitmap的扫描线访问?

java - 如何在Java中画一条蠕虫线?

macros - 宏的结果必须是主体中最后一个表达式的值

lisp - 使用 hunchentoot 和 sbcl 从网络获取 lisp 输入时遇到问题

lisp - 将数字列表分解为数字

compilation - 使用 ASDF 获取单个文件的编译结果