Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何通过sdl2创建逐渐褪色的图像?_Haskell_Sdl_Sdl 2 - Fatal编程技术网

Haskell 如何通过sdl2创建逐渐褪色的图像?

Haskell 如何通过sdl2创建逐渐褪色的图像?,haskell,sdl,sdl-2,Haskell,Sdl,Sdl 2,系统:安装sdl2的MacOS、ghc 如标题所述,如何通过sdl2创建逐渐褪色的图像?(请注意,该图由电脑中某个位置的.bmp文件提供。) 我已经写了下面的代码myflade实际上就是我需要的功能。但是,目前haskell会抱怨没有setSurfaceAlphamod {-# LANGUAGE OverloadedStrings #-} module Main (main) where import Control.Concurrent (threadDelay) import Foreig

系统:安装sdl2的MacOS、ghc

如标题所述,如何通过sdl2创建逐渐褪色的图像?(请注意,该图由电脑中某个位置的.bmp文件提供。)

我已经写了下面的代码
myflade
实际上就是我需要的功能。但是,目前haskell会抱怨没有
setSurfaceAlphamod

{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import Control.Concurrent (threadDelay)
import Foreign.C.Types
import SDL.Vect
import SDL.Raw.Video
import qualified SDL

screenWidth, screenHeight :: CInt
(screenWidth, screenHeight) = (960, 720)

fadedtime, fadednum :: Int
(fadedtime, fadednum) = (2000000, 10)

getDataFileName :: FilePath -> IO FilePath
getDataFileName = return



myFaded :: Int -> Int -> SDL.Surface -> SDL.Surface -> SDL.Window -> IO ()
myFaded fadedtime fadednum surface screenSurface window
      | fadednum <= 0 = return ()
      | otherwise = do 
          SDL.surfaceBlit surface Nothing screenSurface Nothing
          SDL.updateWindowSurface window
          threadDelay holdtime
          newsurface <- SDL.setSurfaceAlphaMod surface alpha
          myFaded (fadedtime - holdtime) (fadednum - 1)  newsurface screenSurface window
          where alpha = 2
                holdtime = round $ fromIntegral $ fadedtime `div` fadednum




main :: IO ()
main = do
  SDL.initialize [SDL.InitVideo]
  window <- SDL.createWindow "our super mario" SDL.defaultWindow { SDL.windowInitialSize = V2 screenWidth screenHeight }
  SDL.showWindow window
  screenSurface <- SDL.getWindowSurface window

  helloWorld <- getDataFileName "figs/Entry.bmp" >>= SDL.loadBMP
  --SDL.surfaceBlit helloWorld Nothing screenSurface Nothing
  --SDL.updateWindowSurface window
  myFaded fadedtime fadednum helloWorld screenSurface window


  --SDL.updateWindowSurface window

  --threadDelay 2000000

  SDL.destroyWindow window
  SDL.freeSurface helloWorld
  SDL.quit
{-#语言重载字符串}
主模块(Main),其中
导入控制。并发(线程延迟)
导入外国C.C.类型
导入SDL.Vect
导入SDL.Raw.Video
进口合格SDL
屏幕宽度,屏幕高度::CInt
(屏幕宽度、屏幕高度)=(960720)
fadedtime,fadednum::Int
(fadedtime,fadednum)=(2000000,10)
getDataFileName::FilePath->IO文件路径
getDataFileName=return
myflade::Int->Int->SDL.Surface->SDL.Surface->SDL.Window->IO()
MyFaddedTime FaddedNum曲面屏幕曲面窗口

|fadednum我建议使用
渲染器
纹理
s而不是
曲面
()。使用
纹理
,可以通过以下方式设置alpha模式:

textureBlendMode texture $= BlendAlphaBlend
textureAlphaMod  texture $= 255 - fadednum
请注意,这些是全局变量,因此您可能希望在
copy
之后将
textureAlphaMod
设置回255

您编写的代码的简化版本转换为使用
渲染器
纹理
将如下所示:

{-# LANGUAGE OverloadedStrings #-}
module Main (main) where

import Control.Concurrent (threadDelay)
import Foreign.C.Types
import Data.Word
import SDL.Vect
import qualified SDL

screenWidth, screenHeight :: CInt
(screenWidth, screenHeight) = (960, 720)

fadednum :: Word8
fadednum = 0

getDataFileName :: FilePath -> IO FilePath
getDataFileName = return

main :: IO ()
main = do
  SDL.initialize [SDL.InitVideo]
  window <- SDL.createWindow "our super mario" SDL.defaultWindow { SDL.windowInitialSize = V2 screenWidth screenHeight }
  SDL.showWindow window

  renderer <- SDL.createRenderer window (-1) SDL.defaultRenderer

  bmp <- getDataFileName "Entry.bmp" >>= SDL.loadBMP
  helloWorld <- SDL.createTextureFromSurface renderer bmp
  SDL.freeSurface bmp

  myFaded fadednum helloWorld renderer window

  SDL.destroyWindow window
  SDL.destroyTexture helloWorld
  SDL.quit

myFaded :: Word8 -> SDL.Texture -> SDL.Renderer -> SDL.Window -> IO ()
myFaded fadednum texture renderer window
      | fadednum == 255 = return ()
      | otherwise = do
          SDL.clear renderer 

          SDL.textureBlendMode texture SDL.$= SDL.BlendAlphaBlend
          SDL.textureAlphaMod  texture SDL.$= 255 - fadednum
          SDL.copy renderer texture Nothing Nothing

          SDL.textureAlphaMod  texture SDL.$= 255

          SDL.present renderer

          threadDelay 10000

          myFaded (fadednum + 1) texture renderer window
{-#语言重载字符串}
主模块(Main),其中
导入控制。并发(线程延迟)
导入外国C.C.类型
导入数据.Word
导入SDL.Vect
进口合格SDL
屏幕宽度,屏幕高度::CInt
(屏幕宽度、屏幕高度)=(960720)
fadednum::Word8
fadednum=0
getDataFileName::FilePath->IO文件路径
getDataFileName=return
main::IO()
main=do
SDL.initialize[SDL.InitVideo]
窗口SDL.Renderer->SDL.window->IO()
MyFadedNum纹理渲染器窗口
|fadednum==255=返回()
|否则=做
清除渲染器
SDL.textureBlendMode纹理SDL.$=SDL.BlendAlphaBlend
SDL.textureAlphaMod纹理SDL.$=255-fadednum
SDL.copy渲染器纹理无任何内容
SDL.textureAlphaMod纹理SDL.$=255
当前渲染器
线程延迟10000
MyFadded(fadednum+1)纹理渲染器窗口