В кьюте насколько мне известно можно использовать CSS. Подход как в яве: lbl. getStyleClass( ) . addAll( "game-label", "game-title") ;
Нет, свой класс не писал, я использовал шаблон std::uniform_int_distribution из стандартной библиотеки. Внешний вид грида, я так полагаю, зависит от настроек стиля и от графической оболочки операционной системы, пока что не заморачивался с красотой)
Ильшат, а вы в функции placeRandom стандартную сишную функцию rand()% использовали или же свой класс для случайной расстановки писали? Вот кстати что тут грид некрасиво смотрится, что в вс...
Спасибо, здесь все по урокам:) Qt да, удобен, высокоуровневые классы облегчают и ускоряют разработку. Здесь я не использовал никаких игровых движков, Евгений Витольдович неоднократно показывал, что можно делать игрушки на обычном прикладном интерфейсе, это интересно. В качестве структуры хранения данных использовал матрицы из библиотеки boost ublas. Можно было std::array, но я решил пусть размеры игрового поля будут динамичными. А про то, что интересуетесь контейнерами и аллокаторами, то тут стоит задать себе вопрос чем хотите заниматься, для чего использовать язык. Если для быстрой разработки GUI, то следует сделать упор на Qt. Если тянет на исследование низкоуровневых фич, то может быть вообще GUI и не нужно изучать, а делать то, что нравится. Удачи:)
А вы грид как представляли через array или vector<vector<Grid::...> > ?
Очень круто написал!!! Вот для себя решил, что использовать кьют гораздо удобнее чем вс+глут...правда пока до разработки игр и другого по не дошел на плюсах. Пока с консолью работаю: делаю велосипедные контейнеры,простенькие аллокаторы и тд.
А можно на класс со статистикой взглянуть? Интересен ваш метод...
Спасибо...а вы не в курсе, как в шарпе можно свечение краев у лейбла сделать ? В кьюте есть SetStyleSheet, а в студии такого, к сожалению, нет...
Да, можно подключать без Qt. Qt сама по себе обычная "большая библиотека". OpenGL можно без Qt использовать.
А без кьюта есть возможность подключать какие-либо графические библиотеки и всякие оболочки ? (про опенгл я знаю:)) )
Спасибо ВАМ, я недано приобрел книгу Бьерна, но это издание 2010 года, по вашей рекомендации буду изучать и эту.
Добрый день, вот ссылка на архив с исходниками drive.google.com/file/d/0B_Obr1K-Hp4YalVpZ3BTYldvb0E/view?usp=sharing Посмотрите, хотя здесь частично используется библиотека Qt, а это не настоящий чистый C++, я бы сказал даже так, java-like. Если вы серьезно хотите сесть за плюсы, то рекомендую прочитать эту книгу stroustrup.com/programming.html Она на английском, если с этим туго, то можно поискать первое издание этой книги, она переведена, правда там не совсем свежая версия языка. Обе книги хороши, написаны самим автором C++ и информация не будет вводить в заблуждение, как часто встречается на просторах сети в других источниках. Еще плюс этой книги в том, в конце главы имеется список упражнений, они не сложные, как раз то что нужно, практика, советую все прорешать, сильно прокачивает. Причем объясняются не только свойства языка и для чего они применяются, но и в целом подходы к программированию, это здорово. А дальше можно прочитать stroustrup.com/4th.html Удачи.
Ильшат, добрый день! Я извиняюсь за свою беспардонность, но...можно взглянуть на ваш проект 2048, который вы в кьюте писали. Я недавно начал изучать плюсы и пока во многих вещах не разобрался, а в интернете таких вещей очень мало.
Заранее спасибо !!!
классно ! а кнопки через массивчик делал ?
Прежде чем уходить, прорешай алгоритмики и комбинаторику,
мой тебе совет. Это тебе крайне поможет, на каком бы ты языке
не продолжал работать.
Забыл добавить : при наведении на кнопки появляется свечение для красоты ))
вот маленько повозился, все работает, можешь качать и смотреть что да и как yadi.sk/d/t9fsD4g0pQKUH
да я сам голову об эту проблему сломал...сами лейблики появляются, а события движения не работают...
теперь событие кейдата не работает...ни кейпревью ни кейап....т.е лейблики вообще не двигаются
Как сделаешь программу пришли скрин) интересно посмотреть что ты сделал)
вот ссылка на исходник yadi.sk/d/25XZsC9Up8fhu, а это на видео youtu.be/1qviesmXaUo, маленько нервничал поэтому не обращай внимания как обьясняю)
я запишу видео, покажу что да и как, скину исходник а там сам потренируешься, я сам ни когда не писал контролы, просто как то прочитал и решил сделать, я бы лучше делал на WPF там все просто
да с лейблами все отлично....я не могу понять почему при добавлении контрола у меня вылетает ошибка (ранее писал) вот и все
Я бы рад помочь, но понимаешь курс платный, и евгению витольдовичу не понравится, что его проекты передают друг другу, это не правильно. Ты скажи что конкретно ты хочешь от лейблов? что не так с ними. я могу тебе помочь скинуть исходник, в самом проекте тебе нужно создать custom control и вписать код с исходника, потом его скомпилируешь, и в главный проект добавишь, и там сможешь манипулировать как тебе угодно
Добрый вечер, Сергей! Я вас ещё раз по поводу лейблов беспокою...ну вот ради интереса вожусь с ними 2 неделю и никакого толка. Возможно вам сбросить проект, чтобы вы встроили лейблы, ибо вы говорили что у вас все работает. Заранее спасибо !
класс!!!! а можете код с закруглением лейблов скинуть ?
Уже будит легче писать может сперва на windows mobile10 потом на андройде а потом уже на свифте
ну фиг его тогда...вот мой код
public delegate void DelegateShow(int x, int y, int number);
public partial class Form1 : Form
{
static int size = 4;
Label[,] box;
Dictionary<int, Font> size_fonts;
Dictionary<int, Color> back_colors;
Dictionary<int, Color> fore_colors;
Logic logic;
public class AntiAliasLabel : Label
{
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
base.OnPaint(e);
}
}
public Form1()
{
InitializeComponent();
InitLabels();
InitColors();
InitForeColors();
logic = new Logic(size, Show);
logic.init_board();
lbl2.Text = logic.highscore.ToString();
}
private void InitColors() //цвет плиток
{
back_colors = new Dictionary<int, Color>();
back_colors.Add(0, Color.FromArgb(205, 193, 180));
back_colors.Add(2, Color.FromArgb(238, 228, 218));
back_colors.Add(4, Color.FromArgb(236, 224, 200));
back_colors.Add(8, Color.FromArgb(242, 177, 121));
back_colors.Add(16, Color.FromArgb(245, 149, 99));
back_colors.Add(32, Color.FromArgb(246, 124, 95));
back_colors.Add(64, Color.FromArgb(246, 94, 59));
back_colors.Add(128, Color.FromArgb(237, 206, 113));
back_colors.Add(256, Color.FromArgb(237, 204, 97));
back_colors.Add(512, Color.FromArgb(236, 200, 80));
back_colors.Add(1024, Color.FromArgb(237, 197, 63));
back_colors.Add(2048, Color.FromArgb(238, 194, 46));
back_colors.Add(4096, Color.FromArgb(239, 102, 109));
back_colors.Add(8192, Color.FromArgb(238, 76, 89));
back_colors.Add(16384, Color.FromArgb(244, 65, 68));
back_colors.Add(32768, Color.FromArgb(114, 180, 214));
back_colors.Add(65536, Color.FromArgb(95, 160, 224));
back_colors.Add(131072, Color.FromArgb(27, 132, 200));
}
private void InitForeColors() //цвет шрифта
{
fore_colors = new Dictionary<int, Color>();
fore_colors.Add(0, ForeColor = Color.FromArgb(202, 184, 169));
fore_colors.Add(2, ForeColor = Color.FromArgb(119, 110, 101));
fore_colors.Add(4, ForeColor = Color.FromArgb(119, 110, 101));
fore_colors.Add(8, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(16, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(32, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(64, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(128, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(256, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(512, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(1024, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(2048, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(4096, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(8192, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(16384, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(32768, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(65536, ForeColor = Color.FromArgb(249, 246, 242));
fore_colors.Add(131072, ForeColor = Color.FromArgb(249, 246, 242));
}
private void InitSizesFonts() //размер шрифта
{
size_fonts = new Dictionary<int, Font>();
size_fonts.Add(0, Font = new Font("Clear Sans", 37F, FontStyle.Bold));
size_fonts.Add(2, Font = new Font("Clear Sans", 37F, FontStyle.Bold));
size_fonts.Add(4, Font = new Font("Clear Sans", 37F, FontStyle.Bold));
size_fonts.Add(8, Font = new Font("Clear Sans", 37F, FontStyle.Bold));
size_fonts.Add(16, Font = new Font("Clear Sans", 35F, FontStyle.Bold));
size_fonts.Add(32, Font = new Font("Clear Sans", 35F, FontStyle.Bold));
size_fonts.Add(64, Font = new Font("Clear Sans", 35F, FontStyle.Bold));
size_fonts.Add(128, Font = new Font("Clear Sans", 28F, FontStyle.Bold));
size_fonts.Add(256, Font = new Font("Clear Sans", 28F, FontStyle.Bold));
size_fonts.Add(512, Font = new Font("Clear Sans", 28F, FontStyle.Bold));
size_fonts.Add(1024, Font = new Font("Clear Sans", 23F, FontStyle.Bold));
size_fonts.Add(2048, Font = new Font("Clear Sans", 23F, FontStyle.Bold));
size_fonts.Add(4096, Font = new Font("Clear Sans", 23F, FontStyle.Bold));
size_fonts.Add(8192, Font = new Font("Clear Sans", 23F, FontStyle.Bold));
size_fonts.Add(16384, Font = new Font("Clear Sans", 20F, FontStyle.Bold));
size_fonts.Add(32768, Font = new Font("Clear Sans", 20F, FontStyle.Bold));
size_fonts.Add(65536, Font = new Font("Clear Sans", 20F, FontStyle.Bold));
size_fonts.Add(131072, Font = new Font("Clear Sans", 17F, FontStyle.Bold));
}
private void InitLabels()
{
int w = pnl1.Width / size;
int h = pnl1.Height / size;
box = new Label[size, size];
for (int x = 0; x < size; x++)
for (int y = 0; y < size; y++)
{
box[x, y] = CreateLabel();
box[x, y].Size = new System.Drawing.Size(w - 13, h - 13);
box[x, y].Location = new Point(x * w + 13, y * h + 13);
pnl1.Controls.Add(box[x, y]);
}
}
private Label CreateLabel()
{
Label label = new Label();
//OnPaint(e);
//InitSizesFonts();
InitForeColors();
label.Font = new System.Drawing.Font("Clear Sans", 36F, System.Drawing.FontStyle.Bold);
label.TextAlign = ContentAlignment.MiddleCenter;
return label;
}
public void Show(int x, int y, int number)
{
//box[x, y].Font = number > 0 ? size_fonts[number] : Font = new System.Drawing.Font("Clear Sans", 10F, System.Drawing.FontStyle.Bold);
box[x, y].Text = number > 0 ? number.ToString() : "";
box[x, y].BackColor = back_colors[number];
box[x, y].ForeColor = fore_colors[number];
}
Оно унаследует базовый класс. Тоесть всё будет 1 в 1 кук у лейбла, только метод OnPain мы перехватываем, делаем нужные нам вещи, а затем возвращаем управление базовому методу НО С новыми параметрами :~)
классно то классно...в идеале нужно на свифте написать и на айфон))
не ну может я чегото не догоняю....
public class AntiAliasLabel : Label
{
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
base.OnPaint(e);
}
}
и все ?
у нас оно будет само инициализироваться при создании лейбла без вызова ?
в принципе, ничего не работает, мне пришлось на лейблы ещё картинки с текстом насаживать мб есть другой способ ?
Михаил, ну я так пробовал раньше делать, но немного по-другому...в принципе не вижу никакой разницы
Смотри, дело вот в чём;
Мы при рисовании перехватываем событие рисования
Далее мы устанавливаем сглаживание
И вызываем базовую функцию.
В итоге: Всё работает как и в обычном Label, только со сглаживанием :~)
Смотри, есть вариант создать свой класс типа Label и в нём функцию OnPain() перезаписать. Пример:
public class AntiAliasLabel : Label
{
protected override OnPaint(PaintEventArgs e)
{
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
base.OnPaint(e);
}
}
ну чет у меня не работает ни тот ни другой опять вылазеет
Необработанное исключение типа "System.IO.FileNotFoundException" в WindowsFormsApplication2.exe
Дополнительные сведения: Не удалось загрузить файл или сборку "NewLabel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Не удается найти указанный файл.
Буду сам разбираться, спасибо !!!!
По новый сделал маленько по другому, попробуй, проверял у меня работает на любой версии фрэймворке, ни какких линий или текстур не наблюдал, на всякий случай даю две ссылки на 4.5 и на 4.6 yadi.sk/d/XLo9QQAkoVTRf -> 4.6 и yadi.sk/d/jdWRYJj9oVUAF -> 4.5. Если что посмотри и сделай скрин если что опять не так будет
я попробую исправить, просто времени нет, я тоже заметил, но это остаток текстуры, когда форму растягиваешь оно перерисовывается, посмотрю что можно сделать
там две полоски : одна снизу, другая справа все портят, а так конечно крутяк!!
нет, также все осталось
s017.radikal.ru/i428/1602/81/82feebe28782.jpg
Вот держи yadi.sk/d/2VslNxoLoSLML Ты хотя бы скрин делай, чтобы просмотреть проблему, потому что я говорю я ее написал на быструю руку и ни чего не проверял на баги и прорисовку компонента, поэтому если не трудно присылай скрин чтобы посмотреть что да как)
тут вот ещё проблема : у элемента выступает квадратная окантовка, можете ссылку кинуть на 4.6 фрейм, там на вашем скриншоте ее нет, а та ссылка не действительна
ой сорьки....чет я туплю сегодня....уже порядок, все работает!!!! огромное тебе спасибо за помощь!!!!!!!!!
Значит проблем не должно быть, у меня тоже 7 х64, а версия фреймворка точно 4.5?
спасибо, я вот что-то не вкатил как их объявлять при запуске...через InitializeComponent() ?
вот что вылазеет :
Не удалось загрузить файл или сборку "MyControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Не удается найти указанный файл.
если не сильно затруднит, больше не буду досаждать своими вопросами )))
Давай на ты, мне всего лишь 29 лет) Да я создавал на 4.6, могу скомпилировать под 4.5 если есть проблемы с версиями, просто как то не стал проверять
Если нужно будет чтобы была возможность картинку добавлять, могу еще доделать, просто не стал заморачиваться
Всё просто. Создаёшь свой контрол со сруглёнными краями. И можешь делать с ним всё что тебе заблогарассудится.
создавал через usercontrol winforms, рад был помочь) Через WPF там по другому делается, пока не со всем разобрался
Сейчас скачай другую библиотеку yadi.sk/d/UweigJAyoLzHD, маленько переделал, на форме не забудь сделать DoubleBuffered
Вот спасибо! Прям не зная как благодарить...а вы не в курсе как сглаживание на этих лейблах сделать, чтобы уголки не так рябили ?
Используй WPF там можно хоть как извращаться. Есть еще программа Visual Blend, там можно создавать свои элементы управления различной формы
Сделал лэйбел для тебя от прямого лейбла до круглого, вот ссылка на dll yadi.sk/d/84eT-OAloFSWC
Вот скриншот s020.radikal.ru/i718/1602/9d/6ec31cef5729.png, обрати внимание на фото где я выделил "Выбрать элементы" в любом месте панели элементов добавить MyControl .dll и все перетаскиваешь на форму и настраиваешь как тебе удобно, на фото справа видно что я добавил в свойства дополнительные настройки, где написано GradusUgol там ставишь число целое, он задает как сильно закруглять углы, далее добавил еще свойство ShapeType по умолчание стоит Radius, если поставить не Radius, а Rectangle, то будет просто квадратный лэйбел. Надеюсь помог, если буду вопросы пиши.
Классно получилось! Такого еще не видела, прямо имитация! Молодец! :)
Ну я так и понял и уже все готово, спасибо!
У лейблов углы не закруглить.
Я вижу решение заменить лейблы на PictureBox или несколько PictureBox ов и пользоваться заготовленными картинками.
А там уже и до анимации недалеко.
очень круто, возможно ты в финале покажешь и расскажешь про свое творение! :)
Спасибо! Игра на 80 процентов готова...осталось закруглить лейблы, добавить анимацию на перемещение плиток и на увеличение счета...
В планах сделать поле 2 на 2 с возможностью игры по сети на скорость
Очень интересно уже посмотреть на итог игры!
Прямо волшебство, в это же время мой телефон выдал вообще нее чтобы я сыграла в игру 2048!!! :)
Здорово кнопки уже готовы, а дальше самое интересное! Вперед! :)
Да уж, я бы даже сказал, что у простой игры может быть серьезный алгоритм.
т.е. когда у тебя вернется что Убил, ты проходишь по карте и раньше где у твоего убитого корабля был статус Ранен, теперь сменился на Убит, поэтому при передаче на Грид уже нового статуса этих клеток и цвет у них обновится!
То биш после проверки на убийство заново проходим по карте выстрелов и меняем статусы ранил на убил ? Так ?
В классе Море, в методе Выстрел идет проверка на Убил, и если Убил то проверяется Победил-ли. После этой проверки я добавил хождение по всему полю и проставляю им Статус. Раньше возвращался только последний, а я, пробегаясь по всей карте, заново им выставляю статусы, и у уже Убитого корабля на всех его палубах выставится корректный цвет - красный!
Спасибо! А как организовали добивание всего корабля в красный цвет. Я когда функцию написал, у меня почему-то ранение тоже красным становится...
Отлично позанимался! Молодец! :)
Очень здорово сделал, мне нравятся твои доработки, нужно было видеообзор программы сделать, показал и рассказала про все!!! Молодец! :)
Поздравляю! Рада что ты победил и одолел бота! Молодец! :)
Там же где меняется Mode программы, при переходе хода. Если ход компьютера, то пропадает(Visible=false) "Ваш ход" и поле с кораблями компьютера становится не Enabled, когда ход человека - наоборот.