Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 07.03.2019
Сообщений: 7
1
.NET 4.x

Обработка столкновений в консольной игре

09.03.2019, 09:49. Показов 532. Ответов 1

Здравствуйте, продолжаю делать свою "терминальную"(консольную) игру на C#.
Столкнулся с некоторой проблемой, в частности с обработкой столкновений между игроком и призраками. Игрок представляет из себя массив из трёх строк по семь символов в каждой строке, призрак тоже самое. Возможно можно как-то записать изменённую позицию призрака и игрока и сравнить их, в любом случае ваши варианты решения принимаются.
Код
public class Player : ObjectBase // игрок
    {
        private const int SpriteWidth = 7;
        private const int SpriteHeight = 3;
        private const int startX = 7;
        private const int startY = 50;
        public int x;
        public int currentX;
        private int y;
        private int timer;
        private int animation;
        private int animationSpeed;
        private const int speed = 5;
        private int speedTimer;
        private static Dictionary<int, string[]> sprites;
        private Direction currentDir;


        private static string[] sprite1 = new string[3] {
            "█▄███▄█",
            " █#█#█ ",
            " ▄▀ ▀▄ "
        };

        private static string[] sprite2 = new string[3]
        {
            "▀▄███▄▀",
            " █#█#█ ",
            "  █ █  "
        };

        public Player(int x, int y) : 
            base(new CoordEntity(startX, startY))
        {
            currentX = x;
            this.x = x;
            this.y = y;
            animation = 0;
            timer = 0;
            animationSpeed = 15;
            speedTimer = 0;
            sprites = new Dictionary<int, string[]>
            {
                [0] = sprite1,
                [1] = sprite2
            };
            currentDir = Direction.noMove;
        }

        public void Plot()
        {
            timer++;
            if (timer == animationSpeed)
            {   
                timer = 0;
                animation++;
                if (animation == 2)
                {
                    animation = 0;
                }
               
            }

            SetColor(ConsoleColor.Green);

            for (int i = 0; i < 3; i++)
            {
                Console.SetCursorPosition(x, y + i);
                Console.WriteLine(sprites[animation][i]);
            }
        }

        public void unPlot()
        {
            for (int i = 0; i < 3; i++)
            {
                Console.SetCursorPosition(x, y + i);
                Console.WriteLine("       ");
            }
        }
        public void ReadKey()
        {
            ConsoleKeyInfo info = new ConsoleKeyInfo();

            while (Console.KeyAvailable)
            {
                info = Console.ReadKey(true);
            }

            switch (info.Key)
            {
                case ConsoleKey.LeftArrow:
                    currentDir = Direction.Left;
                    break;

                case ConsoleKey.RightArrow:
                    currentDir = Direction.Right;
                    break;

                case ConsoleKey.UpArrow:
                    currentDir = Direction.Up;
                    break;

                case ConsoleKey.DownArrow:
                    currentDir = Direction.Down;
                    break;

                case ConsoleKey.X:
                    currentDir = Direction.noMove;
                    break;

                default:
                    break;
            }
        }

        public void Move()
        {
            int maxX = 63;
            int minX = 1;
            int minY = 4;
            int maxY = 51;

            speedTimer++;
            if (speedTimer < speed)
                return;

            speedTimer = 0;

            if (currentDir == Direction.Left && x != minX) 
            {
                x--;
                currentX--;
                currentDir = Direction.noMove;
            }

            if (currentDir == Direction.Right && x != maxX)
            {
                x++;
                currentX++;
                currentDir = Direction.noMove;
            }    

            if (currentDir == Direction.Up && y != minY)
            {
                y--;
                currentDir = Direction.noMove;
            }

            if (currentDir == Direction.Down && y != maxY)
            {
                y++;
                currentDir = Direction.noMove;
            }

            if (x == minX)
            {
                currentDir = Direction.noMove;
            }

            if (x == maxX)
            {
                currentDir = Direction.noMove;
            }
        }
    }
Код
    public enum Direction
    {
        Up = 1,
        Down = 2,
        Left = 3,
        Right = 4,
        noMove = 5
    }

    public class Ghost // призрак
    {
        // ▄ █ ▀

        public int x;
        private int y;
        private int animation;
        private int timer;
        private int animationSpeed;
        private int SpeedTimer;
        private int speed;
        private Direction direction;
        private ConsoleColor color;
        private Direction currentDirection;
        private static Dictionary<int, string[]> ghosts;

        private static string[] ghost1 = new string[3]
        {
            "▄███▄",
            "█@█@█",
            "█▀█▀█"
        };

        private static string[] ghost2 = new string[3]
        {
            "▄███▄",
            "█@█@█",
            "▀█▀█▀"
        };

        public Ghost(int x, int y, ConsoleColor color, Direction direction, int speed)
        {
            this.x = x;
            this.y = y;
            this.color = color;
            ghosts = new Dictionary<int, string[]>
            {
                [0] = ghost1,
                [1] = ghost2
            };
            animation = 0;
            timer = 0;
            animationSpeed = 15;
            this.direction = direction;
            SpeedTimer = 0;
            this.speed = speed;
            currentDirection = direction;
        }

        public void Plot()
        {
            timer++;
            if (timer == animationSpeed)
            {
                timer = 0;
                animation++;
                if (animation == 2)
                    animation = 0;
            }

            Console.ForegroundColor = color;

            for (int i = 0; i < 3; i++)
            {
                Console.SetCursorPosition(x, y + i);
                Console.WriteLine(ghosts[animation][i]);
            }
        }

        public void UnPlot()
        {
            for (int i = 0; i < 3; i++)
            {
                Console.SetCursorPosition(x, y + i);
                Console.WriteLine("     ");
            }
        }

        public void Move()
        {
         int maxX = 55;
         int minX = 1;
        
            SpeedTimer++;
            if (SpeedTimer < speed)
                return;

            SpeedTimer = 0;

            if(currentDirection == Direction.Left && x != minX)
                x--;
            if (currentDirection == Direction.Right && x != maxX)
                x++;

            if (x == maxX)
            {
                x = minX + 1;
                currentDirection = Direction.Right;
            }

            if (x == minX)
            {
                x = maxX - 1;
                currentDirection = Direction.Left;
            }
        }
    }
