Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 22.03.2012, 16:07   #1
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
C# структура программы.

Делаю 2д игру на XNA 4.0
В данный момент реализация такая: есть 3 класса - игровой мир, объект и игрок. Класс игрового мира содержит одного игрока и массив объектов. Метод, обновляющий положения игрока, должен использовать данные о "мире".
В данный момент я из "мира" вызываю метод игрока и передаю ему ссылку. "(Hero.Update(This))"
Как ещё можно реализовать?
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 22.03.2012, 16:24   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: C# структура программы.

Я бы создал интерфейс GameObject, который будет иметь как минимум два метода: Update и Render.
Далее, World имеет List<GameObject>, естественно в него всё что не наследует GameObject не может находиться.
Затем уже в самих классах сущностей, оверлоадишь методы Update и Render, специфично к самой сущности.
Затем в World будет два метода Update и Render, которые пробегаются по списку и запускают соответствующий метод.
Тем самым мы обновляем всё запуская один метод. И также с рендером.
Вот только зачем ты персонажу передаёшь данные о мире, это мне не совсем понятно. По сути персонаж не должен ничего знать о самом мире. Всё что он должен, это обновить себя.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Igor (22.03.2012), SBJoker (22.03.2012)
Старый 22.03.2012, 17:12   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: C# структура программы.

Там есть вот такая штука:
http://msdn.microsoft.com/ru-ru/libr...component.aspx

Небольшая статейка, правда на английском, зато примеры понятные:
http://sharpoverride.hubpages.com/hu...-in-components
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Igor (22.03.2012), moka (22.03.2012)
Старый 22.03.2012, 19:39   #4
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Ответ: C# структура программы.

О твоем вопросе. По сути, есть два способа: либо при создании объектов мира передавать им мир, к которому они принадлежат, либо (как у тебя) передавать мир в соответствующем методе.

Альтернатива, которую любят многие, — это костыль в виде мира, реализующего синглтон.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Igor (23.03.2012)
Старый 22.03.2012, 21:08   #5
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: C# структура программы.

Вопрос косвенно относящийся к теме.
Как лучше делать:
обрабатывать нажатия клавиш в главном цикле и в соответствии с необходимостью инициализировать некоторые действия объектов, или передавать объектам в функцию update массив значений состояния клавиш, а он уже пускай сам разбирается?
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 22.03.2012, 22:44   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: C# структура программы.

Можно состояния сделать статическим массивом, и никуда не передавать, пусть сами обращаются. А обновлять в основном цикле.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
FireOwl (22.03.2012), moka (23.03.2012)
Старый 20.05.2012, 20:44   #7
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: C# структура программы.

Вопрос, косвенно относящийся к теме.

Допустим у меня есть метод/функция/что-то еще, которая работает с экземпляром некого класса. А у этого класса есть метод, возвращающий переменную.
Например, класс image и метод image.get_width();
Если я в своей функции часто обращаюсь к ширине картинки, как лучше поступить - записать это число в локальную переменную, обратившись к методу get_width() только один раз, или вызывать get_width() каждый раз когда мне потребуется это значение?
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 20.05.2012, 21:09   #8
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: C# структура программы.

помоему очевидно что первый вариант лучше, не?)
Если конечно по ходу значение get_width() не может измениться и тебе важны эти изменения.

Провел эксперимет.


using System;
using System.Linq;
using System.Windows.Forms;
using System.Globalization;


namespace test_cs
{
    class lol
    {
        public int x { get; set; }

        public lol(int p)
        { x = p; }
        public int _x()
        { return x; }
    }


    class TestClass
    {
        static private long Millisecs()
        {
            long[] p = new long[12];

            p[0] = 31; p[1] = 28; p[2] = 31; p[3] = 30; p[4] = 31; p[5] = 30;
            p[6] = 31; p[7] = 31; p[8] = 30; p[9] = 31; p[10] = 30; p[11] = 31;
            if ((DateTime.Now.Year - 2012) % 4 == 0)
            {
                p[1] = 29;
            }
            long n = 0;
            for (int i = 0; i < DateTime.Now.Month - 1; i++)
            {
                n += p[i];
            }
            return Convert.ToInt64(((((n + Convert.ToInt64(DateTime.Now.Day)) * 24 + Convert.ToInt64(DateTime.Now.Hour)) * 60 + Convert.ToInt64(DateTime.Now.Minute)) * 60 + Convert.ToInt64(DateTime.Now.Second)) * 1000 + Convert.ToInt64(DateTime.Now.Millisecond));
        }

