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

Поиск:

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


Новичок



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

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



изучаю С# !!! дошел доглавы про GDI+, но так и не пойму как сделать так что-бы двигался прямоугольник(и.т.д.) к примеру по событию таймера !!! типа как в тетрисе !!!
PM MAIL   Вверх
VisualProgrammerNET
Дата 10.12.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



суть:

- Прямоугольник в данном случае должен быть представлен классом с полями, символизирующими его координаты
- В классе "Прямоугольник" должен быть метод его отрисовки (с параметром типа Graphics), зависящий от координат
- На таймер ставишь перерисовку формы и шаг движения прямоугольника (перерисовка: метод Invalidate)
- Перекрываешь метод отрисовки (OnPaint). В новом методе вызываешь функцию отрисовки прямоугольника

 smile 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
sasha11
Дата 11.12.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть метод DrawRectangle - 

 e.Graphics.DrawRectangle(new pen(Color.Red),10,10,100,100);

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

а то как я не пробовалу меня не получается.

Это сообщение отредактировал(а) sasha11 - 11.12.2006, 16:49
PM MAIL   Вверх
ivashkanet
Дата 11.12.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



sasha11, лови. 
Но тут все сырое. Накидано за 5 минут
Код

public partial class Form1 : Form
    {
        private Timer _timer;
        private int _rectangleXPosition;


        public Form1()
        {
            InitializeComponent();

            _timer = new Timer();
            _timer.Interval = 300;
            _timer.Tick += new EventHandler(_timer_Tick);
            _timer.Start();
        }

        void _timer_Tick(object sender, EventArgs e)
        {
            _rectangleXPosition += 10;
            if (_rectangleXPosition > this.Width) _rectangleXPosition = 0;
            this.Invalidate();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Rectangle rec = new Rectangle(_rectangleXPosition,100,100,100);

            e.Graphics.DrawRectangle(Pens.Aqua, rec);
            
            base.OnPaint(e);
        }
    }

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


Новичок



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

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



>>Rectangle rec = new Rectangle(a, 100, 100, 100);
вот строчка - _rectangleXPosition, ПАСИбо то что надо было !!!
а то я знаю как вызвать метод DrawRectangle, а тупил не мог создать обЪект Rectangle, ПАСИБО БОЛЬШОЕ.
просто я недавно занимаюсь С#  и никак не мог понять,как двигать изображение!!!
PM MAIL   Вверх
Oxana
Дата 23.11.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня ситуация не много иная. Нужно так же передвигать фигуру, но фигура должна быть создана кистями(ну типа DrawElipse). Подскажите пожалуйста как я могу передвигать фигуру(можно пример). 
PM MAIL   Вверх
VisualProgrammerNET
Дата 23.11.2007, 14:36 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



ну, пример приводить не буду =) попробую немного рассказать о том, как это всё делается в принципе. Мой дебют в качестве учителя, так что не особо уж придирайтесь  smile  

ДИНАМИЧЕСКОЕ РИСОВАНИЕ С ПОМОЩЬЮ GDI+ ДЛЯ ЧАЙНИКОВ

Рассматривать движение некоего объекта нужно с точки зрения мультипликации. Мультфильм - это последовательность неких статических кадров, которые при быстрой смене друг друга заставляют некие объекты двигаться. Принцип рисования в C# такой же. 

Сперва определимся с частотой смены кадров (Frames per second, FPS). как и в любых компьютерных играх, FPS влияет на то, насколько плавно изменяется картинка на экране. Если сделать FPS слишком маленьким, то будут заметны рывки, с которыми движутся объекты. В большинстве случаев этого нам не надо. Но и большой FPS - палка о двух концах. При плавном изменении картинки мы сильнее загружаем процессор, а если в нашем "мультфильме" участвует большое количество объектов, то и сильно замусоривается оперативная память. Конечно, тут многое упирается в производительность компьютера, останавливаться на этом не будем.

Определившись с частотой смены кадров (допустим, 50 в секунду), надо это запрограммировать, поэтому первым делом мы кинем на форму таймер с интервалом равным 20 (Interval = 1000/FPS). Сразу не забудем установить свойство формы DoubleBuffered в true, чтобы она не моргала при частой перерисовке. Теперь мы должны сказать программе, чтобы она через каждые 20 тиков рисовала новый "кадр", поэтому по событию Timer_Tick() мы будем нашу форму перерисовывать (form.Invalidate()). Здесь и далее для наглядности можно смотреть на пример ivashkanet выше.

Следующим делом будет дело творческое - мы будем придумывать сюжет и рисовать кадр за кадром. Допустим, мы создаём высокобюджетный экшн "Движение закрашенного эллипса". По сюжету, эллипс движется слева направо по экрану и при достижении его края, возвращается к другому краю, продолжая движение. С сюжетом определились, пора придумывать героев. В данном случае он один - эллипс. Создаём класс CartoonHero, в котором опишем героя. У нашего героя должны быть минимум два параметра - координата Х и координата Y, плюс он должен уметь перемещать себя и рисовать себя на экране. Отсюда мы получаем два приватных поля типа int и два метода: MoveMe() и DrawMe(Graphics g), к примеру. 

Так как по сюжету эллипс движется горизонтально по экрану, то в методе MoveMe мы должны менять координату Х на некоторое число (X += некоторое число, зависящее от того, с какой скоростью вы хотите двигать эллипс). Плюс по сюжету герой должен возвращаться к левому краю экрана, когда достигнет правого, так что мы изменим метод MoveMe на MoveMe(int border), где в качестве border будем передавать ширину формы. Соответственно, добавляем простую проверку на X. Ну а метод отрисовки DrawMe - это просто рисование нашего героя-эллипса (g.FillEllipse...) с его текущими координатами.

