使用 SDL2 和 Lisp 的多个图形 windows?
Multiple graphics windows with SDL2 and Lisp?
我正在尝试使用 cl-sdl2 with Clozure Common Lisp(在 MS-Windows 上,尽管我认为它应该在其他平台和编译器上按原样工作)绘制两个单独的图形 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)
...两个新 windows 都创建了 "hang",并且不要 respond/redraw 按键或鼠标移动。我试图将此片段基于我在 SDL2 examples 中找到的内容。我一定是误解了如何将 cl-sdl2 包装器用于事件循环或类似的东西。有没有人在 Common Lisp 中成功使用多个 windows 和 SDL2?
这是一个工作版本,感谢 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))))))))
您定义了两个 windows 和渲染器,但并未在事件循环中实际使用它们;使用 sdl2:with-renderer 和 sdl2:with-window 绑定它们。
我正在尝试使用 cl-sdl2 with Clozure Common Lisp(在 MS-Windows 上,尽管我认为它应该在其他平台和编译器上按原样工作)绘制两个单独的图形 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)
...两个新 windows 都创建了 "hang",并且不要 respond/redraw 按键或鼠标移动。我试图将此片段基于我在 SDL2 examples 中找到的内容。我一定是误解了如何将 cl-sdl2 包装器用于事件循环或类似的东西。有没有人在 Common Lisp 中成功使用多个 windows 和 SDL2?
这是一个工作版本,感谢 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))))))))
您定义了两个 windows 和渲染器,但并未在事件循环中实际使用它们;使用 sdl2:with-renderer 和 sdl2:with-window 绑定它们。