Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 23:57   #21
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Я уже описывал как найти приращение - вычесть из конечной точки начальную покоординатно и поделить на что-нибудь, что будет отвечать за скорость (например длина полученного отрезка (по пифагору), в итоге получим приращение по х и по у.
Перечитывайте давайте, а то видать не доходит с первого раза )
phomm вне форума Ответить с цитированием
Старый 23.03.2013, 00:45   #22
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Перечитал..
Первая точка p1(0,0), вторая p2(5,12). Нам надо переместиться с первой во вторую по прямой линии.
Вычитываем p2-p1=p3(5,12). Скорость(длинна вектора пи Пифагору) равна v=sqrt(5^2+12^2)=13.
А как теперь р3 поделить на 13 ?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 23.03.2013, 01:47   #23
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Длина вектора - это НЕ СКОРОСТЬ! Это - РАССТОЯНИЕ.
чтобы получить скорость, нужно расстояние разделить на время.
В вашем случае, время можно брать игровое - условное - сколько нужно сделать шагов, чтобы из точки А попасть в точку B (впрочем, можно и наоборот, задать
скорость движения - расстояние S1 - проходимое машинкой за один игровой такт.

Пусть мы хотим, что машинка из пункта P1 переместилась в пункт P2 со скоростью 0.7 (взял наобум) точки за один игровой такт.

Тогда:
Цитата:
Шаг 0 позиция машинки: x= 0 y= 0
Шаг 1 позиция машинки: x= 0.263157894736842 y= 0.631578947368421
Шаг 2 позиция машинки: x= 0.526315789473684 y= 1.26315789473684
Шаг 3 позиция машинки: x= 0.789473684210526 y= 1.89473684210526
Шаг 4 позиция машинки: x= 1.05263157894737 y= 2.52631578947368
Шаг 5 позиция машинки: x= 1.31578947368421 y= 3.15789473684211
Шаг 6 позиция машинки: x= 1.57894736842105 y= 3.78947368421053
Шаг 7 позиция машинки: x= 1.84210526315789 y= 4.42105263157895
Шаг 8 позиция машинки: x= 2.10526315789474 y= 5.05263157894737
Шаг 9 позиция машинки: x= 2.36842105263158 y= 5.68421052631579
Шаг 10 позиция машинки: x= 2.63157894736842 y= 6.31578947368421
Шаг 11 позиция машинки: x= 2.89473684210526 y= 6.94736842105263
Шаг 12 позиция машинки: x= 3.1578947368421 y= 7.57894736842105
Шаг 13 позиция машинки: x= 3.42105263157895 y= 8.21052631578947
Шаг 14 позиция машинки: x= 3.68421052631579 y= 8.8421052631579
Шаг 15 позиция машинки: x= 3.94736842105263 y= 9.47368421052632
Шаг 16 позиция машинки: x= 4.21052631578947 y= 10.1052631578947
Шаг 17 позиция машинки: x= 4.47368421052632 y= 10.7368421052632
Шаг 18 позиция машинки: x= 4.73684210526316 y= 11.3684210526316
Шаг 19 позиция машинки: x= 5 y= 12


если что, получил я это таким кодом (на Паскаль, ничего другого под рукой нет):
Код:
type TPoint = record x,y : real end;

var
  s, dx, dy : real;
  v : real;
  p1, p2 : TPoint;
  CarPosition : TPoint;
  iStep, nStep : integer;
begin
  p1.x := 0; p1.y := 0;
  p2.x := 5; p2.y := 12;
  s := sqrt( sqr(p1.x-p2.x) + sqr(p1.y-p2.y)); {расстояние}

  v := 0.7; {скорость движения машинки по данному участку}
  nStep := trunc( s / v ) + 1; {число шагов,через которое мы достигнем цель}
  dx := (p2.x - p1.x) / nStep;
  dy := (p2.y - p1.y) / nStep;

  CarPosition := p1; {ставим машинку в начальную точку}
  WriteLn('Шаг 0  позиция машинки: x= ',CarPosition.X,' y= ',CarPosition.Y);
  for iStep:=1 to nStep do begin
    CarPosition.x := CarPosition.x + dx;
    CarPosition.y := CarPosition.y + dy;
    WriteLn('Шаг ',iStep,' позиция машинки: x= ',CarPosition.X,' y= ',CarPosition.Y);
  end;
    
end.

при выводе машинки на экран, её координаты X, Y нужно округлять до целых и выводить изображение по полученным ЦЕЛЫМ координатам...

Последний раз редактировалось Serge_Bliznykov; 23.03.2013 в 01:49.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.03.2013, 02:41   #24
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Вот попробовал сделать тоже, что и Serge, но оно отрисовует только в одну сторону, т.е. только вправо смещает, а по У нет, к примеру.
Код:
        Point first;
        Point second;
        List<Point> carpos =new List<Point>();
        int fClick = 0;
        Graphics g;
        Pen p1 = new Pen(Color.Red, 4);
        Pen p2 = new Pen(Color.Green, 4);
        double v=0.7, s, t;
        int dx, dy, ddx=0, ddy=0;


        public Form1()
        {
            InitializeComponent();
        }

        private void startToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox1.Visible = true;
            g = pictureBox1.CreateGraphics();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (fClick == 0)
            {
                first.X = e.X;
                first.Y = e.Y;
                fClick++;
            }
            if (fClick == 1)
            {
                second.X = e.X;
                second.Y = e.Y;
                g.DrawLine(p1, first, second);
                fClick++;
            }
            if (fClick >1)
            {
                first.X = second.X;
                first.Y = second.Y;
                second.X = e.X;
                second.Y = e.Y;
                g.DrawLine(p1, first, second);
            }

            carpos.Add(new Point(e.X, e.Y));
        }

        private void button1_Click(object sender, EventArgs e)
        {
                timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            s = Math.Sqrt((carpos[0].X - carpos[1].X) * (carpos[0].X - carpos[1].X) + (carpos[0].Y - carpos[1].Y) * (carpos[0].Y - carpos[1].Y));
            //nStep y Serge
            t = Math.Round(s / v) + 1;
            dx = Convert.ToInt32((carpos[1].X - carpos[0].X) / t);
            dy = Convert.ToInt32((carpos[1].Y - carpos[0].Y) / t);
            ddx += dx;
            ddy += dy;
            g.DrawLine(p2, carpos[0].X, carpos[0].Y, carpos[0].X + ddx, carpos[0].Y + ddy);

        }
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 23.03.2013, 13:06   #25
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Код:
    double dx, dy, ddx=0, ddy=0;
    int cur = 0;
