[過去ログ] Delphiゲームプログラミング相談室 (976レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
280(1): 272@眠 [sage] 03/05/18 05:59 ID:GM64wXCS(1/2) AAS
>>270 >>275275(2): 268 [sage] 03/05/18 00:57 ID:RcPQLtqQ(1) AAS
4分割は新鮮でしたが、
(0,0)-(1,3) が 5 になるのですけど。
x0 = 0;
y0 = 0;
x1 = 1;
y1 = 3;
xq0 = 0;
yq0 = 0;
xq1 := (1 * 2) + (3 mod 2) = 3;
yq1 := 3 * 2 = 6;
xlen := Abs(3)+1 = 4;
ylen := Abs(6)+1 = 7;
hexlen := Sqrt(4*4 + 7*7) / 2 + 1 = 5.03;
昔のソース見たら、やはり Sqrt を使った >>274274(1): 272 [sage] 03/05/17 16:16 ID:LhaqdzNz(4/4) AAS
>>272 また訂正。 何やってるんだ俺は……。(恥)
xq0 := (x0 * 2)+(y0 mod 2); yq0 := y0 * 2;
xq1 := (x1 * 2)+(y1 mod 2); yq1 := y1 * 2;
xlen := Abs(xq1-xq0)+1; ylen := Abs(yq1-yq0)+1;
hexlen := Sqrt( xlen*xlen + ylen*ylen ) / 2 + 1;
の方法だった…。
よく、動いていたな〜。 この直線距離は単なる目安だったからかも。
それで、やっと”コマを動かす距離”を出せましたわ…。 コレでいいはず。
xlen := Abs(x1-x0); ylen := Abs(y1-y0);
if xlen <= (ylen div 2) then hexlen := ylen
else hexlen := xlen + ylen - (ylen div 2);
0 1 2 3 4
1 2 3 4 5 ← 1つずらしレンガ状の移動距離を…
2 2 3 4 5
3 3 4 5 6
0 1 2 3 4
1 2 3 4 5 ← 整えるとこうなる。
2 2 3 4 5
3 3 4 5 6
281: 272@眠 [sage] 03/05/18 06:05 ID:GM64wXCS(2/2) AAS
>>279279(1): 268 [sage] 03/05/18 05:00 ID:enzpE3WK(1) AAS
>>277
移動させるときはリアルタイムストラテジースレにあるA*アルゴリズムを考えています。
なんか、ちんぷんかんぷん。
654444456
543333456
543222345
432112345
432101234
432112345
543222345
543333456
654444456
654444456
543333456
543222345
432112345
432101234
432112345
543222345
543333456
654444456
経路探索は、ちゃんとやっていたんですけどね。(笑)
ちゃんと消費移動量出して。
282(2): 名前は開発中のものです。 [sage] 03/05/18 23:17 ID:Vqiijavw(1) AAS
>>280
今度は(1,0)-(0,1)で2になります。
x0=1;
y0=0;
x1=0;
y1=1;
xlen = Abs(0-1) = 1;
ylen = Abs(1-0) = 1;
1 <= (1 div 2) が成立しないので、
hexlen := 1 + 1 - (1 div 2) = 2;
最終的にこれでいけました。
function GetHexLen(const P1, P2: TPoint): Integer;
var
W, H: Integer;
begin
W := Abs(P2.X - P1.X);
H := Abs(P2.Y - P1.Y);
if H <= W * 2 then
begin
if (Odd(P1.Y) and (P1.X >= P2.X)) or
((not Odd(P1.Y)) and (P1.X <= P2.X)) then
Result := H + W - H div 2
else
Result := W + H div 2
end else
Result := H;
end;
283: 272 [sage] 03/05/19 00:13 ID:xetwIoTi(1) AAS
>>282
あう。 何度も何度もすいませんでした。
(0,0)からしか検算していなかった私のミスです。
284: 名前は開発中のものです。 [sage] 03/05/19 01:16 ID:RdOoX7kJ(1) AAS
きにすんな
285(2): 名前は開発中のものです。 [sage] 03/05/20 01:21 ID:mVYsvlCM(1/2) AAS
Bitbltを使ってアニメーションをさせてるんですが、開始すると
アニメーションは割と綺麗に動きますが、実行させてるFormが
非常に重たくなります。Formを移動させようとしようものなら、
かなりガクガクに動くように…(開発環境マシンはP42.53GHzです)
何方か対策をご教授願えれば幸いです。
// TimerのIntervalは500に設定してます。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.Picture.LoadFromFile('C:\001.bmp');
BitBlt(image2.Canvas.Handle,0,0,37,75,image1.Canvas.Handle,0,0,SRCCOPY);
image2.Repaint;
sleep (100);
image1.Picture.LoadFromFile('C:\002.bmp');
BitBlt(image2.Canvas.Handle,0,0,37,75,image1.Canvas.Handle,0,0,SRCCOPY);
image2.Repaint;
sleep (100);
.
.
.
image1.Picture.LoadFromFile('C:\006.bmp');
BitBlt(image2.Canvas.Handle,0,0,37,75,image1.Canvas.Handle,0,0,SRCCOPY);
image2.Repaint;
end;
286(2): 名前は開発中のものです。 [sage] 03/05/20 02:17 ID:zL9Q18du(1) AAS
>>285
sleep() でウェイトをかましているからでは。
WINのタスクを独り占めして文字通り眠ったようになりますから。
タイマーとカウンタを使うのはどうでしょう?
TForm1.FormCreate の所で cnt を 1 に設定しておいてから、
procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.Picture.LoadFromFile('C:\00' + IntToStr(cnt) + '.bmp');
BitBlt(image2.Canvas.Handle,0,0,37,75,image1.Canvas.Handle,0,0,SRCCOPY);
image2.Repaint;
Inc(cnt);
if cnt>66(1): 1 [sage] 01/11/22 12:16 ID:??? AAS
begin
game := TGame.Create;
game.Execute;
game.
end;
then cnt:=1;
end;
というのは如何でしょう?
あと、 bmp ファイルは最初にまとめて ImageList へ読み込ませては?
287: 名前は開発中のものです。 [sage] 03/05/20 13:06 ID:mVYsvlCM(2/2) AAS
>>286
見事に軽くなりました(´ー`) ありがとうございますた。
ImageListコンポーネントは使ったことがないのですが、
ちょっと弄ってみることにします。
288(5): 名前は開発中のものです。 [sage] 03/05/21 02:17 ID:yuA7Jdfb(1) AAS
質問です。
■■■
■□■
■■■
(元絵:□が残したい部分・■が黒塗りつぶし)
□□□
□■□
□□□
(マスク:□が白塗りつぶし・■が残したい部分の黒塗りつぶし)
を、OR→AND演算で表示すれば半透明化出来ると思うのですが、
↑のマスク画像無しで、半透明化するにはどうすればいいのでしょうか?
# ADVなエロゲーを再現しようと思ってるのですが、画像を抜き出してみたところ、
# 手元のゲーム(VisualArts系やDOのゲーム等)では、各キャラクターの立ち絵に
# マスク用画像が用意されてなく、黒背景に立ち絵が描いてある画像しか
# 入ってませんでした。これらは、何か別の画像と論理演算を行って
# 半透明化させてるんでしょうか?
289(2): 名前は開発中のものです。 [sage] 03/05/21 02:49 ID:8zKfauhG(1) AAS
マスク画像は実行時に作成しているか、
1ピクセルずつ合成してるんじゃないの?
SRCANDやSRCPAINT以外にもたくさんの合成方法があるけど、
1回のBitBltで透過させる事は不可能だと思う。
290(3): 名前は開発中のものです。 [sage] 03/05/21 03:36 ID:pDtj6lgc(1) AAS
>>288
TBitmap の ScanLine を使って、>>289 さんの仰るとおり 1 pixel ごとに
処理するヨロシ。
291: 名前は開発中のものです。 [sage] 03/05/23 14:57 ID:gD+lmxCD(1) AAS
外部リンク[htm]:www.geocities.jp
292(1): 名前は開発中のものです。 [sage] 03/05/24 02:30 ID:LSDvOFkW(1) AAS
291は何なの!? 荒らしいらい?
293(1): 名前は開発中のものです。 [sage] 03/05/24 03:57 ID:o6GsTVdQ(1) AAS
>>288
TImageのプロパティで出来るじゃん
294(1): 名前は開発中のものです。 [sage] 03/05/24 11:34 ID:FLU40T1i(1) AAS
>>288
Doは知らんがVisualArts系にはマスク部分ある。確か立ち絵のファイルといっしょになってる。
画像抜くのに使ってるソフトによってはマスク部分が無視される。
というかあれのマスク部分考慮してる抜き出しソフト見たことない。あんまり需要無いしな。
295(2): 288 [sage] 03/05/25 03:35 ID:OUd92QaS(1) AAS
>>289
>>290
外部リンク[html]:www.sm.rim.or.jp
とりあえず↑のサイトを参考に(というかほぼコピペ)作ってみますた。
外部リンク[zip]:www.geocities.co.jp
1ピクセル単位で色を取得、黒だったら白に、それ以外の色だったら
黒にするという処理を行いました。ただ、問題点が2つほど…
・For文で回してる処理が非常に遅い(scanlineのせい?)
・残したいキャラに含まれている黒色までマスク化してしまう(目の黒など)
この2つが非常に悩ませてくれます… 上はともかく、下は
見た目に非常に影響するので(;´д⊂ やはり、透明化したくない
部分の黒色だけ、塗りつぶさないような条件処理でしか
解決策はないんでしょうか?
>>293
Transparentプロパティを使えば出来ますが、プログラムで再現したかったのでつ…
>>294
とりあえず一番簡単な方法である、Susieにプラグイン入れて
画像抜き出しやってるんですが、マスク画像は入ってるのですね。
じゃぁDOの方も、立ち絵ファイルと一緒になってたりするのかしら…
296(5): 290 [sage] 03/05/25 17:23 ID:ll42N4KR(1/3) AAS
>>295
ソース拝見いたしました。
> ・For文で回してる処理が非常に遅い(scanlineのせい?)
マスクを作るプロシージャにて、パレットコードを String に変換している
為と思われます。
procedure TForm1.make_mask(sBmp:TBitmap);
var
i,j, x : Integer;
p : PDWORD;
mp : PBYTEArray;
begin
for i:=0 to sBmp.Height-1 do begin
p := sBmp.ScanLine[i]; // ビットマップ座標(0,i)のポインタ
mp := mask.ScanLine[i];
x :=0;
for j:=0 to sBmp.Width-1 do begin
if p^ = $00000000 then //if str_mask = '000' then
begin
mp[x]:=$ff; mp[x+1]:=$ff; mp[x+2]:=$ff; // B=255 , G=255 , R=255
end else begin
mp[x]:=$00; mp[x+1]:=$00; mp[x+2]:=$00; // B=0 , G=0 , R=0
end;
Inc(p); Inc(x,3);
end;
end;
end;
……と、いうのは如何でしょう?( PDWORD よりも PDCHARArray の方が
わかりやすいでしょうか)
297: 290@続き [sage] 03/05/25 17:27 ID:ll42N4KR(2/3) AAS
>>296
自己レス
PDCHARArray って何やねん…。 PBYTEArray です。
>>295
> ・残したいキャラに含まれている黒色までマスク化してしまう(目の黒など)
ペイントソフトを使って、マスク用のカラー(例 $ffff00 などの使わない色)で
抜きたい所を塗るのはどうですか?
if p^ = $00000000 then の所は変更せねばなりませんが。
298(1): 290 [sage] 03/05/25 17:41 ID:ll42N4KR(3/3) AAS
連続投稿すみません。
キャラ絵を見てみましたが、瞳の中や影にあたる部分に背景を透けさせる色
RGB(0,0,0) で塗られている部分があります。
この絵からマスクをつくると、目の部分が抜けてしまいますね。
299: 名前は開発中のものです。 [sage] 03/05/26 17:01 ID:rwyNVs4A(1) AAS
>>285
もう直したかもしれないけれど、LoadFromFile は、描画ごとに毎回やるには
むちゃくちゃ遅いです。>>286のようにTImageかTImageListに、あらかじめ格納しておくに一票。
>>292
TAlphaBitmapっていうグラフィックエンジンの紹介かと
>>298
普通はマスクの色は、使っていない色を使います。
でも、フルカラーとかハイカラーで書いていると面倒だよね。
300(1): 名前は開発中のものです。 [sage] 03/05/29 18:32 ID:N4i9Vcx6(1) AAS
遅レスですまんが
0 1 2 3 4
1 2 3 4 5
2 2 3 4 5
3 3 4 5 6
移動条件を全マス上下左右+左上+右下に統一しておいて
こうずらしたほうが良くない?
0 1 2 3 4
1 2 3 4 5
2 2 3 4 5
3 3 4 5 6
301(1): 名前は開発中のものです。 [sage] 03/05/29 23:33 ID:mpTwdvzD(1/2) AAS
>>300
5 4 3 3 3 3 4 5 6
5 4 3 2 2 2 3 4 5
4 3 2 1 1 2 3 4 5
4 3 2 1 0 1 2 3 4
4 3 2 1 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 4 5 6
が、
5 4 3 3 3 3 4 5 6
5 4 3 2 2 2 3 4 5
4 3 2 1 1 2 3 4 5
4 3 2 1 0 1 2 3 4
4 3 2 1 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 4 5 6
になるということですか。
うーん、 >>282 のように(1,0)−(0,1)が2になりそうな予感…。
ソース、ぷりーず。
302: 301 [sage] 03/05/29 23:44 ID:mpTwdvzD(2/2) AAS
301訂正。 「右上」だからこうですね。
5 4 3 3 3 3 4 5 6
5 4 3 2 2 2 3 4 5
4 3 2 1 1 2 3 4 5
4 3 2 1 0 1 2 3 4
4 3 2 1 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 4 5 6
303: 名前は開発中のものです。 [sage] 03/05/29 23:52 ID:vzkpDIV0(1) AAS
というか、>>277277(2): 名前は開発中のものです。 [sage] 03/05/18 03:31 ID:mv38V9jc(1/2) AAS
今適当に思いついた奴だけど、
□■□□□ ■=移動軸、★=目標、☆=自分
★■□□■
□□■□■
□□■■□
■■■☆■
をちょっとずらして
□■□□□
★■□□■
□□■□■
□□■■□
■■■☆■
とすると、ヘックスの移動が、普通の四角マスでの
・縦移動(HEXの右上左下方向の移動)
・横移動(HEXの横方向の移動)
・左上右下移動(HEXの左上右下方向の移動)
に対応することになる。
で、目標から上下左右(斜めは考慮する必要なし)にある一番近い軸までの距離と、
軸との交点から自分(中心)までの距離を足せば、移動距離となる、ハズ。
上の例だと斜めの軸までの距離が1、☆までが3、合計の移動距離が4が結論ということになる。
でも、障害物とか地形効果とか考えると単純に距離だけ求めても、とか思うんだけどどうだろ?
がそれだよね?
304: 名前は開発中のものです。 [sage] 03/05/30 07:58 ID:3BAmLi+J(1) AAS
おおそうか、すでに既出だったか。
白い四角と黒い四角はNGワードに入れてたから見えなかったよ。
上下前次1-新書関写板覧索設栞歴
あと 672 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.045s