Код
    class Game : ConsoleBase
    {
        private bool gameover = false;
        private Ghost _ghost;
        private Ghost _ghost2;
        private Ghost _ghost3;
        private Ghost _ghost4;
        private Ghost _ghost5;
        private Ghost _ghost6;
        public Player player;

        public Game()
        {
            gameover = false;
            player = new Player(33, 50);
            _ghost = new Ghost(2, 19, ConsoleColor.Cyan, Direction.Left, 2);
            _ghost2 = new Ghost(2, 25, ConsoleColor.Red, Direction.Right, 4);
            _ghost3 = new Ghost(2, 30, ConsoleColor.Magenta, Direction.Left, 2);
            _ghost4 = new Ghost(2, 35, ConsoleColor.Green, Direction.Right, 4);
            _ghost5 = new Ghost(2, 40, ConsoleColor.Blue, Direction.Right, 4);
            _ghost6 = new Ghost(2, 45, ConsoleColor.DarkGray, Direction.Right, 4);
        }

        public void Play()
        {
            AddStripes();

            //player = new Player(10, 50);

            while (gameover != true)
            {
                    Plot();
                    unPlot();
                    player.ReadKey();
                    Move();
            }
        }
        

        private void Plot()
        {

            player.Plot();
            _ghost.Plot();
            _ghost2.Plot();
            _ghost3.Plot();
            _ghost4.Plot();
            _ghost5.Plot();
            _ghost6.Plot();

            System.Threading.Thread.Sleep(20);
        }

        private void unPlot()
        {

            player.unPlot();
            _ghost.UnPlot();
            _ghost2.UnPlot();
            _ghost3.UnPlot();
            _ghost4.UnPlot();
            _ghost5.UnPlot();
            _ghost6.UnPlot();
        }

        private void Move()
        {
            player.Move();
            _ghost.Move();
            _ghost2.Move();
            _ghost3.Move();
            _ghost4.Move();
            _ghost5.Move();
            _ghost6.Move();
        }

        private int GetPlayerX()
        {
            return player.currentX;
        }

        private void AddStripes()
        {
            SetColor(ConsoleColor.White);
            for(int i = 0; i < 70; i += 2)
                At(0 + i, 22, "▄");

            SetColor(ConsoleColor.White);
            for (int i = 0; i < 70; i += 2)
                At(0 + i, 28, "▄");

            SetColor(ConsoleColor.White);
            for (int i = 0; i < 70; i += 2)
                At(0 + i, 33, "▄");

            SetColor(ConsoleColor.White);
            for (int i = 0; i < 70; i += 2)
                At(0 + i, 38, "▄");

            SetColor(ConsoleColor.White);
            for (int i = 0; i < 70; i += 2)
                At(0 + i, 43, "▄");

            SetColor(ConsoleColor.DarkCyan);
            for (int i = 0; i < 70; i++)
                At(0 + i, 54, "█");

            SetColor(ConsoleColor.DarkCyan);
            for (int i = 0; i < 70; i++)
                At(0 + i, 55, "█");

            SetColor(ConsoleColor.DarkCyan);
            for (int i = 0; i < 70; i++)
                At(0 + i, 3, "█");

            SetColor(ConsoleColor.DarkCyan);
            for (int i = 0; i < 70; i++)
                At(0 + i, 2, "█");
        }
    }
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2019, 09:49
Ответы с готовыми решениями:

Обработка множества столкновений
Есть игра на js и сервер на nodejs, на карте более 1000 обьектов и все нужно обрабатывать на...

Как сделать анимацию или физику в консольной игре?
Всем привет) Я юный программист (мне 14) Вот пишу игру в косноле на C# что то ти по песочниц НЕ...

Смерть персонажей в консольной игре
Добрый день. Для тренировки пишу консольную action rpg. Встал вопрос, как организовать корректно...

Обработка столкновений в игре "Танчики"
Здравствуйте, ув. форумчане! Мне нужна помощь с обработкой столкновений (коллизией) в игре...

1
1586 / 964 / 509
Регистрация: 23.02.2019
Сообщений: 2,505
09.03.2019, 18:53 2
Ваши персонажи это прямоугольники со сторонами 3х7, так же они имеют позицию на экране. Почему бы не попробовать проверять пересечения с помощью обычного ААВВ? Вот вроде приятная статья на эту тему http://www.cat-in-web.ru/noteb... ugolnikov/
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2019, 18:53

Определение столкновений в простой 2D игре
Пишу 2D игру (что-то вроде марио :D ). В ней есть игрок и всякие предметы. Надо сделать функцию...

Метеориты в консольной игре
Например я хочу в своей первой консольной игре добавить пули или астероиды, чтобы они появлялись в...

Обработка столкновений
Как можно обрабатывать столкновения у прямоугольника, круга и сложных фигур? Мне нужна теория

Обработка столкновений
Всем привет!!!. Делаю столкновения в игре нужно чтобы при столкновении .game_hero c...

Обработка столкновений
Великие гуру AS 3.0 нужен ваш совет. Можете мне скинуть пример обработки столкновений...

Обработка столкновений
Расскажите у кого какой опыт обработки столкновений при создании игр? два спрайта, должно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.