![]() |
|
Модераторы: gambit, Partizan |
![]()
|
|
| sasha11 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.9.2006 Репутация: нет Всего: нет |
изучаю С# !!! дошел доглавы про GDI+, но так и не пойму как сделать так что-бы двигался прямоугольник(и.т.д.) к примеру по событию таймера !!! типа как в тетрисе !!!
|
|||
|
||||
| VisualProgrammerNET |
|
|||
![]() Почётный халявщик ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.10.2005 Где: Зеленоград Репутация: 1 Всего: 6 |
суть:
- Прямоугольник в данном случае должен быть представлен классом с полями, символизирующими его координаты - В классе "Прямоугольник" должен быть метод его отрисовки (с параметром типа Graphics), зависящий от координат - На таймер ставишь перерисовку формы и шаг движения прямоугольника (перерисовка: метод Invalidate) - Перекрываешь метод отрисовки (OnPaint). В новом методе вызываешь функцию отрисовки прямоугольника -------------------- 3 ГОДА НА |
|||
|
||||
| sasha11 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.9.2006 Репутация: нет Всего: нет |
есть метод DrawRectangle -
e.Graphics.DrawRectangle(new pen(Color.Red),10,10,100,100); как мне сделать что-бы этот созданый прямоугольник, двигался ??? желательно на примере. а то как я не пробовалу меня не получается. Это сообщение отредактировал(а) sasha11 - 11.12.2006, 16:49 |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 11 Всего: 149 |
sasha11, лови.
Но тут все сырое. Накидано за 5 минут
|
|||
|
||||
| sasha11 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 19.9.2006 Репутация: нет Всего: нет |
>>Rectangle rec = new Rectangle(a, 100, 100, 100);
вот строчка - _rectangleXPosition, ПАСИбо то что надо было !!! а то я знаю как вызвать метод DrawRectangle, а тупил не мог создать обЪект Rectangle, ПАСИБО БОЛЬШОЕ. просто я недавно занимаюсь С# и никак не мог понять,как двигать изображение!!! |
|||
|
||||
| Oxana |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 11.5.2007 Репутация: нет Всего: нет |
У меня ситуация не много иная. Нужно так же передвигать фигуру, но фигура должна быть создана кистями(ну типа DrawElipse). Подскажите пожалуйста как я могу передвигать фигуру(можно пример).
|
|||
|
||||
| VisualProgrammerNET |
|
|||
![]() Почётный халявщик ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.10.2005 Где: Зеленоград Репутация: 1 Всего: 6 |
ну, пример приводить не буду =) попробую немного рассказать о том, как это всё делается в принципе. Мой дебют в качестве учителя, так что не особо уж придирайтесь
ДИНАМИЧЕСКОЕ РИСОВАНИЕ С ПОМОЩЬЮ 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. Теперь можно запускать программу и наслаждаться захватывающим творением собственного гения, на которое было потрачено столько сил и средств Это сообщение отредактировал(а) VisualProgrammerNET - 23.11.2007, 14:48 -------------------- 3 ГОДА НА |
|||
|
||||
| thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 1 Всего: 65 |
VisualProgrammerNET,
+1 жжешь Такой талант пропадает. Мне б такого учителя по информатике в школу. Толково так все обьяснил на простеньком сюжете. Главное сразу понятно о чём речь. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
| VisualProgrammerNET |
|
|||
![]() Почётный халявщик ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.10.2005 Где: Зеленоград Репутация: 1 Всего: 6 |
Благодарю =)))
-------------------- 3 ГОДА НА |
|||
|
||||
| Oxana |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 11.5.2007 Репутация: нет Всего: нет |
VisualProgrammerNET, Извини пожалуйста, не мог бы ты подсказать как передвигать фигуру при помощи мышки. С готовыми объектами все просто, есть обработчик событий, а что делать с фигурами которые нарисованы кистями?
П.С. За вышеприведенный урок БОЛЬШОЕ пасиба. Это сообщение отредактировал(а) Oxana - 25.11.2007, 05:23 |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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"); } |
|||
|
||||
| Oxana |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 11.5.2007 Репутация: нет Всего: нет |
Experimenter, Как фигуру мышью захватить.
|
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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"); } |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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"); } |
|||
|
||||
| Oxana |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 11.5.2007 Репутация: нет Всего: нет |
Большое ПАСИБА
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |