Перемещение изображения по форме - C#
Формулировка задачи:
Здравствуйте. Помогите пожалуйста решить такую задачу: Существуют несколько персонажей компьютерной игры, каждый из которых представлен совокупностью геометрических фигур на плоскости. Каждый персонаж может перемещаться влево, вправо, вверх и вниз. Каждый персонаж должен быть представлен отдельным классом. Каждому из движений персонажа должно соответствовать событие, с помощью которого извещаются все фигуры, из которых состоит персонаж, о том, что происходит перемещение. Для указания расстояния, на которое производится перемещение, использовать параметры события. В классе каждой фигуры реализовать метод-обработчик перемещения этой фигуры. Реализовать не менее двух экземпляров одного персонажа, состоящего из не менее 5 фигур. Реализовать перемещение обоих персонажей сначала влево на 10 единиц координат, затем вправо на 15 единиц координат, затем вверх на 20 единиц координат. Для каждого движения вывести на консоль информацию о всех фигурах, значениях их координат и персонаже, к которому относится данная фигура. Вывод этой информации производить из обработчика события перемещения фигуры.
Есть классы фигур:
В какую сторону дальше копать? Пытаюсь вникнуть в суть делегатов и ничего не получается. Натолкните пожалуйста на мысль.
//Точка
abstract class Point {
protected int xCo; //Координата по оси X
protected int yCo; //Координата по оси Y
public Point()
{
xCo = 0;
yCo = 0;
}
public int xCoordinate
{
set { xCo = value; }
get { return xCo; }
}
public int yCoordinate
{
set { yCo = value; }
get { return yCo; }
}
//Движение фигур
public virtual void move(int x, int y)
{
xCo += x;
yCo += y;
}
}
//Отрезок
class Line : Point {
private int x1Co;
private int y1Co;
public Line()
{
x1Co = 5;
y1Co = 0;
}
public int x1Coordinate
{
set { x1Co = value; }
get { return x1Co; }
}
public int y1Coordinate
{
set { y1Co = value; }
get { return y1Co; }
}
public override void move(int x, int y)
{
base.move(x, y);
x1Co += x;
y1Co += y;
}
}
//Прямоугольник
class Rectangle : Point {
protected int x1Co;
protected int y1Co;
public Rectangle()
{
x1Co = 5;
y1Co = 2;
}
public int x1Coordinate
{
set { x1Co = value; }
get { return x1Co; }
}
public int y1Coordinate
{
set { y1Co = value; }
get { return y1Co; }
}
public override void move(int x, int y)
{
base.move(x, y);
x1Co += x;
y1Co += y;
}
}
//Квадрат
class Square : Rectangle {
public Square()
{
x1Co = 5;
y1Co = 0;
}
}
//Круг
class Circle : Point {
private int r;
public Circle()
{
r = 5;
}
public int Radius
{
set { r = value; }
get { return r; }
}
}Решение задачи: «Перемещение изображения по форме»
textual
Листинг программы
class MovingEventArgs : EventArgs {
public Apex apex;
public int points;
public MovingEventArgs(int points, Apex apex) {
this.apex = apex;
this.points = points;
}
}
delegate void MoveEventHandler(object sender, MovingEventArgs e);
enum Apex {
Left, Rihght, Top, Down
}
interface IMovable {
void Move(int points, Apex apex);
string Name { get; }
Person Person { get; set; }
event MoveEventHandler OnMove;
}
abstract class Shape : IMovable {
Person person;
Point location;
string name;
public event MoveEventHandler OnMove;
public string Name {
get { return this.name; }
}
public void Move(int points, Apex apex) {
switch (apex) {
case Apex.Left:
this.location.x -= points;
break;
case Apex.Rihght:
this.location.x += points;
break;
case Apex.Top:
this.location.y -= points;
break;
case Apex.Down:
this.location.y += points;
break;
}
if (OnMove != null) {
OnMove(this, new MovingEventArgs(points, apex));
}
}
public Person Person {
get {
return this.person;
}
set {
this.person = value;
}
}
public Shape(string name, Point location) {
this.location = location;
this.name = name;
}
}
class Person {
List<IMovable> shapes;
public Person(List<IMovable> shapes) {
if (this.shapes == null) {
this.shapes = new List<IMovable>();
foreach (IMovable item in shapes) {
this.AddShape(item);
}
}
}
public void AddShape(IMovable shape) {
this.shapes.Add(shape);
shape.OnMove += new MoveEventHandler(shape_OnMove);
}
void shape_OnMove(object sender, MovingEventArgs e) {
foreach (IMovable item in this.shapes) {
if (item != (IMovable)sender) {
item.Move(e.points, e.apex);
}
}
}
public void RemoveByName(string name) {
for (int i = 0; i < this.shapes.Count; i++) {
if (this.shapes[i].Name == name) {
this.shapes.Remove(this.shapes[i]);
break;
}
}
}
}