        static void Main()
        {
            long dt1, dt2, dt3;
            lol a = new lol(5342);
            int p = a._x();
            
            long t1 = Millisecs();
            for (int i = 0; i < 3000000;i++ )
            {
                int p1 = a._x(); int p2 = a._x(); int p3 = a._x(); int p4 = a._x(); int p5 = a._x();
                int p6 = a._x(); int p7 = a._x(); int p8 = a._x(); int p9 = a._x(); int p10 = a._x();
                int p11 = a._x(); int p12 = a._x(); int p13 = a._x(); int p14 = a._x(); int p15 = a._x();
                int p16 = a._x(); int p17 = a._x(); int p18 = a._x(); int p19 = a._x(); int p20 = a._x();
                int p21 = a._x(); int p22 = a._x(); int p23 = a._x(); int p24 = a._x(); int p25 = a._x();
                int p26 = a._x(); int p27 = a._x(); int p28 = a._x(); int p29 = a._x(); int p30 = a._x();
                int p31 = a._x(); int p32 = a._x(); int p33 = a._x(); int p34 = a._x(); int p35 = a._x();
                int p36 = a._x(); int p37 = a._x(); int p38 = a._x(); int p39 = a._x(); int p40 = a._x();
                int p41 = a._x(); int p42 = a._x(); int p43 = a._x(); int p44 = a._x(); int p45 = a._x();
                int p46 = a._x(); int p47 = a._x(); int p48 = a._x(); int p49 = a._x(); int p50 = a._x();
            }
            long t2 = Millisecs();
            dt1 = t2 - t1;

            t1 = Millisecs();
            for (int i = 0; i < 3000000; i++)
            {
                int p1 = a.x; int p2 = a.x; int p3 = a.x; int p4 = a.x; int p5 = a.x;
                int p6 = a.x; int p7 = a.x; int p8 = a.x; int p9 = a.x; int p10 = a.x;
                int p11 = a.x; int p12 = a.x; int p13 = a.x; int p14 = a.x; int p15 = a.x;
                int p16 = a.x; int p17 = a.x; int p18 = a.x; int p19 = a.x; int p20 = a.x;
                int p21 = a.x; int p22 = a.x; int p23 = a.x; int p24 = a.x; int p25 = a.x;
                int p26 = a.x; int p27 = a.x; int p28 = a.x; int p29 = a.x; int p30 = a.x;
                int p31 = a.x; int p32 = a.x; int p33 = a.x; int p34 = a.x; int p35 = a.x;
                int p36 = a.x; int p37 = a.x; int p38 = a.x; int p39 = a.x; int p40 = a.x;
                int p41 = a.x; int p42 = a.x; int p43 = a.x; int p44 = a.x; int p45 = a.x;
                int p46 = a.x; int p47 = a.x; int p48 = a.x; int p49 = a.x; int p50 = a.x;
            }
            t2 = Millisecs();
            dt2 = t2 - t1;

            t1 = Millisecs();
            for (int i = 0; i < 3000000; i++)
            {
                int p1 = p; int p2 = p; int p3 = p; int p4 = p; int p5 = p;
                int p6 = p; int p7 = p; int p8 = p; int p9 = p; int p10 = p;
                int p11 = p; int p12 = p; int p13 = p; int p14 = p; int p15 = p;
                int p16 = p; int p17 = p; int p18 = p; int p19 = p; int p20 = p;
                int p21 = p; int p22 = p; int p23 = p; int p24 = p; int p25 = p;
                int p26 = p; int p27 = p; int p28 = p; int p29 = p; int p30 = p;
                int p31 = p; int p32 = p; int p33 = p; int p34 = p; int p35 = p;
                int p36 = p; int p37 = p; int p38 = p; int p39 = p; int p40 = p;
                int p41 = p; int p42 = p; int p43 = p; int p44 = p; int p45 = p;
                int p46 = p; int p47 = p; int p48 = p; int p49 = p; int p50 = p;
            }
            t2 = Millisecs();
            dt3 = t2 - t1;

            Console.WriteLine("dt1 = "+dt1);
            Console.WriteLine("dt2 = " + dt2);
            Console.WriteLine("dt3 = " + dt3);

            Console.WriteLine("end");

            Console.Read();
        }
    }
}


Результаты:


Первое число это вызов значения через метод по ссылке на класс.
Второе число это вызов значения через свойство по ссылке на класс.
Третье число это вызов значения через локальную переменную, которой один раз присвоили значение.
50 раз внутри цикла для того чтобы действия по увеличению счетчика цикла не оказывали большое влияние на результаты.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо radiobutton за это полезное сообщение:
ANIK123 (21.05.2012), Лit}{Ъ (18.11.2012), FireOwl (20.05.2012)
Старый 20.05.2012, 21:45   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: C# структура программы.

Создать Accessor, получающий данное ширины картинки. Ширина картинки - есть int число, приватное значение, которое назначается при изменениях ширины картинки. Например при загрузки картинки, или ещё битмап масштабировании.
Тебе не нужно вычислять каждый раз ширину по самому массиву, делай это когда изменены данные.
Если же тебя задаёт вопрос, как лучше - постоянно спрашивать у картинки или спросить один раз в локальную переменную, то как понимаю ты начинаешь загоняться о мелких и не нужных вещах, т.к. это реально мелочи.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Лit}{Ъ (18.11.2012), FireOwl (20.05.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 23:47.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com