private void timer1_Tick(object sender, EventArgs e)
        {
            if (cur == carpos.Count-1)
                return;
            
                if (Math.Abs(carpos[cur].X + ddx - carpos[cur + 1].X) <= Math.Abs(dx) && Math.Abs(carpos[cur].Y + ddy - carpos[cur + 1].Y) <= Math.Abs(dy))
                {
                    cur++;
                    if (cur == carpos.Count - 1)
                        return; // финиш
                    ddx = ddy = dx = dy = 0;
                }
            
            s = Math.Sqrt(Math.Pow(carpos[cur].X - carpos[cur + 1].X, 2) + Math.Pow(carpos[cur].Y - carpos[cur + 1].Y, 2));
            //nStep y Serge
            t = Math.Round(s / v) + 1;
            dx = (carpos[cur + 1].X - carpos[cur].X) / t;
            dy = (carpos[cur + 1].Y - carpos[cur].Y) / t;
            ddx += dx;
            ddy += dy;
            g.DrawLine(p2, carpos[cur].X, carpos[cur].Y, Convert.ToInt32(carpos[cur].X + ddx), Convert.ToInt32(carpos[cur].Y + ddy));
    }
Я не рад, что написал такой код )) но он работает. Я бы всё обернул в классы - и трассу и машинку, но времени сегодня нет.
phomm вне форума Ответить с цитированием
Старый 23.03.2013, 14:11   #26
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

phomm, у меня задание по предмету "ООП", разработать игру "Ралли по бездорожью", в которой есть классы "карта", "машина", "преграда". Игрок должен проехать от старта до финиша. Преграды: озера - надо объезжать, песок - можно ехать но скорость уменьшается в два раза, при том же расходе топлива. Запас топлива ограничен, а расход на 1км пропорционален квадрату скорости. Для управления используют стрелки вверх, вниз - ускоряют, замедляют машинку. А вначале игрок прокладывает маршрут, по которому поедет машинка.

Так вот. Я решил начать с малого и по немного собирать игру. Сначала придумал-реализовал как прокладывать маршрут, сейчас вот остановился на том, чтобы машинка двигалась по нему.
А классы я думал сделать после того, как все уже будет работать. Или нет ?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 23.03.2013, 17:46   #27
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

О, нет конечно. Классы лучше изначально делать, позже тоже можно, но рискуете потратить время и не собрать нормально.
Вот сейчас когда базовый принцип движения опробован, как раз удачный момент делать классы.
Советую перечитать теорию и постараться сделать базовую функциональность на классах.
Класс карты можно написать отдельно (хотя я бы сам ещё написал класс клетки, но можно ограничиться и простым признаком типа клетки), а классы преграды и машинки - в иерархии, один предок "объект на карте"и 2 объекта потомка - машинка и преграда, у них общие свойства класса - координаты на карте, реальные(вещественные) и в клектах. По клеткам делается проверка - наезд машинки в клетку с препятствием - будет проверяться просто сравнением координат клеток, а перемещение машинки во времени - по реальным координатам. Функция отрисовки будит просто по округленным реальным координатам выводить на экран , (а если бы был скроллинг карты, то нужен ещё расчёт сколько проскролено, чтобы правильно выводить объекты по пиксельным координатам).

