2016-04-21 12 views
5

Ich versuche cl-sdl2 mit Clozure Common Lisp zu verwenden (auf MS-Windows, obwohl ich denke, dass es wie auf anderen Plattformen und Compilern funktionieren sollte), um zu zwei einzelnen Grafikfenstern zu zeichnen. Wenn ich den Code unten versuchen:Mehrere Grafikfenster mit SDL2 und 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) 

... die beiden neuen Fenster erstellt „hängen“, und reagieren nicht/neu zeichnen Bewegungen Tastendruck oder Maus. Ich habe versucht, dieses Snippet nach dem zu erstellen, was ich in der SDL2 examples gefunden habe. Ich muss mißverstanden werden, wie man den cl-sdl2-Wrapper für die Ereignisschleife oder etwas ähnliches verwendet. Hat jemand erfolgreich mehrere Fenster und SDL2 mit Common Lisp verwendet?


Hier ist eine Arbeitsversion, dank von Rei helfen:

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

Antwort

2

Sie definiert zwei Fenster und Renderer ohne sie tatsächlich in der Ereignisschleife verwendet wird; Verwenden Sie sdl2: with-renderer und sdl2: with-window, um sie zu binden.

+1

Ausgezeichnet! Danke für die Antwort. Ich weiß nicht, warum ich es beim ersten Mal nicht versucht habe. –