|
Revision 20244, 2.0 kB
(checked in by mokehehe, 5 years ago)
|
|
落下チェックで床を2点見るように
|
| Line | |
|---|
| 1 | |
|---|
| 2 | -- フィールド |
|---|
| 3 | {- |
|---|
| 4 | ' ' 空白 |
|---|
| 5 | '*' 見えない壁(壁を下から叩いたときに一時的に見えない壁に置き換える) |
|---|
| 6 | -} |
|---|
| 7 | |
|---|
| 8 | module Field ( |
|---|
| 9 | Field, |
|---|
| 10 | Cell, |
|---|
| 11 | loadField, |
|---|
| 12 | fieldRef, |
|---|
| 13 | fieldSet, |
|---|
| 14 | isBlock, |
|---|
| 15 | renderField |
|---|
| 16 | ) where |
|---|
| 17 | |
|---|
| 18 | import Multimedia.SDL |
|---|
| 19 | |
|---|
| 20 | import Const |
|---|
| 21 | import Util |
|---|
| 22 | |
|---|
| 23 | type Cell = Char |
|---|
| 24 | type Field = [[Cell]] |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | -- マップ |
|---|
| 28 | |
|---|
| 29 | -- マップ読み込み |
|---|
| 30 | loadField :: Int -> IO Field |
|---|
| 31 | loadField stage = readFile fn >>= return . lines |
|---|
| 32 | where |
|---|
| 33 | fn = "data/stage" ++ (show stage) ++ ".map" |
|---|
| 34 | |
|---|
| 35 | |
|---|
| 36 | chr2img '@' = ImgBlock1 |
|---|
| 37 | chr2img 'O' = ImgBlock2 |
|---|
| 38 | chr2img 'X' = ImgBlock3 |
|---|
| 39 | chr2img '?' = ImgBlock4 |
|---|
| 40 | chr2img '_' = ImgMt02 |
|---|
| 41 | chr2img '/' = ImgMt11 |
|---|
| 42 | chr2img ',' = ImgMt12 |
|---|
| 43 | chr2img '\\' = ImgMt13 |
|---|
| 44 | chr2img '.' = ImgMt22 |
|---|
| 45 | chr2img '1' = ImgCloud00 |
|---|
| 46 | chr2img '2' = ImgCloud01 |
|---|
| 47 | chr2img '3' = ImgCloud02 |
|---|
| 48 | chr2img '4' = ImgCloud10 |
|---|
| 49 | chr2img '5' = ImgCloud11 |
|---|
| 50 | chr2img '6' = ImgCloud12 |
|---|
| 51 | chr2img '7' = ImgGrass0 |
|---|
| 52 | chr2img '8' = ImgGrass1 |
|---|
| 53 | chr2img '9' = ImgGrass2 |
|---|
| 54 | chr2img '[' = ImgDk00 |
|---|
| 55 | chr2img ']' = ImgDk01 |
|---|
| 56 | chr2img 'l' = ImgDk10 |
|---|
| 57 | chr2img '|' = ImgDk11 |
|---|
| 58 | chr2img 'o' = ImgPole0 |
|---|
| 59 | chr2img '!' = ImgPole1 |
|---|
| 60 | |
|---|
| 61 | |
|---|
| 62 | |
|---|
| 63 | isBlock :: Cell -> Bool |
|---|
| 64 | isBlock c = c `elem` "@OX?[]l|*" |
|---|
| 65 | |
|---|
| 66 | inField :: Field -> Int -> Int -> Bool |
|---|
| 67 | inField fld x y = 0 <= y && y < length fld && 0 <= x && x < length (fld !! y) |
|---|
| 68 | |
|---|
| 69 | fieldRef :: Field -> Int -> Int -> Cell |
|---|
| 70 | fieldRef fld x y |
|---|
| 71 | | inField fld x y = fld !! y !! x |
|---|
| 72 | | otherwise = ' ' |
|---|
| 73 | |
|---|
| 74 | fieldSet :: Field -> Int -> Int -> Cell -> Field |
|---|
| 75 | fieldSet fld x y c |
|---|
| 76 | | inField fld x y = replace fld y $ replace (fld !! y) x c |
|---|
| 77 | | otherwise = fld |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | renderField sur imgres scrx fld = |
|---|
| 81 | sequence_ $ concatMap lineProc $ zip [0..] fld |
|---|
| 82 | where |
|---|
| 83 | lineProc (y, ln) = map (cellProc y) $ zip [0..] $ window ln |
|---|
| 84 | cellProc y (x, c) |
|---|
| 85 | | c `elem` " *" = return () |
|---|
| 86 | | otherwise = putchr x y c >> return () |
|---|
| 87 | putchr x y c = blitSurface (getImageSurface imgres $ chr2img c) Nothing sur $ pt (x*chrSize - rx) (y*chrSize - 8) |
|---|
| 88 | |
|---|
| 89 | -- 表示される部分だけ取り出す |
|---|
| 90 | window = take w . drop qx |
|---|
| 91 | qx = scrx `div` chrSize |
|---|
| 92 | rx = scrx `mod` chrSize |
|---|
| 93 | w = 256 `div` chrSize + 1 |
|---|