2016-04-21 15 views
5

Tôi đang cố gắng sử dụng cl-sdl2 với Clozure Common Lisp (trên MS-Windows, mặc dù tôi nghĩ rằng nó sẽ hoạt động như trên các nền tảng và trình biên dịch khác) để vẽ hai cửa sổ đồ họa riêng lẻ. Khi tôi thử mã bên dưới:Nhiều cửa sổ đồ họa với SDL2 và 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) 

... cả hai cửa sổ mới được tạo "treo" và không phản hồi/vẽ lại khi nhấn phím hoặc di chuyển chuột. Tôi đã cố gắng đặt đoạn mã này vào những gì tôi tìm thấy trong số SDL2 examples. Tôi phải hiểu lầm làm thế nào để sử dụng wrapper cl-sdl2 cho vòng lặp sự kiện, hoặc một cái gì đó tương tự. Có ai đã thành công trong việc sử dụng nhiều cửa sổ và SDL2 với Common Lisp?


Dưới đây là một phiên bản làm việc, nhờ giúp đỡ từ 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)))))))) 

Trả lời

2

Bạn định nghĩa hai cửa sổ và kết xuất đồ họa mà không thực sự sử dụng chúng trong vòng lặp sự kiện; sử dụng sdl2: with-renderer và sdl2: with-window để liên kết chúng.

+1

Tuyệt vời! Cảm ơn câu trả lời. Tôi không biết tại sao tôi không thử lần đầu tiên. –

Các vấn đề liên quan