はじめまして。
現在、1対多のEXE版絵チャットの様な物を作成しているのですが、
単純にTIMAGEのCanvasを使って座標を送受信した場合はうまくいくのですが・・・。
当然の事かもしれないのですがTIMEGEが1つの場合、どうしてもペンを共有してしまい、
一人が絵を描いてる途中に他のユーザーが書き込みを行うと、
受信した座標にペンが移動し、ペンを取り合う形になってしまいます。
そこでTIMAGEを2つ用意して、手前のTIMAGE1に自分の描いた線を。
奥のTIMAGE2に受信した座標で線を表示。
それを重ね合わせて表示。
という、無理矢理の様な方法を思いつき、試してみたのですが
手前のTIMAGEを透過する際、Transparentを使用すると線を引く際にひどいちらつきが発生し、
ならばと過去ログを漁ってDoubleBuffered等を使い、ちらつきは無くなったものの
あまりにも重く、線が直線状(カクカク)になってしまいました。
不必要な時は使わない用にしたり、できるだけ削ぎ落としたのですが
どうにも短い線やクリックを連発したりすると処理が重くなってしまうみたいで。
マスクなどいろいろなログを参照してみたのですが、
どうにもどんな手順を踏んでいるのか想像が付かない状態です。
(単に自分の頭が硬いだけかもしれないですが)
何か良い方法は無いでしょうか・・・。
もしくは皆さんでしたらどのような考えが浮かぶでしょうか。
自分の方法が間違っているような気がしてならないのです。
どうか知恵をお貸し下さい・・・orz
私はまだ使用させてもらって無いので詳しくはわりませんが
部員弐号さんのAlphaBitmapを使用されたらどうでしょうか
http://buin2gou.com/delphi/abitmap.htm
> 当然の事かもしれないのですがTIMEGEが1つの場合、どうしてもペンを共有してしまい、
> 一人が絵を描いてる途中に他のユーザーが書き込みを行うと、
> 受信した座標にペンが移動し、ペンを取り合う形になってしまいます。
どんなデータを送受信しているのでしょうか? 単に線を引いたらその始点と終点を送信し、受信側で現在のペン位置を保存してから線を引きペン位置を戻すだけじゃまずいのでしょうか?
またTImageはどちらかというと画像表示向けで、こういった用途では
TPaintBoxの方が向いているんじゃないでしょうか。
>TS様
お返事ありがとうございます。
さっそく試してみたいと思います。
>かみづ様
お返事ありがとうございます。
送受信している座標、タイミングは
;クリックされた。
unit1.Form1.ClientSocket1.Socket.SendText('#MOVE' + inttostr (X) + ',' + inttostr (Y));
;クリックしながら移動した。
unit1.Form1.ClientSocket1.Socket.SendText('#LINE' + inttostr (X) + ',' + inttostr (Y));
;クリックが離された。
unit1.Form1.ClientSocket1.Socket.SendText('#ELINE' + inttostr (X) + ',' + inttostr (Y));
という流れです。
他にもチャットや色、他コマンドなどが存在しますが省いています。
無駄というか負荷が高そうな処理ですけど・・・。
これらをサーバーに送信したのち、サーバーから接続ユーザー全員に座標を転送して
自動で同じ線を引くようにしてます。
>線を引いたら
ちょっとよくわからないのですが、座標を受信したら今のペン位置を保存して
受信座標に沿って線を引き、またペン位置を戻すという動作を繰り返す・・・
という事でしょうかね?
これだと同じような事になりそうな・・・。
とりあえずやってみます。
>Timageは
最初はPaintBoxを使ってやっていたのですがメインフォームをリサイズしたり、
ウィンドウをかぶせるときちんと再描画できなかったりと
明らかな知識不足だったので手軽なTIMAGEを使ってしまいました。
やはりまだ画像処理に手を出すのは早すぎでしたでしょうか・・・。
何度か試してみたのですが納得のいく形にならなかったため
とりあえず重ね合わせから離れて別々のTIMAGEにコピーしていく形にしてみたとろ、
綺麗に更新ができたのでこちらでやってみたいと思います。
助言をくれたTS様、かみづ様、どうもありがとうございました。
ツイート | ![]() |