Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Белорусский Государственный Университет Информатики и Радиоэлектроники
Кафедра «Информатика»
Пояснительная записка к курсовому проекту
по курсу ООП
На тему
«Разработка компьютерной игры»
Выполнил
Студент группы 702021
Дядькин С.В
Минск, 2011г.
Задание
Разработать компьютерную игру и выполнить следующие требования:
Должно быть разработано и реализовано множество классов. Построить работу ООП программы на функционировании и взаимодействии объектов различных классов.
Введение
Более 90 % современных детей и множество взрослых играют в видеоигры.
Но так ли они полезны, как говорят? Что касается взрослых, то они сами в состоянии решить, нужны им эти игры или нет. Многих компьютерные игры просто спасают, так как помогают пережить тяжёлое время (особенно во время болезни) или стресс, когда рядом никого из близких людей нет. Но как быть с детьми? На самом ли деле видеоигры их развивают, а если это так, то сколько времени им можно уделять без ущерба для гармоничного развития детей и подростков?
США (университет штата Иллинойс) такие же опыты провели с людьми старше 60 лет. И оказалось, что для них видеоигры полезны - они способствуют улучшению рабочей (кратковременной) памяти, ускоряют мозговую деятельность и т.д.
А как быть с детьми? Этим вопросом даже занимался Европейский парламент, настолько его достали предупреждения педагогов, психологов и других специалистов. И что вы думаете? Европарламент не нашёл доказательств того, что видеоигры вредны для детей. По мнению европарламентариев, даже жестокие игры полезны для детей. Многие игры развивают стратегическое, творческое, нестандартное мышление, а групповые игры учат взаимодействию между людьми.
Однако психологи не пришли к единому мнению о влиянии видеоигр на детей. Некоторые из них считают, что такие игры провоцируют агрессию. По мнению других, многие игры помогают развивать как умственные способности, так и социальные навыки. Возможно, как всегда, правы и те, и другие. В то же время учёные с тревогой отмечают признаки зависимости подростков в возрасте от 8 до 18 лет от видеоигр, похожей на наркотическую, что негативно влияет на другие стороны их личной жизни.
Видеоигры могут развлекать и развивать ребёнка. Однако они отнимают время, которое он мог бы потратить на другие занятия. По данным исследований, проведенных в России, подростки, увлекающиеся видеоиграми, тратят на домашние задания примерно на 40 % меньше времени, чем это было бы нужно, а на чтение - на 30 % меньше времени. Поэтому дело родителей - регулировать время, которое дети проводят за видеоиграми.
Таким образом, видеоигры могут быть полезными, а могут и навредить. Если дети занимаются ими в разумных пределах, это способствует, наряду с другой их деятельностью, умственному развитию и помогает усваивать новые навыки. Прежде всего, ребёнок приобретает и совершенствует навыки работы с компьютером, что пригодится ему при дальнейшем обучении. Правильно подобранные видеоигры развивают у детей мышление, внимание и логику, память и способность принимать решения. Управление видеоигрой улучшает координацию движений ребёнка. Обучающие игры помогают подготовить его к школе. Групповые видеоигры учат терпению и взаимодействию в группе. Некоторые игры развивают творческое воображение.
В то же время нужно приучать ребёнка больше читать книги и чаще бывать на свежем воздухе. Нужно помнить, что чрезмерное увлечение видеоиграми сдерживает развитие лобных долей мозга, отвечающих за логичное поведение и интеллектуальные способности. Так что всё хорошо в меру.
Так что научно-технический прогресс - это хорошо, если правильно его использовать.
компьютерная игра буферизация
Обзор существующих программных продуктов
Игр типа tower defence множество. Задача в таких играх, как правило, сводится к защите своего замка, дворца, базы от врагов путем расстановки оборонительных сооружений (башни, стены и т.д.) С каждым уровнем враги становятся все сильнее и сильнее. Защитные башни тоже можно модернизировать, покупать новые, ставить на них более мощные орудия. Отбить атаку можно обычно только путем правильной расстановки башен в определенных местах.
Как правило, существующие игры привязаны к средневековым и современным военным сценариям.
В разрабатываемом проекте предлагается расширить границы существующих проектов до космического пространства - и соответственно опробовать перспективные средства поражения.
Поле боя - космическое пространство, перспективные средства защиты лазерные батареи различной мощности, в качестве модели армии вторжения выбраны объекты, у которых возможны самые невероятные летные и огневые характеристики (НЛО).
Что касается трасс движения армии нападения - то генерация случайным образом набора промежуточных контрольных точек трассы для каждого объекта (или волны нападения объектов) позволяет разнообразить сценарий игры.
Разработка программного продукта
Анализ поставленной задачи
Задача курсового проекта создать игру при этом создать ряд классов, объекты которых будут взаимодействовать между собой. Графический интерфейс игры должен удовлетворять современным требованиям к подобным проектам.
В реализованном проекте можно расширять количество классов, порождая классы наследники от классов Tower и SpaceShip, тем самым увеличивая разнообразие, как средств нападения, так и средств защиты.
Математическая модель, положенная в основу проекта.
Основная сложность при реализации проекта - это движение объекта по сложной траектории.
В качестве модели траектории выбрана ломанная кривая, позволяющая адекватно представить сколь угодно сложную траекторию движения достаточно простой математической моделью. Рассмотрим отдельный участок ломанной кривой:
Объект движется по участку от до с шагом .
Программная модель курсового проекта
Для улучшения отображения игровых объектов на экране монитора использовалась двойная буферизация. Проясним некоторые специфические термины связанные с двойной буферизацией.
Рендеринг- это процесс подготовки, выдачи (прорисовки) изображения на экран. В общем, это все действия, которые связаны с выдачей картинки на экран.
Буфер - это область для временного хранения данных.
Двойная буферизация- это один из способов рендеринга, при котором существует два буфера. Содержимое первого (переднего) буфера (front buffer) показываеться на экран и вы видите какое то изображение. В это время на заднем буфере (back buffer) подготавливается следующий кадр (рисуется). Когда кадр на заднем буфере готов, тогда передний и задний буфер меняются местами. И затем все это повторяется. С помощью такой технологии избегается мерцание экрана.
В проекте используется следующая система классов (на схемах указаны лишь основные классы и основные атрибуты и функции):
Логика взаимодействия игровых объектов реализована в функциях событиях windows-формы.
Контроль качества курсового проекта
Разрабатываемый проект должен обладать следующими примитивами качества:
Завершенность (completeness) − свойство, характеризующее степень обладания ПС всеми необходимыми частями и чертами, требующимися для выполнения своих явных и неявных функций.
Автономность (self-containedness) − свойство, характеризующее способность ПС выполнять предписанные функции без помощи или поддержки других компонент программного обеспечения.
Коммуникабельность (communicativeness) − свойство, характеризующее степень, в которой ПС облегчает задание или описание входных данных, и способность выдавать полезные сведения в достаточно простой форме и с простым для понимания содержанием.
Временная эффективность (time efficiency) − мера, характеризующая способность ПС выполнять возложенные на него функции в течение определенного отрезка времени.
Структурированность (structuredness) − свойство, характеризующее программы ПС с точки зрения организации взаимосвязанных их частей в единое целое определенным образом (например, в соответствии с принципами структурного программирования).
Удобочитаемость (readability) − свойство, характеризующее легкость восприятия текста программ ПС (отступы, фрагментация, форматированность).
Расширяемость (augmentability) − свойство, характеризующее способность ПС к использованию большего объема памяти для хранения данных или расширению функциональных возможностей отдельных компонент.
Модифицируемость (modifiability) − мера, характеризующая ПС с точки зрения простоты внесения необходимых изменений и доработок на всех этапах и стадиях жизненного цикла ПС.
Модульность (modularity) − свойство, характеризующее ПС с точки зрения организации его программ из таких дискретных компонент, что изменение одной из них оказывает минимальное воздействие на другие компоненты.
В процессе разработки использовался метод нисходящей отладки, т. е. в процессе разработки тестировался каждый добавляемый класс или функция в порядке их добавления в проект. Таким образом, была реализована автономная отладка программы. Далее была проведена комплексная отладка программного средства - тестировался весь сценарий игры от начала и до конца, с одновременной балансировкой первичной экономической модели игры.
Использование программного продукта
Руководство пользователя
В процессе игры возможна как предварительная расстановка башен, так и расстановка их в ходе атаки НЛО - для этого используется кнопка «Башня», с последующим указание мышью позиции установки башни.
Для улучшения характеристик огневой точки используется следующий алгоритм - выделение мышью башни, а затем кнопками “Огонь” и “Радиус” улучшаются соответствующие характеристики огневой точки.
Кнопка “Старт” используется для запуска очередной волны нападения.
Экономическая модель достаточно проста - установка и модернизация лазерных батарей требует определенных ресурсов. В начале игры доступно ограниченное количество ресурсов, которое в процессе игры пополняется после уничтожения атакующих НЛО.
Цель игры защитить лазерными батареями Землю от бомбардировок со стороны НЛО.
Руководство программиста
Приложение Dreaming of Space является типичным приложением-формой Windows.
В качестве среды разработки использовалась Microsoft Visual Studio 2008. В качестве языка программирования для реализации проекта используется C#. Каждый класс, входящий в проект, реализован в отдельном файле.
Возможны следующие модификации программы :
1) Увеличение разнообразия средств защиты и нападения - путем ввода новых классов или классов наследников.
2) Дальнейшее развитие системы улучшений огневых точек.
) Меняя фон и графику объектов можно разнообразить сценарии игры.
Заключение
В результате реализации проекта была достигнута следующая цель - разработана легко модифицируемая игра типа tower defence (меняя фон и изображение объектов можно легко получить как средневековые сценарии защиты, так и современные с участием ПВО, артиллерии, танков и самолетов).
В ходе реализации проекта получены основательные навыки работы с инкапсуляцией данных. И можно сделать вывод, что во многих случаях механизм инкапсуляции существенно помогает упростить задачу программирования сложных систем.
Список используемой литературы
1. Жарков В. А., «Компьютерная графика, мультимедиа и игры на Visual C# 2005», Москва «Жарков пресс», 2005
2. Конспект лекций по курсу «Объектно-ориентированное программирование», БГУИР кафедра информатики
. А. А. Волосевич «Избранные главы информатики», Минск, БГУИР, кафедра информатики, 2006
Приложение A
Исходные коды:
using System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Drawing.Drawing2D;Dreaming_of_Space_2
{partial class Form1 : Form
{int x_MouseDown_1, y_MouseDown_1;
//защита солнечной системыOurPRO = new SolarPRO();
//планета ЗемляEarth = new Planet();
//формирование нашествияInvasionWave = new SpaceInvasion();Form1()
{();
}void Form1_Load(object sender, EventArgs e)
{.Enabled = true;.Interval = 50;
//Используем двойную буферизацию:.SetStyle(ControlStyles.OptimizedDoubleBuffer |.AllPaintingInWmPaint, true);.UfoInvasion = new[InvasionWave.MaxUfoQuantity];(int i = 0; i < InvasionWave.MaxUfoQuantity; i++).UfoInvasion[i] = new SpaceShip();
}void timer1_Tick(object sender, EventArgs e)
{.Clear();.AppendText(OurPRO.money.ToString());();
}void button1_Click(object sender, EventArgs e)
{((InvasionWave.CheckWaveIsDestroyed() == )&&(InvasionWave.current_number_invasion_wave>0)) return;.current_number_invasion_wave++;.money += 5000;.Enabled = true;.Interval = 2000;.CreateInvasionWave();.start_invasion = true;
}void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
//Определяем координаты указателя в момент нажатия кнопки:_MouseDown_1 = e.X; y_MouseDown_1 = e.Y;
}void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{ .DetectSelectObject(x_MouseDown_1, y_MouseDown_1);(OurPRO.CheckDistanse(x_MouseDown_1, y_MouseDown_1) == false) return;(OurPRO.set_tower_enabled == false) return;((OurPRO.DetectSelectObject(x_MouseDown_1, y_MouseDown_1) == false) && (OurPRO.money >= 2000))
{myGraphics = CreateGraphics();.SetNewTower(x_MouseDown_1, y_MouseDown_1, myGraphics);= Cursors.Arrow;
}
}bool OpenFire(PaintEventArgs e)
{myPen = new Pen(Color.Red, 1);(int j = 0; j < InvasionWave.CurrentInvasionQuantity; j++)(int i = 0; i < OurPRO.TowerQuantity; i++)
{((InvasionWave.UfoInvasion[j].pos_of_ufo_x - .ProSolarSys[i].Pos.X) *
(InvasionWave.UfoInvasion[j].pos_of_ufo_x - .ProSolarSys[i].Pos.X) +
(InvasionWave.UfoInvasion[j].pos_of_ufo_y - .ProSolarSys[i].Pos.Y) *
(InvasionWave.UfoInvasion[j].pos_of_ufo_y - .ProSolarSys[i].Pos.Y)
< OurPRO.ProSolarSys[i].fire_distance * .ProSolarSys[i].fire_distance)
{(InvasionWave.UfoInvasion[j].armor <= 0)
{.money += InvasionWave.UfoInvasion[j].cargo;.UfoInvasion[j].cargo = 0;;
}.Graphics.DrawLine(myPen, OurPRO.ProSolarSys[i].Pos.X, .ProSolarSys[i].Pos.Y,.UfoInvasion[j].pos_of_ufo_x, InvasionWave.UfoInvasion[j].pos_of_ufo_y);
//нанесение повреждений.UfoInvasion[j].armor = InvasionWave.UfoInvasion[j].armor - .ProSolarSys[i].damage;
}
}true;
}void pictureBox1_Paint(object sender, PaintEventArgs e)
{mySpace = new Bitmap(@"d:\solar_system_bg.bmp");.Graphics.DrawImage(mySpace, 0, 0);.DrawInvasion(e, Earth);
//перепрорисовка башен(int i = 0; i < OurPRO.TowerQuantity; i++).ProSolarSys[i].SetTower(OurPRO.ProSolarSys[i].Pos.X, OurPRO.ProSolarSys[i].Pos.Y, e.Graphics);
//прорисовка жизни планеты.Draw_Planet_life(e);(Earth.planet_life <= 0)
{.Stop();.Stop();.Show("Сражение проиграно", "Но решающие сражения впереди!",.OK, MessageBoxIcon.Warning);
//Application.Exit();
}
//ведение огня(e);
}void button2_Click(object sender, EventArgs e)
{(OurPRO.TowerQuantity < OurPRO.MaxTowerQuantity)
{.set_tower_enabled = true;= Cursors.Cross;
}
}void button4_Click(object sender, EventArgs e)
{(int i = 0; i < OurPRO.TowerQuantity; i++)((OurPRO.ProSolarSys[i].select == true) &&
(OurPRO.ProSolarSys[i].fire_distance < OurPRO.max_fire_distance) &&
(OurPRO.money >= 300))
{.ProSolarSys[i].fire_distance += 5;.money -= 300;
}
}void button3_Click(object sender, EventArgs e)
{(int i = 0; i < OurPRO.TowerQuantity; i++)((OurPRO.ProSolarSys[i].select == true)
&& (OurPRO.ProSolarSys[i].damage < OurPRO.max_damage)
&& (OurPRO.money >= 300))
{.ProSolarSys[i].damage += 1;.money -= 300;
}
}void timer2_Tick(object sender, EventArgs e)
{(InvasionWave.UfoQuantity < InvasionWave.CurrentInvasionQuantity).UfoQuantity++;
}void button2_Click_1(object sender, EventArgs e)
{(OurPRO.TowerQuantity < OurPRO.MaxTowerQuantity)
{(OurPRO.set_tower_enabled == true)
{.set_tower_enabled = false;= Cursors.Arrow;
}
{.set_tower_enabled = true;= Cursors.Cross;
}
}
}System;System.Collections.Generic;System.Linq;System.Text;System.Drawing.Drawing2D;System.Drawing;System.ComponentModel;System.Data;System.Windows.Forms;Dreaming_of_Space_2
{class SolarPRO
{int money = 5000;int max_fire_distance = 50;int max_damage = 5;bool set_tower_enabled = false;
//Про солнечной системыint MaxTowerQuantity = 50;Tower[] ProSolarSys = new Tower[50];int TowerQuantity = 0;bool DetectSelectObject(int x_MouseDown_1, int y_MouseDown_1)
{ret_val = false;(int i = 0; i < TowerQuantity; i++)
{((x_MouseDown_1 - ProSolarSys[i].Pos.X) * (x_MouseDown_1 - ProSolarSys[i].Pos.X) +
(y_MouseDown_1 - ProSolarSys[i].Pos.Y) * (y_MouseDown_1 - ProSolarSys[i].Pos.Y) < 25)
{[i].select = true;_val = true;
}ProSolarSys[i].select = false;
}ret_val;
}bool CheckDistanse(int x_MouseDown_1, int y_MouseDown_1)
{(int i = 0; i < TowerQuantity; i++)
{((x_MouseDown_1 - ProSolarSys[i].Pos.X) * (x_MouseDown_1 - ProSolarSys[i].Pos.X) +
(y_MouseDown_1 - ProSolarSys[i].Pos.Y) * (y_MouseDown_1 - ProSolarSys[i].Pos.Y) < 900)false;
}true;
}bool SetNewTower(int x_MouseDown_1, int y_MouseDown_1, Graphics myGraphics)
{
//Graphics myGraphics = CreateGraphics();NewTower = new Tower();.Pos.X = x_MouseDown_1;.Pos.Y = y_MouseDown_1;[TowerQuantity] = NewTower;[TowerQuantity].SetTower(x_MouseDown_1, y_MouseDown_1, myGraphics);-= 2000;++;_tower_enabled = false;true;
}
}
}System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Drawing.Drawing2D;Dreaming_of_Space_2
{class SpaceInvasion
{bool start_invasion = false;int current_number_invasion_wave = 0; //номер волны нашествияint max_number_invasion_wave = 20;
//Корабли нашествияint MaxUfoQuantity = 20;
//public SpaceShip[] UfoInvasion = new SpaceShip[20];SpaceShip[] UfoInvasion;int UfoQuantity = 1; //колличество кораблей вышедших из подпространстваint CurrentInvasionQuantity = 1;bool DrawInvasion(PaintEventArgs e, Planet Earth)
{
//прорисовка кораблей нашествия(start_invasion == true)(int i = 0; i < UfoQuantity; i++)
{(UfoInvasion[i].armor >= 0)(UfoInvasion[i].CalculateTrace() == true)
{[i].Redraw_Ufo(e);[i].UfoOpenFire(e, Earth);
}
}true;
}bool CreateInvasionWave()
{(current_number_invasion_wave > max_number_invasion_wave)
{.Show("Космос наш", "Победа!",.OK, MessageBoxIcon.Exclamation);false;
}= 1;_invasion = false;= current_number_invasion_wave;(int i = 0; i < MaxUfoQuantity; i++)
{[i].max_armor = 100 * current_number_invasion_wave;[i].armor = UfoInvasion[i].max_armor;[i].cargo = 100 * current_number_invasion_wave;[i].fire_power = 1000 * current_number_invasion_wave;[i].critical_damage = 10 + current_number_invasion_wave;[i].SpaceTrace1.GetRandomTrace();[i].InitTrace();
}true;
}bool CheckWaveIsDestroyed()
{count = 0;(int i = 0; i < CurrentInvasionQuantity; i++)
{((UfoInvasion[i].armor <= 0) || (UfoInvasion[i].CalculateTrace() == false))++;
}(count == CurrentInvasionQuantity) return true;return false;
}
}
}System;System.Collections.Generic;System.Linq;System.Text;System.Drawing.Drawing2D;System.Drawing;System.Windows.Forms;Dreaming_of_Space_2
{class SpaceShip
{int armor=100;int max_armor = 100;int cargo = 100;int speed=2;string ship_type;int critical_damage = 10;int fire_power = 1000;
//создаем форватер для кораблейSpaceTrace SpaceTrace1 = new SpaceTrace();int pos_of_ufo_x, pos_of_ufo_y; int index=0, posX, posY;double dl, x1, x2, y1, y2;SpaceShip() { pos_of_ufo_x = SpaceTrace1.way[0, 0]; pos_of_ufo_y = SpaceTrace1.way[0, 1]; }
//оптимальный вариант случайная генерация трассы в виде ломаной кривойbool InitTrace()
{_of_ufo_x = SpaceTrace1.way[0, 0]; pos_of_ufo_y = SpaceTrace1.way[0, 1]; index = 0; dl = 0;true;
}bool CalculateTrace()
{(index == SpaceTrace1.way.GetLength(0) - 1) return false;
//движение корабля по траектории= dl + speed;= pos_of_ufo_x;= pos_of_ufo_y;
//курс= SpaceTrace1.way[index, 0];= SpaceTrace1.way[index, 1];= SpaceTrace1.way[index + 1, 0];= SpaceTrace1.way[index + 1, 1];
//расчет перемещенияtmp_x = 0, tmp_x1, tmp_x2, tmp_y;_x1 = x1 + dl * (x2 - x1) / System.Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));_x2 = x1 - dl * (x2 - x1) / System.Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));((x2 - x1 >= 0) && (tmp_x1 > x1)) tmp_x = tmp_x1;((x2 - x1 >= 0) && (tmp_x2 > x1)) tmp_x = tmp_x2;((x2 - x1 < 0) && (tmp_x1 < x1)) tmp_x = tmp_x1;((x2 - x1 < 0) && (tmp_x2 < x1)) tmp_x = tmp_x2;(x2 - x1 == 0)
{(y2 - y1 < 0) { tmp_y = y1 - dl; tmp_x = x1; }{ tmp_y = y1 + dl; tmp_x = x1; }
}tmp_y = y1 + (tmp_x - x1) * (y2 - y1) / (x2 - x1);
//корректировка курса((x2 - x1 <= 0) && (y2 - y1 <= 0) && (posX <= x2)/* && (posY <= y2)*/) { index++; dl = 0; }((x2 - x1 > 0) && (y2 - y1 < 0) && (posX >= x2) /*&& (posY <= y2)*/) { index++; dl = 0; }((x2 - x1 >= 0) && (y2 - y1 >= 0) && (posX >= x2)/* && (posY >= y2)*/) { index++; dl = 0; }((x2 - x1 < 0) && (y2 - y1 > 0) && (posX <= x2) /*&& (posY >= y2)*/) { index++; dl = 0; }_of_ufo_x = (int)System.Math.Ceiling(tmp_x);_of_ufo_y = (int)System.Math.Ceiling(tmp_y);true;
}bool Redraw_Ufo(PaintEventArgs e)
{
//Создаем и рисуем летающую тарелку:(armor <= 0) return false;myRectangle1 = new Rectangle(Point(pos_of_ufo_x - 10, pos_of_ufo_y - 10),Size(20, 20));.Graphics.DrawRectangle(new Pen(Color.Transparent),);myBrush1;(armor > critical_damage)= new LinearGradientBrush(myRectangle1,.LightGreen, Color.DarkGreen,.Horizontal);= new LinearGradientBrush(myRectangle1,.Orange, Color.DarkRed,.Horizontal);.Graphics.FillEllipse(myBrush1, myRectangle1);myRectangle2 = new Rectangle(Point(pos_of_ufo_x - 5, pos_of_ufo_y - 5),Size(10, 10));.Graphics.DrawRectangle(new Pen(Color.Transparent),);myBrush2;(armor > critical_damage)= new LinearGradientBrush(myRectangle2,.LightGreen, Color.DarkGreen,.Horizontal);= new LinearGradientBrush(myRectangle2,.Orange, Color.DarkRed,.Horizontal);.Graphics.FillEllipse(myBrush2, myRectangle2);life = (int)System.Math.Ceiling((double)20*armor/max_armor); myPen = new Pen(Color.LightGreen, 2);.Graphics.DrawLine(myPen, pos_of_ufo_x - 10, pos_of_ufo_y - 15, pos_of_ufo_x - 10+life, pos_of_ufo_y - 15);true;
}bool UfoOpenFire(PaintEventArgs e, Planet TargetPlanet)
{target_x = TargetPlanet.pos_x, target_y = TargetPlanet.pos_y, target_R = TargetPlanet.R_orbit;((pos_of_ufo_x - target_x) * (pos_of_ufo_x - target_x) +
(pos_of_ufo_y - target_y) * (pos_of_ufo_y - target_y) < target_R*target_R)
{.planet_life -= fire_power;_power = 0;myPen = new Pen(Color.Red, 2);.Graphics.DrawLine(myPen, pos_of_ufo_x, pos_of_ufo_y,_x, target_y);true;
}false;
}
}
}System;System.Collections.Generic;System.Linq;System.Text;System.Drawing;System.Drawing.Drawing2D;Dreaming_of_Space_2
{class SpaceTrace
{int[,] way = { {873,672}, {270,670}, {630,500}, {864,330}, {860,97}, {536,260}, {404,241},
{350,295}, {197,366}, {25,660}};myGraphicsPath3 = new GraphicsPath();bool GetRandomTrace()
{rnd = new Random();(int i = 1; i < way.GetLength(0) - 1; i++)
{[i, 0] = rnd.Next(1,920);[i, 1] = rnd.Next(1,700);
}[7, 0] = 350;[7, 1] = 295;true;
}void DrawWay(Graphics myGraphics)
{[] points = new Point[way.GetLength(0)];(int i = 0; i < way.GetLength(0); i++)
{[i] = new Point(way[i, 0], way[i, 1]);
}.AddCurve(points);.DrawPath(new Pen(Color.White, 1),);
}
}
}System;System.Collections.Generic;System.Linq;System.Text;System.Drawing;System.Drawing.Drawing2D;System.Windows.Forms;Dreaming_of_Space_2
{class Tower
{int damage=1;Point Pos;int fire_distance=30;string FireType="laser";bool select=false;bool is_fire = false;bool SetTower(int x_MouseDown_1, int y_MouseDown_1, Graphics myGraphics)
{myPen = new Pen(Color.Black, 1);
// Graphics myGraphics = CreateGraphics();
//Создаем и рисуем огневую точку:myRectangle = new Rectangle(Point(x_MouseDown_1-5, y_MouseDown_1-5),Size(10, 10));.DrawRectangle(new Pen(Color.Transparent),);
//установка радиуса пораженияmyPen1 = new Pen(Color.Red, 1);.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;.DrawEllipse(myPen1, x_MouseDown_1 - fire_distance, y_MouseDown_1 - fire_distance,_distance * 2, fire_distance*2);myBrush;= new LinearGradientBrush(myRectangle,.White, Color.Black,.Horizontal);.FillEllipse(myBrush, myRectangle);
// Create string to draw.drawString = damage.ToString();
// Create font and brush.drawFont = new Font("Arial", 8);drawBrush = new SolidBrush(Color.Green);
// Create point for upper-left corner of drawing.x = Pos.X-15;y = Pos.Y-15;.DrawString(drawString, drawFont, drawBrush, x, y);(select == true) Select(myGraphics);true;
}bool Select(Graphics myGraphics)
{myPen = new Pen(Color.ForestGreen, 1);[] SelectPoints = new Point[3];[0].X=Pos.X-15;[0].Y=Pos.Y-10;[1].X=Pos.X-15;[1].Y=Pos.Y-15;[2].X=Pos.X-10;[2].Y=Pos.Y-15;.DrawLines(myPen, SelectPoints);[0].X = Pos.X + 10;[0].Y = Pos.Y - 15;[1].X = Pos.X + 15;[1].Y = Pos.Y - 15;[2].X = Pos.X + 15;[2].Y = Pos.Y - 10;.DrawLines(myPen, SelectPoints);[0].X = Pos.X + 15;[0].Y = Pos.Y + 10;[1].X = Pos.X + 15;[1].Y = Pos.Y + 15;[2].X = Pos.X + 10;[2].Y = Pos.Y + 15;.DrawLines(myPen, SelectPoints);[0].X = Pos.X - 10;[0].Y = Pos.Y + 15;[1].X = Pos.X - 15;[1].Y = Pos.Y + 15;[2].X = Pos.X - 15;[2].Y = Pos.Y + 10;.DrawLines(myPen, SelectPoints);true;
}
}
}