Показать полную графическую версию : Шашечная партия
.::.DIMA.::.
02-05-2009, 01:23
решено
Ея бы посоветовал сделать не так:
1. хранить не координаты фигур, а доску 8x8 с элементами: белый, чёрный или пустой.
2. отрисовывать шашки копированием картинки. В рисовании поможет ImageList из 2-х картинок. Доску так же можно отображать картинкой. Если дома есть шахматная доска и шашки, можно сфоткать картинки хоть на сотовый телефон.
Функция floodFill на мой взгляд вообще сомнительна для применения. Она выполняет заливку кистью, а не цветом. Вместо неё лучше использовать заливку региона (FillRgn), а регион отрисовать нужной формы
может в синтаксисе? а можно файлы *.h и список ошибок?
а ошибки, которые компилятор выдаёт?
class Chess
{
public:
void Chess::SetCoordinates (int x, int y, int color, CPaintDC & dc)
{
itsX1 = x - 25;
itsX2 = x + 25;
itsY1 = y - 25;
itsY2 = y + 25;
itsColor = color;
Paint (itsColor, dc);
}
...
}
Chess:: здесь лишнее (возможно на это и ругается)
Создание кисти - довольно трудоёмкий процесс, я бы рекомендовал держать 2 кисти одновременно (чёрную и белую) на всю отрисовку:
class CChildView { CBrush brBlack, brWhite; ... };
CChildView::fPen(...)
{
...
// кисти реально хранятся всё время существования CChildView
// делаем индексированный массив и индекс, который будет постоянно меняться
// операцией xor.
CBrush* brush_set[2] = {&brBlack, &brWhite};
unsigned brush_n = 0;
// но можно было бы сделать хитрее: посчитать сколько будет
// addr_xor = reinterpret_cast<unsigned>(&brBlack) ^ reinterpret_cast<unsigned>(&brWhite);
// а потом в цикле addr_brush ^= addr_xor
// это бы съэкономило около 30 байт памяти и 4 тактов процессора, но запутало бы код.
CRect draw_area(31, 31, 31+8*50, 31+8*50); // диапазон доски, полезно иметь вообще
CRect rect; // клетка, которую будем в цикле перемещать
for(rect.bottom=draw_area.top; rect.bottom<draw_area.bottom; brush_n^=1)
{
rect.top = rect.bottom;
rect.bottom += 50;
for(rect.right=draw_area.left; rect.right<draw_area.right; brush_n^=1)
{
rect.left = rect.right;
rect.right += 50;
dc.FillRect (rect, brush_set[brush_n]);
}
}
...
}
попробуй в файле CChess.h после #pragma once вставить #include <mfc.h>
Возможно не собирает из-за того, что cchess.h ни на что не ссылается, поэтому компилится первым, но содержит void SetCoordinates (int x, int y, int color, CPaintDC & dc), причём CPaintDC на этот момент неизвестен.
много кисть занимает места, сколько памяти уходит на создание кисти »
Просто так будет один раз в жизни создано 2 кисти, которые займут байт 200 памяти, вместо того, чтобы создавать 64 кисти на каждый цикл прорисовки (из них по 32 одинаковые)
а, значит afx.h. короче тот, который у них самый главный, в котором всё описано
а, значит afx.h. короче тот, который у них самый главный, в котором всё описано »
В общем этим главным файлом оказался "afxwin.h". Его нужно подключить раньше всех, во все файлы (для надёжности). После этого (и после замены &class::mem_fun на class::mem_fun, dc.TextOutW на dc.TextOut и L".." на ".." - необходимо чтоб собралось в ансишной библиотеке билдером) всё удачно скомпилировалось при помощи Borland C++ Builder. Всё же я считаю проблема в недостяющих инклюдах.
попробуй собрать другим компилятором, может ошибки перефразирует на более понятном языке. А если всё-же соберёт (как у меня получилось) - то проблема скорее всего в компиляторе и его библиотеках. Возможно к слишком новому компилятору забыли подточить слишком старую библиотеку. Такое было с билдером 4, когда не собирался пример кода STL из его же хелпа.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.