首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lispbuilder-SDL:旋转表面并保留颜色键(透明)

Lispbuilder-SDL:旋转表面并保留颜色键(透明)
EN

Stack Overflow用户
提问于 2016-09-11 12:41:00
回答 1查看 180关注 0票数 2

解释

我正在用SDL在CL中编写海龟图形应用程序。我画了一只乌龟,并把它保存在巴布亚新几内亚。问题1:SDL:LOAD-IMAGE在图像的实际透明度方面效果不佳。所以,我用白色给透明零件上色

代码语言:javascript
复制
(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*被设置为彩色键,并且在旋转的表面上启用了颜色键控。然而,当我画它,白色仍然呈现。有办法解决这个问题吗?

全码

代码语言:javascript
复制
(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)输出

代码语言:javascript
复制
  <INFO> [14:24:35] cl-turtle - Color key enabled (img)?: T
  <INFO> [14:24:35] cl-turtle - Color key is: #(255 255 255)

屏幕截图

系统信息

Ubuntu16.04与libSDL-1.2.so.0.11.4,libSDL_gfx.so.15.9.1和libSDL_image-1.2.so.0.8.4

SBCL 1.3.7 (来自roswell sbcl-bin)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-11 18:56:24

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

按LOAD- image -*从文件名源加载一个图像,使用SDL:转换面将该图像转换为当前显示格式。 支持的参数与LOAD映像和SDL: Parameters IMAGE的参数相同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39436204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档