На этом этапе мы закончили создание всех героев и можно приступать к реализации мультфильма. Как мы помним, по таймеру мы рисуем новый кадр. А каждым новым кадром по сюжету является эллипс, передвинутый на некоторое расстояние вперёд. Изменим событие Timer_Tick так, чтобы перед рисованием нового кадра герой мог передвинуться (само-собой нужно создать хотя бы одного героя перед этим (CartoonHero ch = new CartoonHero()). Перед строчкой this.Invalidate() мы будем вызывать метод MoveMe героя.

Завершающий штрих - сказать программе, как она должна отрисовывать каждый кадр. Для этого перегрузим метод OnPaint формы. В него достаточно добавить лишь метод DrawMe, в который в качестве параметра передаваться будет e.Graphics.

Теперь можно запускать программу и наслаждаться захватывающим творением собственного гения, на которое было потрачено столько сил и средств  smile 

Это сообщение отредактировал(а) VisualProgrammerNET - 23.11.2007, 14:48


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
thomas
Дата 23.11.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



VisualProgrammerNET, 
+1 жжешь  smile 
Такой талант пропадает. Мне б такого учителя по информатике в школу.
Толково так все обьяснил на простеньком сюжете. Главное сразу понятно о чём речь.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
VisualProgrammerNET
Дата 23.11.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


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

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



Благодарю =)))  smile 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Oxana
Дата 25.11.2007, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



VisualProgrammerNET, Извини пожалуйста, не мог бы ты подсказать как передвигать фигуру при помощи мышки. С готовыми объектами все просто, есть обработчик событий, а что делать с фигурами которые нарисованы кистями?

П.С.
За вышеприведенный урок БОЛЬШОЕ пасиба.

Это сообщение отредактировал(а) Oxana - 25.11.2007, 05:23
PM MAIL   Вверх
Experimenter
Дата 25.11.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Oxana, тебя перерисовка фигуры интересует или как фигуру мышью захватить?


--------------------
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   Вверх
Oxana
Дата 25.11.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Experimenter, Как фигуру мышью захватить.
PM MAIL   Вверх
Experimenter
Дата 26.11.2007, 08:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Oxana, 
Цитата

Experimenter, Как фигуру мышью захватить. 
В любом случае при рисовании фигуры ты задаешь ей координаты и размеры, которые можно сохранить; в любом случае при нажатии кнопки мыши есть событие MouseDown(object sender, MouseEventArgs e), где есть координаты мыши e.X, e.Y, которые можно сравнить с координатами фигуры; при движении мыши MouseMove(object sender, MouseEventArgs e) перерисовывать фигуру согласно новым координатам. Щас примерчик накидаю.


--------------------
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
Дата 26.11.2007, 09:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Oxana, смотри, но учти, что это всего лишь набросок.
Код

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

class MoveEllipse : Form
{
    Graphics g;
    int x, y;
    bool isEllipseRegion;

    static void Main()
    {
        Application.Run(new MoveEllipse());
    }

    public MoveEllipse()
    {
        Text = "Двигаем эллипс";
        BackColor = Color.Black;
        Paint += new PaintEventHandler(MoveEllipse_Paint);
        MouseDown += new MouseEventHandler(MoveEllipse_MouseDown);
        MouseMove += new MouseEventHandler(MoveEllipse_MouseMove);
        MouseUp += new MouseEventHandler(MoveEllipse_MouseUp);
    }

    void MoveEllipse_MouseUp(object sender, MouseEventArgs e)
    {
        isEllipseRegion = false;
    }

    void MoveEllipse_MouseMove(object sender, MouseEventArgs e)
    {
        if (isEllipseRegion)
        {
            x = e.X;
            y = e.Y;
            g = CreateGraphics();
            MoveEllipse_Paint(this, new PaintEventArgs(g, ClientRectangle));
        }
    }

    void MoveEllipse_MouseDown(object sender, MouseEventArgs e)
    {
        if ((e.X > x & e.X < (x + 20)) & (e.Y > y & e.Y < (y + 20)))
            isEllipseRegion = true;
    }

    void MoveEllipse_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.Clear(BackColor);
        g.FillEllipse(new SolidBrush(Color.Red), x, y, 20, 20);
    }
}



--------------------
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   Вверх
Oxana
Дата 27.11.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое ПАСИБА
PM MAIL   Вверх
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   Вверх
rolandxl
Дата 30.11.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Удалось прикрепить таки твой метод к моему коду, и по моему человечек остался таким же бессовестным. (один момент, в строке bg.Render(e.Graphics); насколькоя понимаю e.Graphics - это ведь просто событие вывода графики на форму? и необязательно передавать в рендеринг именно мой Graphics объект?). 
Сдаётся мне, что придется таки присобачивать таймер к проге для моментов вывода графики. Или довольствоваться тем что получилось.
Experimenter спасибо за посильную помощь, ты мне очень помог.
Цитата

у тебя на движение мыши обработчик наверное повешен, его посмотри. 

Да нет, зачем мне было его ставить. Может просто форма обновляется при движении со всеми последствиями? С этим буду бороться самостоятельно)

Это сообщение отредактировал(а) rolandxl - 1.12.2007, 21:39
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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