2016-04-21 60 views
5

cl-sdl2 ile Clozure Common Lisp (MS-Windows'da, diğer platformlarda ve derleyicilerde olduğu gibi çalışmamasına rağmen), iki ayrı grafik penceresine çizmeye çalışıyorum. Ben aşağıdaki kodu çalıştığınızda:SDL2 ve Lisp ile birden fazla grafik penceresi var mı?

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

... "askıda" oluşturulan yeni pencereler hem ve yanıt vermeyen/tuşa basma ya da fare hareketleri için yeniden çizme. Bu snippet'i SDL2 examples'da bulduğum şekilde temel almaya çalıştım. Olay döngüsü için cl-sdl2 sarıcısını nasıl kullanacağımı veya benzer bir şeyi yanlış anlamalıyım. Herkes birden çok pencereyi ve Common Lisp ile SDL2'yi kullanırken başarılı oldu mu?


İşte bir çalışma versiyonu sayesinde Rei yardım etmek, var:

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

cevap

2

Aslında olay döngü içinde bunları kullanmadan iki pencere ve oluşturucular tanımlanır; sdl2: with-renderer ve sdl2: bunları bağlamak için pencere ile.

+1

Mükemmel! Cevap için teşekkürler. Bunu neden ilk defa denemediğimi bilmiyorum. –