Changeset 20420 for lang/haskell/nario/Main.hs
- Timestamp:
- 10/02/08 01:25:33 (3 months ago)
- Files:
-
- 1 modified
-
lang/haskell/nario/Main.hs (modified) (7 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
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)