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

Передать метод как параметр и вызвать его

29.09.2013, 15:35. Просмотров 549. Ответов 1
Метки нет (Все метки)

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

Например кнопка Выход. В главном классе есть метод ClickExitButton(). Создаем кнопку, передаем в конструктор текстуру, прямоугольник и метод или ссылку на метод. В классе меню этот метод вызывается

код класса кнопки:
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
    class MenuButton
    {
        private Texture2D _activeButtonTexture2D;
        private Rectangle _activeButtonRectangle;
 
        private Texture2D _inactiveButtonTexture2D;
        private Rectangle _inactiveButtonRectangle;
 
        private bool _isActive;
 
 
        public MenuButton(Texture2D activeButtonTexture2D, Rectangle activeButtonRectangle,
                            Texture2D inactiveButtonTexture2D, Rectangle inactiveButtonRectangle
                            /*,метод или ссылка на метод*/)
        {
            _isActive = false;
            _activeButtonTexture2D = activeButtonTexture2D;
            _activeButtonRectangle = activeButtonRectangle;
            _inactiveButtonTexture2D = inactiveButtonTexture2D;
            _inactiveButtonRectangle = inactiveButtonRectangle;
        }
 
 
        public bool isActive
        {
            get { return _isActive; }
            set { _isActive = value; }
        }
 
        public void Draw(SpriteBatch spriteBatch)
        {
            if (_isActive)
            {
                spriteBatch.Draw(_activeButtonTexture2D, _activeButtonRectangle, Color.White);
            }
            else
            {
                spriteBatch.Draw(_inactiveButtonTexture2D, _inactiveButtonRectangle, Color.White);
            }
        }
    }
код класса меню:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    class Menu
    {
        private Texture2D _backgroundTexture2D;
        private Rectangle _backgroundRectangle;
 
        private Texture2D _titleTexture2D;
        private Rectangle _titleRectangle;
        
        private List<MenuButton> _buttons;
        private int _activeIndex;
 
 
        public Menu(Texture2D backgroundTexture2D, Rectangle backgroundRectangle,
                    Texture2D titleTexture2D, Rectangle titleRectangle,
                    List<MenuButton> buttons)
        {
            _backgroundTexture2D = backgroundTexture2D;
            _backgroundRectangle = backgroundRectangle;
            _titleTexture2D = titleTexture2D;
            _titleRectangle = titleRectangle;
            _buttons = buttons;
 
            if (_buttons.Count > 0)
            {
                _buttons[0].isActive = true;
                _activeIndex = 0;
            }
        }
 
 
        public void Update(GameTime gameTime)
        {
            if (_buttons.Count > 0)
            {
                if (Keyboard.GetState().IsKeyDown(Keys.Down))
                {
                    if (_activeIndex < _buttons.Count - 1)
                    {
                        _buttons[_activeIndex].isActive = false;
                        _activeIndex++;
                        _buttons[_activeIndex].isActive = true;
                    }
                }
                else if (Keyboard.GetState().IsKeyDown(Keys.Up))
                {
                    if (_activeIndex > 0)
                    {
                        _buttons[_activeIndex].isActive = false;
                        _activeIndex--;
                        _buttons[_activeIndex].isActive = true;
                    }
                }
                else if (Keyboard.GetState().IsKeyDown(Keys.Enter))
                {
                    // Нажали Enter должен вызваться метод
                }
            }
        }
 
 
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(_backgroundTexture2D, _backgroundRectangle, Color.White);
            spriteBatch.Draw(_titleTexture2D, _titleRectangle, Color.White);
 
            foreach (var button in _buttons)
            {
                button.Draw(spriteBatch);
            }
        }
    }
и кусок кода главного класса:
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
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            buttons.Add(new MenuButton(Content.Load<Texture2D>("btnStartGame2"),
                                       new Rectangle(graphics.PreferredBackBufferWidth / 2 - 158, 160, 315, 90),
                                       Content.Load<Texture2D>("btnStartGame1"),
                                       new Rectangle(graphics.PreferredBackBufferWidth / 2 - 158, 160, 315, 90) 
                                       /*,метод или ссылка на метод*/));
            buttons.Add(new MenuButton(Content.Load<Texture2D>("btnExit2"),
                                       new Rectangle(graphics.PreferredBackBufferWidth / 2 - 158, 260, 315, 90),
                                       Content.Load<Texture2D>("btnExit1"),
                                       new Rectangle(graphics.PreferredBackBufferWidth / 2 - 158, 260, 315, 90)
                                       /*,метод или ссылка на метод*/));
 
            menu = new Menu(Content.Load<Texture2D>("MenuBack"),
                            new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight),
                            Content.Load<Texture2D>("MenuTitle"), 
                            new Rectangle(graphics.PreferredBackBufferWidth/2 - 225, 30, 450, 100),
                            buttons);
        }
 
        // тот самый метод
        public void ClickExitButton()
        {
            Exit();
        }

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 15:35
Ответы с готовыми решениями:

Передать тип как параметр
Добрый день. Как передать тип как параметр вот метод dynamic get_Par(int ipa,...

Как передать параметр потоку?
Добрый день, возник вопрос как передать параметр потоку, нужно чтобы каждый...

Метод с массивом как параметр
Нужно создать метод, кторый принимает массив, как параметр и выводит его,массив...

Как грамотно вызвать блокирующий метод?
Везде пишут для кратковременных операций (&lt;50мс) (интенсивных вычислений)...

Как вызвать static метод из типа dynamic
К примеру есть класс в одной программе: namespace ConsApp_VerifyText { ...

1
SharpDeveloper
134 / 131 / 22
Регистрация: 16.02.2012
Сообщений: 453
29.09.2013, 16:47 #2
Delegates, Invoke

C#
1
2
3
4
5
ctor(Action act)
...
act.Invoke();
 
ctor(ClickExitButton)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 16:47

Как вызвать метод, параметром которого является делегат СompareDelegate<T>
Здравствуйте! Помогите разобраться с использованием делегата. У меня задача, в...

Как создать строковый параметр в реестре и прочитать его
1. Как создать параметр с значением-строкой? Вот так я создаю DWORD: IntPtr...

Просветите, pls: как передать тип в метод
Есть класс MyClass имеющий метод DoSomething, который взамодействует с...


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

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

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