我是Haskell的新手,我正在使用OpenGL
(使用Graphics.UI.GLUT
)为UI构建国际象棋游戏。我正在尝试为棋子渲染PNG图像。
我读过图像可以转换为TextureObject
然后呈现,但找不到任何有用的资源来知道如何操作。
这是我的代码生成国际象棋棋盘的样子
drawSquare :: BoardSquare -> IO ()
drawSquare ((x,y,z),(r,g,b)) = preservingMatrix $ do
color $ Color3 r g b
translate $ Vector3 x y z
drawCube -- this will draw a square of appropriate size
-- Display Callback
display :: IORef GameState -> DisplayCallback
display gameState = do
gstate <- get gameState
clear [ColorBuffer]
forM_ (getBoardPoints gstate) $ drawSquare -- drawing all 64 squares here
flush
任何人都可以帮助我在给定文件路径的窗口的任何给定x
和y
坐标处渲染PNG图像吗?
答案 0 :(得分:3)
建议:由于您不熟悉Haskell,而不是直接潜入原始OpenGL
用于您的国际象棋游戏,您是否看过可以帮助您制作OpenGL
的图书馆更轻松?我建议使用gloss,看起来gloss-game有一个helper function可以将.png
文件加载到可以用于游戏的内存中。祝好运! : - )
答案 1 :(得分:1)
这是我使用的方式。
首先,使用包gl-capture
。它很旧,但效果很好。它会生成ppm
个图像。
import Graphics.Rendering.OpenGL.Capture (capturePPM)
您需要帮助才能申请此套餐吗?你需要一个键盘回调。如有需要,我可以提供帮助,请问。
现在,一旦你有一个ppm
图像,你有两个选择:用ImageMagick转换它,或者使用Haskell包来转换它。有一个好的:它被称为hip
。这是我使用的模块:
module Utils.ConvertPPM
where
import Control.Monad (when)
import Graphics.Image
import System.Directory (removeFile)
convert :: FilePath -> FilePath -> Bool -> IO ()
convert input output remove = do
ppm <- readImageRGBA VU input
writeImage output ppm
when remove $ removeFile input
如果您需要更多帮助,请不要犹豫。
以下是我使用的键盘回调类型:
keyboard :: IORef GLfloat -> IORef GLfloat -> IORef GLfloat -> IORef GLint
-> KeyboardCallback
keyboard rot1 rot2 rot3 capture c _ =
case c of
'r' -> rot1 $~! subtract 1
't' -> rot1 $~! (+1)
'f' -> rot2 $~! subtract 1
'g' -> rot2 $~! (+1)
'v' -> rot3 $~! subtract 1
'b' -> rot3 $~! (+1)
'c' -> do
i <- get capture
let ppm = printf "pic%04d.ppm" i
png = printf "pic%04d.png" i
(>>=) capturePPM (B.writeFile ppm)
convert ppm png True
capture $~! (+1)
'q' -> leaveMainLoop
_ -> return ()
然后按'c'捕捉图像。请注意,从ppm
到png
的转换速度很慢。特别是如果你打算做一些动画。对于动画,我只使用ppm
,然后使用ImageMagick进行转换。