Лично я бы ещё завёл класс менеджера игры - который бы хранил все игровые сущности и общался с формой один, а не через несколько разрозненных классов.
Также исходя из задачи можно сделать класс трассы - она бы хранила список точек, а также что-то вспомогательное, например, запрет случая постановки отрезка трассы через клетку с препятствием.
phomm вне форума Ответить с цитированием
Старый 23.03.2013, 18:20   #28
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Цитата:
Класс карты можно написать отдельно (хотя я бы сам ещё написал класс клетки, но можно ограничиться и простым признаком типа клетки)
Вот я сейчас задумался как сделать разбиение на клетки. И да преграду нарисовать на карте(самой картинке) или потом как-то присвоить каким-то клеткам "тип приграды"?
Кстати карта - обычная картинка загруженная в пикчербокс.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 23.03.2013, 22:06   #29
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Разбиение на клетки относительно просто - либо самому рассчитать и просто разлиновать пикчербокс, либо использовать датагрдвью, но как он с графической рисовкой - затрудняюсь сказать, не пробовал, но по идее должен.
Каждая клетка будет иметь тип, это можно хранить в виде массива в классе карты, при отрисовке по типу делать соответствующий рисунок, при прохождении машинки - соответственно менять ей характеристики.
phomm вне форума Ответить с цитированием
Старый 23.03.2013, 23:51   #30
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

phomm, что-то не пойму почему код не работает как надо. Я ставлю первую точку по середине карты, а вторую выше правее. И оно двигает(рисует зеленым цветом) только по Х, т.е. по значение У он не изменят и выходит просто горизонтальная прямая.
Код:
        int i = 0;
        Point first;
        Point second;
        List<Point> carpos = new List<Point>();
        int fClick = 0;
        Graphics g;
        Pen p1 = new Pen(Color.Red, 4);
        Pen p2 = new Pen(Color.Green, 4);
        double v = 0.7, s, t;
        int dx, dy, ddx = 0, ddy = 0, cur=0;


        public Form1()
        {
            InitializeComponent();
        }

        private void startToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox1.Visible = true;
            g = pictureBox1.CreateGraphics();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (fClick == 0)
            {
                first.X = e.X;
                first.Y = e.Y;
                fClick++;
            }
            if (fClick == 1)
            {
                second.X = e.X;
                second.Y = e.Y;
                g.DrawLine(p1, first, second);
                fClick++;
            }
            if (fClick > 1)
            {
                first.X = second.X;
                first.Y = second.Y;
                second.X = e.X;
                second.Y = e.Y;
                g.DrawLine(p1, first, second);
            }

            carpos.Add(new Point(e.X, e.Y));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            if (cur == carpos.Count - 1)
                return;

            if (Math.Abs(carpos[cur].X + ddx - carpos[cur + 1].X) <= Math.Abs(dx) && Math.Abs(carpos[cur].Y + ddy - carpos[cur + 1].Y) <= Math.Abs(dy))
            {
                cur++;
                if (cur == carpos.Count - 1)
                    return; // финиш
                ddx = ddy = dx = dy = 0;
            }
            
            /*s = Math.Sqrt((carpos[0].X - carpos[1].X) * (carpos[0].X - carpos[1].X) + (carpos[0].Y - carpos[1].Y) * (carpos[0].Y - carpos[1].Y));
            //nStep y Serge
            t = Math.Round(s / v) + 1;
            dx = Convert.ToInt32((carpos[1].X - carpos[0].X) / t);
            dy = Convert.ToInt32((carpos[1].Y - carpos[0].Y) / t);
            ddx += dx;
            ddy += dy;
            //g.DrawLine(p2, carpos[0].X, carpos[0].Y, carpos[0].X + ddx, carpos[0].Y + ddy);
            */

            s = Math.Sqrt(Math.Pow(carpos[cur].X - carpos[cur + 1].X, 2) + Math.Pow(carpos[cur].Y - carpos[cur + 1].Y, 2));
            //nStep y Serge
            t = Math.Round(s / v) + 1;
            //dx = (carpos[cur + 1].X - carpos[cur].X) / t;
            //dy = (carpos[cur + 1].Y - carpos[cur].Y) / t;
            dx = Convert.ToInt32((carpos[1].X - carpos[cur].X) / t);
            dy = Convert.ToInt32((carpos[1].Y - carpos[cur].Y) / t);
            ddx += dx;
            ddy += dy;
            g.DrawLine(p2, carpos[cur].X, carpos[cur].Y, Convert.ToInt32(carpos[cur].X + ddx), Convert.ToInt32(carpos[cur].Y + ddy));

        }
Проблема в этой строчке. Здесь всегда 0.

Код:
dy = Convert.ToInt32((carpos[1].Y - carpos[0].Y) / t);
Спеши медленно.

Последний раз редактировалось asmars; 24.03.2013 в 02:24.
asmars вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление игрушечной машинкой с компьютера 8Observer8 C# (си шарп) 11 26.10.2012 17:27
Управление 2 экранами Alexandr555 Компьютерное железо 13 06.07.2011 22:30
Управление Костян 98 Общие вопросы Delphi 21 30.05.2011 16:31
Управление памятью ilham Операционные системы общие вопросы 2 17.12.2008 18:29