【问题标题】:Lispbuilder-SDL: turn surface and preserve color key (transparency)Lispbuilder-SDL:翻转曲面并保留颜色键(透明度)
【发布时间】:2016-09-11 12:41:00
【问题描述】:

说明

我正在使用 SDL 在 CL 中编写海龟图形应用程序。我创建了一张乌龟的图画并将其保存在 PNG 中。问题 1:SDL:LOAD-IMAGE 在图像的实际透明度下效果不佳。所以,我已经用白色给透明部分上色了

(sdl:load-image
 (merge-pathnames #P"resources/turtle.png"
                  (asdf:system-source-directory :cl-turtle))
 :image-type :png
 :color-key sdl:*white*)

所以,:COLOR-KEY 选项表示所有SDL:*WHITE* 像素都是透明的。这很有效:在黄色背景上绘制乌龟没有显示白色像素。

但是,我希望我的乌龟指向一个特定的方向,并在对TURN 命令的响应中改变它。我发现的一个建议是将精灵用于所有可能的角度,但这对海龟来说效果不佳:方向太多。

所以,我已经加载了LISPBUILDER-SDL-GFX,以使用SDL:ROTATE-SURFACE-XY。它确实可以很好地旋转乌龟。我可以看到,SDL:*WHITE* 被设置为色键,并且在旋转的表面中启用了色键。但是,当我绘制它时,仍然呈现白色。有没有办法解决这个问题?

完整代码

(ql:quickload '(:lispbuilder-sdl :lispbuilder-sdl-image :lispbuilder-sdl-gfx :vom))

(defstruct turtle
  direction
  x
  y
  scale)

(defun draw-turtle (turtle image)
  ;; (format t "~&GFX? ~A~%" lispbuilder-sdl-cffi::*gfx-loaded-p*)
  (let ((img (sdl:rotate-surface-xy (mod (turtle-direction turtle) 360)
                                    :surface image)))
    (setf (sdl::color-key img) sdl:*white*)
    (setf (sdl:color-key-enabled-p img) t)
    (vom:info "Color key enabled (img)?: ~A" (sdl:color-key-enabled-p img))
    (vom:info "Color key is: ~A" (slot-value (sdl:color-key img) 'sdl::color-vector))
    (sdl:draw-surface-at-* img
                           (turtle-x turtle)
                           (turtle-y turtle))))

(defun turtle ()
  (sdl:with-init()
    (sdl:window 500 500
                :title-caption "Turtle")
    (setf (sdl:frame-rate) 1)
    (let ((turtle-image (sdl:load-image
                         (merge-pathnames #P"resources/turtle.png"
                                          (asdf:system-source-directory :cl-turtle))
                         :image-type :png
                         :color-key sdl:*white*))
          (turtle (make-turtle :direction 30 :x 200 :y 200 :scale 1)))
     (sdl:with-events ()
       (:quit-event () t)
       (:key-down-event () (sdl:push-quit-event))
       (:idle ()
              (sdl:clear-display sdl:*yellow*)
              (draw-turtle turtle turtle-image)
              (sdl:update-display))))))

(turtle)

日志(VOM)输出

  <INFO> [14:24:35] cl-turtle - Color key enabled (img)?: T
  <INFO> [14:24:35] cl-turtle - Color key is: #(255 255 255)

截图

系统信息

带有 libSDL-1.2.so.0.11.4、libSDL_gfx.so.15.9.1 和 libSDL_image-1.2.so.0.8.4 的 Ubuntu 16.04

SBCL 1.3.7(来自 roswell sbcl-bin)

【问题讨论】:

标签: common-lisp sdl sbcl sdl-image


【解决方案1】:

显然,调用sdl:load-and-convert-image 而不是sdl:load-image 可以解决问题。

根据 LOAD-IMAGE-* 从文件名 SOURCE 加载图像,转换 使用 SDL:CONVERT-SURFACE 将此图像转换为当前显示格式。

支持的参数与 LOAD-IMAGE 和 SDL:转换图像。

【讨论】:

  • @mobiuseng 抱歉,我对 SDL 了解不多,检查两个表面(加载与加载+转换)并没有给出太多指示。这需要更多的研究。
  • 我明白了。这也让我感到困惑。要点:有效!我现在可以专注于实际的海龟图形。谢谢!
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多