Модераторы: 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   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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