Changeset 20420 for lang/haskell
- Timestamp:
- 10/02/08 01:25:33 (2 months ago)
- Location:
- lang/haskell/nario
- Files:
-
- 1 removed
- 3 modified
-
Main.hs (modified) (7 diffs)
-
Player.hs (modified) (6 diffs)
-
SDLUtil.hs (deleted)
-
tool/listup-imgs.hs (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/haskell/nario/Main.hs
r20397 r20420 20 20 21 21 wndTitle = "NARIO in Haskell" 22 wndWidth = 25623 wndHeight = 22422 screenWidth = 256 23 screenHeight = 224 24 24 wndBpp = 32 25 25 … … 37 37 sdlInit [VIDEO] 38 38 setCaption wndTitle wndTitle 39 sur <- setVideoMode wndWidth wndHeight wndBpp [HWSURFACE, DOUBLEBUF, ANYFORMAT]39 sur <- setVideoMode screenWidth screenHeight wndBpp [HWSURFACE, DOUBLEBUF, ANYFORMAT] 40 40 do 41 41 strm <- delayedStream (1000000 `div` frameRate) fetch … … 77 77 78 78 -- 状態 79 data GameState = GameState { 80 pl :: Player, 81 fld :: Field, 82 actors :: [Actor] 79 data GameGame = 80 GameGame { 81 pl :: Player, 82 fld :: Field, 83 actors :: [Actor], 84 time :: Int 83 85 } 84 85 -- 開始状態86 initialState = do87 fldmap <- loadField stage88 return GameState {89 pl = newPlayer,90 fld = fldmap,91 actors = []92 }93 where94 stage = 095 86 96 87 … … 99 90 process kss = do 100 91 imgres <- loadImageResource imageTypes 101 st <- initialState 102 let scrs = map (\scr -> scr imgres) $ loop [] st kss 92 fldmap <- loadField 0 93 94 let tmpscrs = doTitle fldmap kss 95 96 let scrs = map (\scr sur -> scr imgres sur >> flipSurface sur >> return ()) $ tmpscrs 103 97 return $ scrs ++ [(\sur -> do {releaseImageResource imgres})] 104 where 105 loop :: [SDLKey] -> GameState -> [[SDLKey]] -> [(ImageResource -> Scr)] 106 loop _ _ [] = [] 107 loop bef gs (ks:kss) = scr' : loop ks gs' kss 108 where 109 (scr', gs') = updateProc kp gs 110 kp = keyProc bef ks 111 112 -- 更新 113 updateProc :: KeyProc -> GameState -> (ImageResource -> Scr, GameState) 114 updateProc kp gs = (renderProc gs', gs') 115 where 116 (pl', ev) = updatePlayer kp (fld gs) (pl gs) 117 actors_updates = map updateActor (actors gs) 118 actors' = map fst actors_updates 119 ev' = concatMap snd actors_updates 120 121 gstmp = gs { pl = pl', actors = actors' } 122 gs' = procEvent gstmp (ev ++ ev') 98 99 100 -- タイトル 101 doTitle :: Field -> [[SDLKey]] -> [ImageResource -> Scr] 102 doTitle fldmap kss = loop kss 103 where 104 loop :: [[SDLKey]] -> [ImageResource -> Scr] 105 loop (ks:kss) = res : left ks kss 106 107 res imgres sur = do 108 fillRect sur Nothing backColor 109 renderTitle imgres sur 110 111 left ks kss 112 | SDLK_SPACE `elem` ks = doGame fldmap kss 113 | otherwise = loop kss 114 115 -- ゲーム 116 doGame :: Field -> [[SDLKey]] -> [ImageResource -> Scr] 117 doGame fldmap kss = loop (head kss) initialState kss 118 where 119 loop :: [SDLKey] -> GameGame -> [[SDLKey]] -> [ImageResource -> Scr] 120 loop bef gs (ks:kss) = scr' : left ks kss 121 where 122 (scr', gs') = updateProc (keyProc bef ks) gs 123 isPlayerDead = getPlayerYPos (pl gs') >= screenHeight + chrSize * 2 124 timeOver = time gs' <= 0 125 126 left ks kss 127 | isPlayerDead || timeOver = doGameOver fldmap kss 128 | otherwise = loop ks gs' kss 129 130 -- 更新 131 updateProc :: KeyProc -> GameGame -> (ImageResource -> Scr, GameGame) 132 updateProc kp gs = (renderProc gs', gs') 133 where 134 time' = max 0 (time gs - one `div` 25) 135 (pl', ev) = updatePlayer kp (fld gs) (pl gs) 136 actors_updates = map updateActor (actors gs) 137 actors' = map fst actors_updates 138 ev' = concatMap snd actors_updates 139 140 gstmp = gs { pl = pl', actors = actors', time = time' } 141 gs' = procEvent gstmp (ev ++ ev') 142 143 initialState = GameGame { pl = newPlayer, fld = fldmap, actors = [], time = 400 * one } 144 145 doGameOver fldmap kss = doTitle fldmap kss 146 123 147 124 148 -- イベントを処理 125 procEvent :: Game State -> [Event] -> GameState149 procEvent :: GameGame -> [Event] -> GameGame 126 150 procEvent gs ev = foldl f gs ev 127 151 where … … 136 160 137 161 -- 描画 138 renderProc :: Game State -> ImageResource -> Scr162 renderProc :: GameGame -> ImageResource -> Scr 139 163 renderProc gs imgres sur = do 140 164 fillRect sur Nothing backColor … … 148 172 149 173 renderInfo gs imgres sur 150 151 flipSurface sur152 174 return () 153 175 176 tailN n = reverse . take n . reverse 177 178 deciWide w c n = tailN w $ replicate w c ++ show n 179 154 180 -- 情報描画 155 renderInfo :: Game State -> ImageResource -> Scr181 renderInfo :: GameGame -> ImageResource -> Scr 156 182 renderInfo gs imgres sur = do 157 183 puts 3 1 "MARIO" 158 puts 3 2 "000000"159 puts 11 2 "?*00"184 puts 3 2 $ deciWide 6 '0' $ getPlayerScore (pl gs) 185 puts 11 2 ("?*" ++ deciWide 2 '0' (getPlayerMedal (pl gs))) 160 186 puts 18 1 "WORLD" 161 187 puts 19 2 "1-1" 162 188 puts 25 1 "TIME" 163 puts 26 2 "255"189 puts 26 2 $ deciWide 3 ' ' ((time gs + one-1) `div` one) 164 190 where 165 191 puts = fontPut sur fontsur … … 167 193 168 194 -- タイトル画面 169 renderTitle gsimgres sur = do195 renderTitle imgres sur = do 170 196 blitSurface (getImageSurface imgres ImgTitle) Nothing sur (pt (5*8) (3*8)) 171 197 puts 13 14 "@1985 NINTENDO" 172 198 puts 9 17 "> 1 PLAYER GAME" 173 puts 9 19 " 2 PLAYER GAME"199 -- puts 9 19 " 2 PLAYER GAME" 174 200 puts 12 22 "TOP- 000000" 175 201 where -
lang/haskell/nario/Player.hs
r20397 r20420 7 7 updatePlayer, 8 8 renderPlayer, 9 getScrollPos 9 getScrollPos, 10 getPlayerYPos, 11 getPlayerMedal, 12 getPlayerScore 10 13 ) where 11 14 … … 14 17 import Util 15 18 import AppUtil 16 import SDLUtil17 19 import Const 18 20 import Images … … 37 39 stand :: Bool, 38 40 41 medal :: Int, 42 score :: Int, 43 39 44 lr :: Int, 40 45 pat :: Int, … … 49 54 scrx = 0, 50 55 stand = False, 56 57 medal = 0, 58 score = 0, 51 59 52 60 lr = 1, … … 160 168 checkCeil fld player 161 169 | stand player || vy player >= 0 || not isCeil = (player, []) 162 | otherwise = (player { vy = 0 }, [EvHitBlock ImgBlock2 cx cy])170 | otherwise = (player { vy = 0, score = (score player) + 10 }, [EvHitBlock ImgBlock2 cx cy]) 163 171 where 164 172 ytmp = y player - one * chrSize … … 188 196 getScrollPos player = (scrx player) `div` one 189 197 198 -- Y座標取得 199 getPlayerYPos :: Player -> Int 200 getPlayerYPos = (`div` one) . y 201 202 -- メダル枚数取得 203 getPlayerMedal :: Player -> Int 204 getPlayerMedal = medal 205 206 -- スコア取得 207 getPlayerScore :: Player -> Int 208 getPlayerScore = score 209 190 210 -- 描画 191 211 renderPlayer sur imgres scrx player = do -
lang/haskell/nario/tool/listup-imgs.hs
r20397 r20420 1 -- 画像ファイルを列挙して、ソースを生成 1 2 2 3 import System (getArgs) … … 7 8 import Data.List (intercalate) 8 9 9 -- �摜�t�@�C���̗�listupImgFiles path = fileEntries path >>= return . filter bmpFile 10 -- 画像ファイルの列挙 11 listupImgFiles path = fileEntries path >>= return . filter bmpFile 10 12 where 11 13 bmpFile = isJust . regex "\\.bmp$" 12 14 13 regex :: String -> String -> Maybe [String] 14 regex rex str = matchRegex (mkRegex rex) str 15 15 -- 全置換 16 16 gsub rexstr f str = loop str 17 17 where … … 22 22 rex = mkRegex rexstr 23 23 24 -- 拡張子を除いたファイル名 24 25 basefn fn = 25 26 case regex "^(.*)\\..*$" $ basename fn of … … 27 28 Nothing -> fn 28 29 29 -- �擪�������camelize (x:xs) = toUpper x : xs 30 -- 先頭を大文字に 31 camelize (x:xs) = toUpper x : xs 30 32 31 33 -- エントリ 32 34 main = do 33 35 args <- getArgs
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)