Я предлагаю использовать Renderer
и Texture
с вместо Surface
( причина ).Используя Texture
, вы можете установить альфа-режим следующим образом:
textureBlendMode texture $= BlendAlphaBlend
textureAlphaMod texture $= 255 - fadednum
Обратите внимание, что это глобальные переменные, поэтому вы, вероятно, хотели бы установить textureAlphaMod
обратно в 255 после copy
.
Упрощенная версия написанного вами кода, преобразованного для использования Renderer
и Texture
, будет выглядеть следующим образом:
{-# 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