Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> движение квадрата 
:(
    Опции темы
rolandxl
Дата 27.11.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Ответьте пожалуйста на такой вопрос : возможно ли коректно передвигать фигуры без использования таймера (с циклом for)? Просто проблема вот в чем, я  создал цикл просчёта движения и отрисовки фигуры, на каждом шаге цикла в конце стоит функция Invalidate,  однако  фигура оставляет за собой шлейф, который пропадает только после завершения всего цикла. Как вариант хотел закрашивать прямоугольник с фигурой на каждом шаге фоновым фрагментом, но реализовать не удалось.
Кто знает помогите пожалуйста, а то курсовик скоро сдавать надо 
PM MAIL   Вверх
ivashkanet
Дата 27.11.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



rolandxl, при перетаскивании вообще не нужен таймер! Где ты его нашел в коде Experimenter-?

Таймер нужен если ты программируешь движение без участия человека (типа мультик).

P.S. Но в любом случае тебе поможет выставить у формы DoubleBuffering = true
PM MAIL WWW ICQ   Вверх
Experimenter
Дата 27.11.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



rolandxl, иногда помогает graphics.Clear(this.BackColor); перед новой прорисовкой

Это сообщение отредактировал(а) Experimenter - 27.11.2007, 15:08


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
ivashkanet
Дата 27.11.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Цитата(ivashkanet @  27.11.2007,  14:58 Найти цитируемый пост)
rolandxl, при перетаскивании вообще не нужен таймер! Где ты его нашел в коде Experimenter-?

Звиняюсь, как-то тупанул. Почему-то просчитал перетаскивать а не перемещать :(
PM MAIL WWW ICQ   Вверх
rolandxl
Дата 27.11.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Experimenter graphics.clear(backcolor) поможет только если фон одноцветныйsmile у меня там картинка, и вся красота портится к сожалению
PM MAIL   Вверх
Experimenter
Дата 27.11.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



rolandxl, что тебе сказать? тащи свой код.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
rolandxl
Дата 27.11.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Код

public void MovingHorR(int Y, int From, int To, int Mashtab, int Step, Graphics graph)
        {
            int napr=0;
            int V = 100, H = 80;
            int End =Math.Abs(To - From);
            Size razmer = new Size(H,V);
            Point cen = new Point(0, 0);
           

            for (int i = 0; i < End; i = i + Step)
            {

                              
                razmer.Height = V/Mashtab;
                razmer.Width = H/Mashtab;


                GraphicsPath part = new GraphicsPath(new Point[] { new Point(1, 1), new Point(32, 54), new Point(33, 5) },
                new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Bezier }); 
                
                StartPoint.X = From + i;
                StartPoint.Y = Y-V/(2*Mashtab);
               Mat LL = new Mat();  // 

              
                RectangleF rect = new RectangleF(StartPoint, razmer);
             
            
         
               Rectangle rectI = new Rectangle(LL.Round(StartPoint.X),LL.Round(StartPoint.Y),razmer.Width, razmer.Height) ;
             
             
              
             
                
                float x1, y1, x2, y2, H1 = 32 / Mashtab, V1 =  32 / Mashtab,
                    H2 = 24 / Mashtab, V2 = 40 / Mashtab;
                x1 = rect.Location.X + 24 / Mashtab;
                y1 = rect.Location.Y; // Mashtab;
                x2 =  rect.Location.X + 28 / Mashtab;
                y2 =  rect.Location.Y + 32 / Mashtab;
                P3.X =  rect.Location.X + 40 / Mashtab;
                P3.Y =  rect.Location.Y + 40 / Mashtab;
                P6.X =  rect.Location.X + 60 / Mashtab;
                P6.Y =  rect.Location.Y + 56 / Mashtab;
                P7.X =  rect.Location.X + 56 / Mashtab;
                P7.Y =  rect.Location.Y + 64 / Mashtab;
                P8.X =  rect.Location.X + 36 / Mashtab;
                P8.Y =  rect.Location.Y + 68 / Mashtab;
                P9.X =  rect.Location.X + 44 / Mashtab;
                P9.Y =  rect.Location.Y + 68 / Mashtab;
                if (i % 15 == 0)
                    napr = 0;
                if (i % 15 == 15) napr = 1;
                if (napr == 0)
                {
                    P10.X =  rect.Location.X + (24 + i % 32) / Mashtab;
                    P13.X = rect.Location.X + (56 - i % 32) / Mashtab;

                }
                if (napr == 1)
                {
                    P10.X = rect.Location.X + (24 - i % 32) / Mashtab;
                    P13.X =  rect.Location.X + (56 + i % 32) / Mashtab;

                }
                P10.Y = rect.Location.Y + 100 / Mashtab;
                P11.Y =  rect.Location.Y + 100 / Mashtab;
                P12.Y =  rect.Location.Y + 100 / Mashtab;
                P13.Y =  rect.Location.Y + 100 / Mashtab;
              
                part.StartFigure();
                part.AddEllipse(x1, y1, H1, V1);
                part.AddEllipse(x2, y2, H2, V2);
                part.CloseFigure();
                 part.StartFigure();
                 part.AddLine(P3, P6);
                  part.CloseFigure();
                  part.AddLine(P6, P7);
                  part.AddLine(P7, P3);
                 part.CloseFigure();  
                part.AddLine(P8, P10);
                part.AddLine(P10, P8);
                part.AddLine(P8, P9);
                part.AddLine(P9, P13);
                part.AddLine(P13, P9);
                
                graph.DrawPath(pen, part);
                graph.FillPath(brush, part);
                
               
               Form1.ActiveForm.Invalidate(rectI);
                part.Dispose();
               
            }


        }
class Mat
    {
        public int Round(float a) //округление по избытку (DoubleToLong)
        {
            int i, Okrug = 0;
            for (i = 0; i < 800; i++)
            {
                if ((a > i) & (a < i + 2))
                {
                    Okrug = (i + 1);
                    break;
                }
                

            }
            return Okrug;
        }
    }


Это сообщение отредактировал(а) rolandxl - 27.11.2007, 21:42
PM MAIL   Вверх
Experimenter
Дата 28.11.2007, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



При первом взгляде на код создается впечатление, что он должен работать корректно, а шлейф возникает из-за того, что возможности системы не безграничны, слишком часто перерисовку делать приходится. Попробуй в начале цикла выставить
Код

System.Threading.Thread.Sleep(1000);
это одна секунда (двигай в сторону уменьшения с шагом по 100), если шлейф все-таки остается, тогда проблема в коде. Это в задании на курсовик прописано - не использовать таймеры?


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
rolandxl
Дата 28.11.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



не, это моя личная инициатива сделать без таймера (слишком тяжело связать его с выполнением всей проги, когда 3 класса обмениваются между собой данными ). Насчёт
Код

System.Threading.Thread.Sleep(1000); 
    
хорошая фишка,  пригодиться для замедления анимации. Но мою проблему не решает: даже когда чел очень медленно идёт, всё равно обновления не происходит + через некоторое время прога падает на строчке
Код

Form1.ActiveForm.Invalidate(rectI);

с сообщением 
Object reference not set to an instance of an object." видимо форма перестает быть активной
PM MAIL   Вверх
Experimenter
Дата 29.11.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



rolandxl, нарыл в МСДН:
Цитата

Remarks
Calling the Invalidate method does not force a synchronous paint; to force a synchronous paint, call the Update method after calling the Invalidate method. When this method is called with no parameters, the entire client area is added to the update region.
но очень уж коряво при этом перерисовка идет, я пробовал. Видимо другое решение надо искать.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
rolandxl
Дата 29.11.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Мне препод вот что предлагал: прежде чем рисовать человечка, копировать область фона, в которой мы хотим его рисовать, и после отрисовки закрывать ею его(вот как раз это у меня не получается сделать, обычный 
Код

graph.CopyFromScreen();
 как-то криво работает). По моим соображениям если это сделать то по идее после полного прохода человечка можно будет обновить форму для отчистки памяти.
Experimenter, что по этому поводу думешь?
PM MAIL   Вверх
Experimenter
Дата 29.11.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



rolandxl, препод хорошую идею подсказал, но как это осуществить технически? Щас почешем репу...


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Experimenter
Дата 29.11.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Чесание репы привело к такому варианту:
Код

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

class MovingObject : Form
{
    Image img = Image.FromFile("мойрисунок.jpg");
    static void Main()
    {
        Application.Run(new MovingObject());
    }

    public MovingObject()
    {
        Text = "Двигаем объект";
        ClientSize = new Size(609, 364); //это размеры моего рисунка точка жпг
        BackgroundImage = img;
        DoubleBuffered = true;
        MouseClick += new MouseEventHandler(MovingObject_MouseClick);
    }

    void MovingObject_MouseClick(object sender, MouseEventArgs e)
    {
        Graphics g = CreateGraphics();
        Rectangle rect;
        TextureBrush tb = new TextureBrush(img);
        for (int i = 0; i < 100; i++)
        {
            System.Threading.Thread.Sleep(50);
            rect = new Rectangle(i, i, 40, 40);
            g.FillRectangle(tb, ClientRectangle);
            g.FillEllipse(Brushes.Aquamarine, rect);
        }
        g.Dispose();
    }
}
иногда правда двигаемый объект бессовестно мыргает несмотря на DoubleBuffered = true;
Можно еще попробовать BufferedGraphics конечно, как здесь, отпиши, что вышло.


Это сообщение отредактировал(а) Experimenter - 29.11.2007, 18:38


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
rolandxl
Дата 29.11.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Всё класс, код нормально покатил, спасибо, моргания хоть и есть но уже не такие ощутимые как были у меня. В строчке 
Код

g.FillRectangle(tb, ClientRectangle);
 заменил ClientRectangle (у тебя браш кисть вроде заполняла всю форму ) на rect и вроде как даже прога падать перестала пока мышкой двигать не начну smile (кстати есть-ли лекарство?)
Из куба пробовал способ, но особо разбираться и экспериментировать времени не было. Вышло следующее: Все построения и просчеты происходят, но вывода графики нет. вот код
Код

public void MovingHorR(int Y, int From, int To, int Mashtab, int Step)
        {
            int napr=0;
            int V = 100, H = 80;
            int End =Math.Abs(To - From);
            Size razmer = new Size(H,V);
            Point cen = new Point(0, 0);
           Image pers =  Image.FromFile("C:\\pers.jpg");
            TextureBrush tb = new TextureBrush(pers);

            BufferedGraphicsContext bgc;
            BufferedGraphics graph;
            bgc = BufferedGraphicsManager.Current;
            bgc.MaximumBuffer = new Size(Form1.ActiveForm.Width, Form1.ActiveForm.Height);
            graph = bgc.Allocate(Form1.ActiveForm.CreateGraphics(), new Rectangle(0, 0, Form1.ActiveForm.Width, Form1.ActiveForm.Height));
           // Graphics graph = Form1.ActiveForm.CreateGraphics();
            for (int i = 0; i < End; i = i + Step)
            {
                
                System.Threading.Thread.Sleep(50);             
                razmer.Height = V/Mashtab;
                razmer.Width = H/Mashtab;


                GraphicsPath part = new GraphicsPath(new Point[] { new Point(1, 1), new Point(32, 54), new Point(33, 5) },
                new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Bezier }); 
                
                StartPoint.X = From + i;
                StartPoint.Y = Y-V/(2*Mashtab);
                 Mat LL = new Mat();

             
                RectangleF rect = new RectangleF(StartPoint, razmer);
             
            
               
               Rectangle rectI = new Rectangle(i,LL.Round(StartPoint.Y),razmer.Width, razmer.Height) ;
               
            
               graph.Graphics.FillRectangle(tb, rect);
                //graph.FillRectangle(tb, rect);    //Form1.ActiveForm.ClientRectangle);
             //  graph.FillEllipse(Brushes.Aquamarine, rect);
                
                float x1, y1, x2, y2, H1 = 32 / Mashtab, V1 =  32 / Mashtab,
                    H2 = 24 / Mashtab, V2 = 40 / Mashtab;
                x1 = rect.Location.X + 24 / Mashtab;
                y1 = rect.Location.Y; // Mashtab;
                x2 =  rect.Location.X + 28 / Mashtab;
                y2 =  rect.Location.Y + 32 / Mashtab;
                P3.X =  rect.Location.X + 40 / Mashtab;
                P3.Y =  rect.Location.Y + 40 / Mashtab;
                //P4.X = (rect.Location.X + 12) / Mashtab;
               // P4.Y =  (rect.Location.Y + 24) / Mashtab;
               // P5.X =  (rect.Location.X + 10) / Mashtab;
                //P5.Y =  (rect.Location.Y + 32) / Mashtab;
                P6.X =  rect.Location.X + 60 / Mashtab;
                P6.Y =  rect.Location.Y + 56 / Mashtab;
                P7.X =  rect.Location.X + 56 / Mashtab;
                P7.Y =  rect.Location.Y + 64 / Mashtab;
                P8.X =  rect.Location.X + 36 / Mashtab;
                P8.Y =  rect.Location.Y + 68 / Mashtab;
                P9.X =  rect.Location.X + 44 / Mashtab;
                P9.Y =  rect.Location.Y + 68 / Mashtab;
                if (i % 15 == 0)
                    napr = 0;
                if (i % 15 == 15) napr = 1;
                if (napr == 0)
                {
                    P10.X =  rect.Location.X + (24 + i % 32) / Mashtab;
                    P13.X = rect.Location.X + (56 - i % 32) / Mashtab;

                }
                if (napr == 1)
                {
                    P10.X = rect.Location.X + (24 - i % 32) / Mashtab;
                    P13.X =  rect.Location.X + (56 + i % 32) / Mashtab;

                }
                P10.Y = rect.Location.Y + 100 / Mashtab;
                P11.Y =  rect.Location.Y + 100 / Mashtab;
                P12.Y =  rect.Location.Y + 100 / Mashtab;
                P13.Y =  rect.Location.Y + 100 / Mashtab;
              
                part.StartFigure();
                part.AddEllipse(x1, y1, H1, V1);
                part.AddEllipse(x2, y2, H2, V2);
                part.CloseFigure();
                 part.StartFigure();
                 part.AddLine(P3, P6);
                  part.CloseFigure();
                  part.AddLine(P6, P7);
                  part.AddLine(P7, P3);
                 part.CloseFigure();  
                part.AddLine(P8, P10);
                part.AddLine(P10, P8);
                part.AddLine(P8, P9);
                part.AddLine(P9, P13);
                part.AddLine(P13, P9);
                
                graph.Graphics.DrawPath(pen, part);
                graph.Graphics.FillPath(brush, part);
                
               
              
                part.Dispose();
              
            }
           
            graph.Dispose();
        }

PM MAIL   Вверх
Experimenter
Дата 30.11.2007, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Код

    protected override void OnPaint(PaintEventArgs e)
    {
        bg.Render(e.Graphics);
    }
а это вставил? то есть необязательно в этом виде, но Рендер должен в коде присутствовать
Цитата

вроде как даже прога падать перестала пока мышкой двигать не начну smile (кстати есть-ли лекарство?)
у тебя на движение мыши обработчик наверное повешен, его посмотри.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.