root/lang/haskell/nario/Field.hs @ 20244

Revision 20244, 2.0 kB (checked in by mokehehe, 5 years ago)

落下チェックで床を2点見るように

Line 
1
2-- フィールド
3{-
4        ' '             空白
5        '*'             見えない壁(壁を下から叩いたときに一時的に見えない壁に置き換える)
6-}
7
8module Field (
9        Field,
10        Cell,
11        loadField,
12        fieldRef,
13        fieldSet,
14        isBlock,
15        renderField
16) where
17
18import Multimedia.SDL
19
20import Const
21import Util
22
23type Cell = Char
24type Field = [[Cell]]
25
26
27-- マップ
28
29-- マップ読み込み
30loadField :: Int -> IO Field
31loadField stage = readFile fn >>= return . lines
32        where
33                fn = "data/stage" ++ (show stage) ++ ".map"
34
35
36chr2img '@' = ImgBlock1
37chr2img 'O' = ImgBlock2
38chr2img 'X' = ImgBlock3
39chr2img '?' = ImgBlock4
40chr2img '_' = ImgMt02
41chr2img '/' = ImgMt11
42chr2img ',' = ImgMt12
43chr2img '\\' = ImgMt13
44chr2img '.' = ImgMt22
45chr2img '1' = ImgCloud00
46chr2img '2' = ImgCloud01
47chr2img '3' = ImgCloud02
48chr2img '4' = ImgCloud10
49chr2img '5' = ImgCloud11
50chr2img '6' = ImgCloud12
51chr2img '7' = ImgGrass0
52chr2img '8' = ImgGrass1
53chr2img '9' = ImgGrass2
54chr2img '[' = ImgDk00
55chr2img ']' = ImgDk01
56chr2img 'l' = ImgDk10
57chr2img '|' = ImgDk11
58chr2img 'o' = ImgPole0
59chr2img '!' = ImgPole1
60
61
62
63isBlock :: Cell -> Bool
64isBlock c = c `elem` "@OX?[]l|*"
65
66inField :: Field -> Int -> Int -> Bool
67inField fld x y = 0 <= y && y < length fld && 0 <= x && x < length (fld !! y)
68
69fieldRef :: Field -> Int -> Int -> Cell
70fieldRef fld x y
71        | inField fld x y       = fld !! y !! x
72        | otherwise                     = ' '
73
74fieldSet :: Field -> Int -> Int -> Cell -> Field
75fieldSet fld x y c
76        | inField fld x y       = replace fld y $ replace (fld !! y) x c
77        | otherwise                     = fld
78
79
80renderField 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
Note: See TracBrowser for help on using the browser.