[過去ログ] Delphiゲームプログラミング相談室 (976レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
270(2): 268 [sage] 03/05/17 02:34 ID:IP6oP4NN(1) AAS
 2HEX間の距離(HEXの数)を数えたいのです。 
271(1): 名前は開発中のものです。 [sage] 03/05/17 15:57 ID:LhaqdzNz(1/4) AAS
 >>270  
 ああ、HEXマップをいじっている時に私もつまづいたなぁ…。  
 とりあえず、私の使っている方法。  
  
 ”HEXマップにおける距離”=”ユニット(コマ)が進む数”だから、 
   0  1  2  3 
  ┌─┬─┬─┬─┬ 
 0│  │  │  │  │ 
  └┬┴┬┴┬┴┬┴ 
 1  │  │  │  │ 
  ┌┴┬┴┬┴┬┴┬ 
 2│  │  │  │  │ 
 …のように、レンガ壁状のマップで考えます。 
 そして、この1コマを4分割。 
  □□□□□□□□ 
  □□□□□□□□ 
    □□□□□□□□ 
    □□□□□□□□ 
  □□□□□□□□ 
  □□□□□□□□ 
 あとは、直線の距離を出して、2で割ればOK。
272(4): 名前は開発中のものです。 [sage] 03/05/17 15:58 ID:LhaqdzNz(2/4) AAS
 >>271 の続き 
 (x0,y0)〜(y1,y0)の距離を出したかったら、 
  
 xq0 := (x0 * 2)+(x0 mod 2);    yq0 := y0 * 2; 
 xq1 := (x1 * 2)+(x1 mod 2);    yq1 := y1 * 2; 
 xlen := Abs(x1-x0)+1;    ylen := Abs(y1-y0)+1; 
 hexlen := Sqrt( xlen*xlen + ylen*ylen ) / 2 + 1; 
  
 で、算出できるはずです。(メンドいから整数と実数の変換は略)
273: 名前は開発中のものです。 [sage] 03/05/17 16:01 ID:LhaqdzNz(3/4) AAS
 >>272 
 ゴメン、間違えた。 
 × xlen := Abs(x1-x0)+1;    ylen := Abs(y1-y0)+1; 
 じゃなくて 
 ◎ xlen := Abs(xq1-xq0)+1;    ylen := Abs(yq1-yq0)+1; 
 ね。 
274(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; 
275(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; 
276: 272 [sage] 03/05/18 02:18 ID:MA7QNrHO(1) AAS
 >>275 
 ホンマや…。 ちょっと昔のソース探してみます。 
277(2): 名前は開発中のものです。 [sage] 03/05/18 03:31 ID:mv38V9jc(1/2) AAS
 今適当に思いついた奴だけど、 
 □■□□□   ■=移動軸、★=目標、☆=自分 
  ★■□□■ 
 □□■□■ 
  □□■■□ 
 ■■■☆■ 
 をちょっとずらして 
 □■□□□ 
   ★■□□■ 
   □□■□■ 
     □□■■□ 
     ■■■☆■ 
 とすると、ヘックスの移動が、普通の四角マスでの 
 ・縦移動(HEXの右上左下方向の移動) 
 ・横移動(HEXの横方向の移動) 
 ・左上右下移動(HEXの左上右下方向の移動) 
 に対応することになる。 
 で、目標から上下左右(斜めは考慮する必要なし)にある一番近い軸までの距離と、 
 軸との交点から自分(中心)までの距離を足せば、移動距離となる、ハズ。 
  
 上の例だと斜めの軸までの距離が1、☆までが3、合計の移動距離が4が結論ということになる。 
  
 でも、障害物とか地形効果とか考えると単純に距離だけ求めても、とか思うんだけどどうだろ?
278: 名前は開発中のものです。 [sage] 03/05/18 03:32 ID:mv38V9jc(2/2) AAS
 行頭の半角スペースは無視されるんだった…。 
  □■□□□   ■=移動軸、★=目標、☆=自分 
   ★■□□■ 
  □□■□■ 
   □□■■□ 
  ■■■☆■ 
 こうね。 
279(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 
280(1): 272@眠 [sage] 03/05/18 05:59 ID:GM64wXCS(1/2) AAS
 >>270 >>275 
 昔のソース見たら、やはり Sqrt を使った >>274 の方法だった…。 
 よく、動いていたな〜。 この直線距離は単なる目安だったからかも。 
 それで、やっと”コマを動かす距離”を出せましたわ…。 コレでいいはず。 
  
       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
 >>279 
 経路探索は、ちゃんとやっていたんですけどね。(笑) 
 ちゃんと消費移動量出して。 
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系にはマスク部分ある。確か立ち絵のファイルといっしょになってる。 
 画像抜くのに使ってるソフトによってはマスク部分が無視される。 
 というかあれのマスク部分考慮してる抜き出しソフト見たことない。あんまり需要無いしな。
上下前次1-新書関写板覧索設栞歴
あと 682 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.029s