![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
собственно делаю рисовалку для двоих, человек создает сервер и к нему подключаешься и рисуете вместе,
Передаю при рисовании координаты другому человеку и там принимаю и рисую, но проблема в том что принимаютсяони почемуто както с краю все чиркаются линии коряво, и еще вопрос, отриовку твою и второго нужно разными ведь ???:= T8Bit.Create; делать, иначе если только одним то часто менять нужно будет атрибуты притом что в это время рисует он и ты, но вот пробовал двумя разными Код:
procedure TForm1.PaintBox1Paint(Sender: TObject); begin PaintBox1.Canvas.Draw(-10, -10, VScreen); PaintBox1.Canvas.Draw(-10, -10, VScreen2); так на PaintBox1 видно только 1 последний VScreen2, как их отрисвать чтоб оба были видны? |
|
#2
|
||||
|
||||
|
вроде решил проблему с координатами
но вот проблема мне бы от второго человека рисовать другой переменной T8bit все бы ничего рисую ей но в событии Код:
procedure TForm1.PaintBox1Paint(Sender: TObject); begin PaintBox1.Canvas.Draw(-10, -10, VScreen); end; если давать еще Код:
PaintBox1.Canvas.Draw(-10, -10, VScreen); PaintBox1.Canvas.Draw(-10, -10, "VScreen2"); Последний раз редактировалось ALexandr555, 17.03.2011 в 15:31. |
|
#3
|
|||
|
|||
|
Либо использовать TransparentColor, либо передавать не изображение, а массив точек, или линий, которые добавил пользователь, то есть холст должен быть один, а рисуют на нем двое, если один рисует линию, то передаем на сервер ее координаты вместе с атрибутами и отрисовываем.
Так же, можно пойти и другим путем, в начале программы создаем холст и копию холста, когда отправляется пакет, то сравниваем оба холста, создаем массив разницы точек и отправляем его, и сохраняем новую копию холста. |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
И так, все сначала, что вы хотите? Что конкретно не получается? Что вы передаете из клиентской части серверной?, и что передает серверная часть клиентской? Что такое VScreen и VScreen2?
Сдается мне вы неправильный способ изначально начали проробатывать, ответьте на вышеуказанные вопросы и я подскажу как лучше сделать. |
|
#6
|
||||
|
||||
|
Код:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MouseDowned then
begin
X:=X+10;
Y:=Y+10;
VScreen.Canvas.LineTo(X, Y);
serversocket1.socket.connections[1].sendtext('linet¶'+IntToStr(X)+'='+IntToStr(Y));
PaintBox1Paint(nil);
end;
end;Вот при движении рисую и отправляю координаты, там все отрисовывается как надо, но в если я буду отправлять с атрибутами и прочим, то в это время же, рисовать человек у себя тоже может, и выйдет что если сменить атрибут то сменится и у тебя, и в это время могут то линии другие начиркаться, то твой цвет в другой перейдет. Поэтому я и хотел сделать две переменные. Код:
VScreen: T8Bit; VScreen2: T8Bit; Код:
VScreen := T8Bit.Create; VScreen.Init(PaintBox1.Width + 20, PaintBox1.Height + 20); VScreen.Canvas.Pen.Color := clBlack; VScreen.Canvas.Pen.Width := 5; VScreen2:= T8Bit.Create; VScreen2.Init(PaintBox1.Width + 20, PaintBox1.Height + 20); VScreen2.Canvas.Pen.Color := clBlack; VScreen2.Canvas.Pen.Width := 5; создаются они так сам класс 8бит Код:
T8Bit = class(TBitmap) // класс восьмибитной картинки с градациями серого
private
Scan: array[0..1023{этим числом ограничена максимальная высота}] of PByte;
BitHeight, BitWidth:Integer;
public
constructor Create; override;
procedure Init(AWidth, AHeight: Integer);
procedure Clear(Color: Byte);
end;init процедура что при создании Код:
procedure T8Bit.Init(AWidth, AHeight: Integer);
var i:Integer;
Pal:PLogPalette;
NewPal:HPalette;
begin
PixelFormat := pf8bit;
Width := AWidth;
Height := AHeight;
BitHeight:=AHeight;
BitWidth:=AWidth;
GetMem(Pal, 256*4 + 40);
Pal.palVersion := $300;
Pal.palNumEntries := 256;
for i := 0 to 255 do
begin
Pal.palPalEntry[i].peRed := Byte(i);
Pal.palPalEntry[i].peGreen := Byte(i);
Pal.palPalEntry[i].peBlue := Byte(i);
Pal.palPalEntry[i].peFlags:=0;
end;
NewPal := CreatePalette( Pal^ );
Palette := NewPal;
GDIFlush;
FreeMem(Pal);
for i:=0 to BitHeight-1 do
begin
Scan[i]:=ScanLine[i];
FillChar(PByte(Scan[i])^, AWidth, 255);
end;
end;А в приеме же из пакета вырезаются координаты и отрисовываются, клиентская при рисовке отправляет, и серверная тоже при рисовке отправляет, при получении обе отрисовывают. Последний раз редактировалось ALexandr555, 17.03.2011 в 18:00. |
|
#7
|
||||
|
||||
|
а ну так проблема то в чем
Код:
procedure TForm1.PaintBox1Paint(Sender: TObject); begin PaintBox1.Canvas.Draw(-10, -10, VScreen); end; вот эта операция должна выполняться после неё токо отображается рисунок если выполняется Код:
PaintBox1.Canvas.Draw(-10, -10, VScreen); Код:
VScreen.Canvas.LineTo(X, Y); Код:
PaintBox1.Canvas.Draw(-10, -10, VScreen2); Код:
VScreen2.Canvas.LineTo(X, Y); |
|
#8
|
||||
|
||||
|
как понял VScreen это буфер с него и выводится на пинт бокс, нельзя ли вот одновременно рисовать в один буфер просто при одновременном рисовании сбивается,
Код:
VScreen.Canvas.LineTo(X, Y); Код:
VScreen.Canvas.LineTo(X, Y); |
|
#9
|
|||
|
|||
|
Цитата:
Цитата:
Вывести VScreen и VScreen2 на один холст без (частичных) потерь невозможно, для вашего варианта должен существовать только один VScreen, на котором должна воспроизводится отрисовка с обоих компьютеров. Пакеты отправляемые через serversocket1 надо разделять каким либо способом, а на принимающей стороне, следить приходящими пакетами, так как могут быть отправлены две и более линий в одном пакете, то есть будет два запроса, но они могут прийти одним пакетом, эту ситуацию надо отрабатывать. |
|
#10
|
||||
|
||||
|
Цитата:
Цитата:
Цитата:
|
|
#11
|
||||
|
||||
|
я склоняюсь к тому чтобы добавить в canvas MoveTo2 и LineTo2
|
|
#12
|
|||
|
|||
|
Что не получается, я вот предыдущего не понял, что значит когда быстро двигаешь, только точки получаются, пиши внятнее. детальнее, разберемся..
|
|
#13
|
||||
|
||||
|
Я вижу 2 варианта:
1. Если использовать для каждого рисующего отдельный буфер (TBitmap), то можно делать маску изображения и потом на пейнт бох накладывать изображение по маске. 2. Создать (к примеру) "буфер" атрибутов на каждого рисующего. И не делать MoveTo, LineTo, а набор процедур типа Line(From, To, Attrib), где Attrib - атрибуты рисующего. |
|
#14
|
||||
|
||||
|
Asinkrit
если команды вида Код:
VScreen.Canvas.MoveTo(X, Y); VScreen.Canvas.LineTo(X,Y); |
|
#15
|
||||
|
||||
|
Цитата:
2- не совсем понял что будут эти процедуры делать и что значат From, To |