Форум программистов, компьютерный форум, киберфорум
Наши страницы
Storm23
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 3.

Простая тайловая игра (WinForms, GDI+)

Запись от Storm23 размещена 03.01.2016 в 18:24
Обновил(-а) Storm23 14.03.2019 в 13:24

Простейшая игра с использованием тайловой модели мира.

Классы Game, GameState
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    public static class Game
    {
        public static Size TileSize = new Size(32, 32);
        public static GameState State { get; set; }
        public static PlayerController PlayerController { get; set; }
        public static ItemsController ItemsController { get; set; }
 
        public static void Init()
        {
            State = new GameState();
            PlayerController = new PlayerController();
            ItemsController = new ItemsController();
 
            State.Level = Level.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "levels\\level1.txt"));
            State.Player = new Player() { Location = new PointF(1, 1), Sprite = new Sprite() { FrameSize = new Size(70, 70)} };
            State.CoinSprite = new Sprite {FrameCount = 64, FrameSize = new Size(64, 64)};
        }
 
        public static void Update()
        {
            PlayerController.Update();
            ItemsController.Update();
        }
 
        public static void Save(string filePath)
        {
            using (var fs = new FileStream(filePath, FileMode.Create))
            using (var zip = new GZipStream(fs, CompressionMode.Compress))
                new BinaryFormatter().Serialize(zip, State);
        }
 
        public static void Load(string filePath)
        {
            using (var fs = new FileStream(filePath, FileMode.Open))
            using (var zip = new GZipStream(fs, CompressionMode.Decompress))
                State = (GameState)new BinaryFormatter().Deserialize(zip);
        }
    }
 
    /// <summary>
    /// State of the game (can be saved and loaded form file)
    /// </summary>
    [Serializable]
    public class GameState
    {
        public Level Level { get; set; }
        public Player Player { get; set; }
        public Sprite CoinSprite { get; set; }
    }

Класс Level
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    [Serializable]
    public class Level
    {
        public Tile[,] Tiles { get; private set; }
 
        public int Width { get; private set; }
        public int Height { get; private set; }
 
        public static Level Load(string fileName)
        {
            var res = new Level();
            var lines = File.ReadAllLines(fileName);
 
            res.Width = lines[0].Length;
            res.Height = lines.Length;
 
            res.Tiles = new Tile[res.Width, res.Height];
 
            for (int j = 0; j < res.Height; j++)
                for (int i = 0; i < res.Width; i++) 
                    switch(lines[j][i])
                    {
                        case '.':
                        case ' ': res.Tiles[i, j] = new Floor { Location = new Point(i, j) }; break;
                        case '#': res.Tiles[i, j] = new Wall { Location = new Point(i, j) }; break;
                        case '@': res.Tiles[i, j] = new Coin { Location = new Point(i, j) }; break;
                        case 'w': res.Tiles[i, j] = new Water { Location = new Point(i, j) }; break;
                        case 'b': res.Tiles[i, j] = new RescueBuoy { Location = new Point(i, j) }; break;
                        default: goto case ' ';
                    }
 
            return res;
        }
    }

Класс Tile и наследники
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    [Serializable]
    public abstract class Tile
    {
        public Point Location { get; set; }
        public Rectangle Rect
        {
            get { return new Rectangle(Game.TileSize.Width * Location.X, Game.TileSize.Width * Location.Y, Game.TileSize.Width, Game.TileSize.Height); }
        }
 
        public virtual bool CanWalk { get { return true; } }
 
        public abstract void Draw(Graphics gr);
    }
 
    [Serializable]
    public class Floor : Tile
    {
        public override void Draw(Graphics gr)
        {
            gr.DrawImageUnscaledAndClipped(GameResources.Floor, Rect);
        }
    }
 
    [Serializable]
    public class Wall : Tile
    {
        public override bool CanWalk { get { return false; } }
 
        public override void Draw(Graphics gr)
        {
            gr.DrawImageUnscaledAndClipped(GameResources.Wall, Rect);
        }
    }

Класс PlayerController
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    public class PlayerController
    {
        public float Speed { get;set;}
 
        public PlayerController()
        {
            Speed = 0.06f;
        }
 
        public void Update()
        {
            var sprite = Game.State.Player.Sprite;
            var tiles = Game.State.Level.Tiles;
 
            var dx = 0;
            var dy = 0;
            var speed = Speed;
            if(Keyboard.IsKeyDown(Keys.W)) dy = -1;
            if(Keyboard.IsKeyDown(Keys.A)) dx = -1;
            if(Keyboard.IsKeyDown(Keys.S)) dy = 1;
            if(Keyboard.IsKeyDown(Keys.D)) dx = 1;
            if(Keyboard.IsKeyDown(Keys.ShiftKey)) speed *= 1.5f;
 
 
            var x = Game.State.Player.Location.X + dx * speed;
            var y = Game.State.Player.Location.Y + dy * speed;
            var foots = new RectangleF(x + 0.3f, y + 0.7f, 0.4f, 0.2f);
            if (tiles[(int)foots.Left, (int)foots.Top].CanWalk && 
                tiles[(int)foots.Right, (int)foots.Top].CanWalk &&
                tiles[(int)foots.Left, (int)foots.Bottom].CanWalk &&
                tiles[(int)foots.Right, (int)foots.Bottom].CanWalk)
            {
                Game.State.Player.Location = new PointF(x, y);
 
                if (dy > 0) sprite.Row = 0; else
                if (dy < 0) sprite.Row = 3; else
                if (dx > 0) sprite.Row = 2; else
                if (dx < 0) sprite.Row = 1; else
                {
                    //stay
                    sprite.Row = sprite.Row == 3 ? 3 : 0;
                    sprite.CurrentFrame = 0;
                }
 
                if (dx != 0 || dy != 0)
                    Game.State.Player.Sprite.Update(speed*8);
            }else
            {
                //stay
                Game.State.Player.Sprite.CurrentFrame = 0;
                Game.State.Player.Sprite.Row = 0;
            }
        }
    }

Пример файла уровня
############################
#..........................#
#..........................#
#..##..##..##..##..##..##..#
#..##..##..##..##@.##..##..#
#..##..##..##..##.@##..##..#
#..........##..##..........#
#..........##..##..........#
###..####..........####..###
#....####..........####....#
#..........##..##..........#
#..........######..........#
#..######..######...wwwwwww#
#..##b.##..##@@##..www.....#
#..##..##..##..##...ww.....#
#..##..##..##..##..www..@@.#
#...................ww.....#
#..................www.....#
############################


Управление: WASD (+Shift)

Нажмите на изображение для увеличения
Название: 0.png
Просмотров: 336
Размер:	176.6 Кб
ID:	3501

Проект целиком:
Вложения
Тип файла: zip WindowsFormsApplication326 (2).zip (2.37 Мб, 5 просмотров)
Размещено в Без категории
Просмотров 1385 Комментарии 3
Всего комментариев 3
Комментарии
  1. Старый комментарий
    обновите ссылку пожалуйста на проект
    Запись от MuaddibFremen размещена 14.03.2019 в 13:09 MuaddibFremen вне форума
  2. Старый комментарий
    Аватар для Storm23
    Цитата:
    Сообщение от MuaddibFremen Просмотреть комментарий
    обновите ссылку пожалуйста на проект
    Обновил.
    Запись от Storm23 размещена 14.03.2019 в 13:25 Storm23 вне форума
  3. Старый комментарий
    спасибо! сижу балуюсь
    Запись от MuaddibFremen размещена 14.03.2019 в 14:06 MuaddibFremen вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru