2016-04-21 35 views
5

我試圖使用cl-sdl2Clozure Common Lisp(在MS-Windows上,儘管我認爲它應該在其他平臺和編譯器上按原樣工作)繪製到兩個單獨的圖形窗口。當我嘗試下面的代碼:帶有SDL2和Lisp的多個圖形窗口?

(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包裝或類似的東西。有沒有人在Common Lisp中使用多個窗口和SDL2?


這裏有一個工作版本,得益於睿幫助:

(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)))))))) 

回答

2

你定義了兩個窗口和渲染,而不在事件循環實際使用的時候;使用sdl2:with-renderer和sdl2:with-window來綁定它們。

+1

非常好!感謝你的回答。我不知道爲什麼我第一次不嘗試這個。 –