minilight 0.4.3 → 0.4.4
raw patch · 5 files changed
+86/−1 lines, 5 files
Files
- CHANGELOG.md +4/−0
- README.md +2/−0
- minilight.cabal +1/−1
- src/MiniLight.hs +26/−0
- src/MiniLight/Figure.hs +53/−0
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for minilight +## 0.4.4 -- 2020-05-05++* Add `registerComponent` and `extend9tiles` functions+ ## 0.4.3 -- 2020-03-11 * Support GHC 8.8
README.md view
@@ -16,6 +16,8 @@ ~$ sudo apt install -y libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-gfx-dev ``` +For ghc-8.8, use a version `>= 0.4.3`+ ## Tutorial Create a new project. Assume that you have the `resource` directory under the project root, which contains the resource stuff.
minilight.cabal view
@@ -3,7 +3,7 @@ -- For further documentation, see http://haskell.org/cabal/users-guide/ name: minilight-version: 0.4.3+version: 0.4.4 synopsis: A SDL2-based graphics library, batteries-included. description: This package provides the wheel for a graphical application or a game.
src/MiniLight.hs view
@@ -21,6 +21,7 @@ runComponentEnv, (@@!), quit,+ registerComponent, ) where import Control.Concurrent (threadDelay, forkIO)@@ -189,6 +190,31 @@ reg <- view _registry v <- reg R.! key runComponentEnv v $ emit (Just key) $ ev+++-- | Register a component to the component system+registerComponent+ :: ( HasLoaderEnv env+ , HasLightEnv env+ , MonadIO m+ , MonadMask m+ , ComponentUnit c+ )+ => T.Text+ -> c+ -> LightT env m Component+registerComponent name cu = do+ uuid <- newUID+ comp <- newComponent uuid cu++ reg <- view _registry+ R.register reg uuid comp++ tag <- view _tagRegistry+ liftIO $ modifyIORef' tag $ HM.insert name uuid++ return comp+ -- | Same as 'runMainloop' but fixing the type. runMiniloop :: LoopConfig -> s -> (s -> MiniLoop s) -> MiniLight ()
src/MiniLight/Figure.hs view
@@ -56,6 +56,59 @@ (c2 - c1 + fmap (`div` 2) (s1 + s2)) | otherwise = union y x ++-- | Split a figure into 9 pieces and extend it to the given size frame.+extend9tiles :: Figure -> Vect.V2 Int -> MiniLight Figure+extend9tiles fig size = do+ mrenderer <- view _renderer+ target <- flip mapM mrenderer $ \renderer -> do+ let siz = fmap toEnum size+ let Just tex = texture fig+ let texSize = fmap toEnum $ getFigureSize fig++ tinfo <- SDL.queryTexture tex++ target <- SDL.createTexture renderer+ (SDL.texturePixelFormat tinfo)+ SDL.TextureAccessTarget+ siz+ SDL.rendererRenderTarget renderer SDL.$= Just target+ SDL.textureBlendMode target SDL.$= SDL.BlendAlphaBlend++ let tileSize = fmap (`div` 3) texSize++ forM_ [0 .. 2] $ \ix -> forM_ [0 .. 2] $ \iy -> do+ let targetSize = Vect.V2+ (if ix == 1 then siz ^. _x - 2 * tileSize ^. _x else tileSize ^. _x)+ (if iy == 1 then siz ^. _y - 2 * tileSize ^. _y else tileSize ^. _y)+ let targetLoc = Vect.V2+ ( if ix == 0+ then 0+ else if ix == 1+ then tileSize ^. _x+ else siz ^. _x - tileSize ^. _x+ )+ ( if iy == 0+ then 0+ else if iy == 1+ then tileSize ^. _y+ else siz ^. _y - tileSize ^. _y+ )++ SDL.copy+ renderer+ tex+ (Just $ SDL.Rectangle (SDL.P (tileSize * Vect.V2 ix iy)) tileSize)+ (Just $ SDL.Rectangle (SDL.P targetLoc) targetSize)++ SDL.rendererRenderTarget renderer SDL.$= Nothing++ return target++ tex <- maybe (return emptyFigure) fromTexture target+ return tex++ -- | Render a figure. render :: (HasLightEnv env, MonadIO m, MonadMask m) => Figure -> LightT env m () render fig = do