Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


347 / 13645 ツリー ←次へ | 前へ→

【80834】ゲーム制作:自機の操作と敵機の自動移動を同時に処理することについて SHUN 19/5/21(火) 13:26 質問[未読]
【80838】Re:ゲーム制作:自機の操作と敵機の自動移... 亀マスター 19/5/23(木) 0:59 回答[未読]
【80883】Re:ゲーム制作:自機の操作と敵機の自動移... SHUN 19/6/6(木) 19:53 お礼[未読]

【80834】ゲーム制作:自機の操作と敵機の自動移動...
質問  SHUN  - 19/5/21(火) 13:26 -

引用なし
パスワード
   VBAで自機を動かすプログラム、敵機を自動で移動するプログラムはそれぞれ組めましたが、
その2つを同時に動かす段階で躓いています。

Call '自機を動かすプログラム=aとします。
Call ’敵機を動かすプログラム=bとします。
とすると、aのプログラム終了後にbのプログラム処理となり、
1つのプロシージャ内に両方入れようとすると上手くいきません。

参考に、それぞれのソースを以下に貼り付けます。

Sub 自機発生()

Dim i As Integer
Dim j As Integer

Dim i2 As Integer
Dim j2 As Integer


Cells.Interior.ColorIndex = xlNone


  i = 10
  j = 10
  
    Cells(i, j).Interior.ColorIndex = 6
    
    
 Do
 
    '自機発生、操作
    
    If GetAsyncKeyState(37) <> 0 Then
    
    Cells(i, j).Interior.ColorIndex = xlNone
      If j <= 3 Then
      j = 17
      Else
      j = j - 1
      End If
    Cells(i, j).Interior.ColorIndex = 6
    
    End If
    
    If GetAsyncKeyState(38) <> 0 Then
    
    Cells(i, j).Interior.ColorIndex = xlNone
      If i <= 3 Then
      i = 17
      Else
      i = i - 1
      End If
    Cells(i, j).Interior.ColorIndex = 6
    
    End If
    
    If GetAsyncKeyState(39) <> 0 Then
    
    Cells(i, j).Interior.ColorIndex = xlNone
      If j >= 17 Then
      j = 3
      Else
      j = j + 1
      End If
    Cells(i, j).Interior.ColorIndex = 6
    
    End If
    
    If GetAsyncKeyState(40) <> 0 Then
    
    Cells(i, j).Interior.ColorIndex = xlNone
      If i >= 17 Then
      i = 3
      Else
      i = i + 1
      End If
    Cells(i, j).Interior.ColorIndex = 6
   
    End If
    
    If GetAsyncKeyState(13) <> 0 Then
    
    Exit Do
    
    End If
    
  DoEvents

  Sleep 90
  
  Loop


End Sub

Sub 発生()
  Dim i As Integer
  Dim j As Integer

  Randomize
  

  i = 3
  j = 15
  
  Do
  
  '敵機発生、ランダムで移動
  
    Cells(i, j).Interior.ColorIndex = xlNone

    
  If 0 <= Rnd And Rnd < 0.25 Then
    If i >= 17 Then
    i = 3
    Else
    i = i + 1
    End If
  Else
  If 0.25 <= Rnd And Rnd < 0.5 Then
    If j >= 17 Then
    j = 3
    Else
    j = j + 1
    End If
  Else
  If 0.5 <= Rnd And Rnd < 0.75 Then
    If i <= 3 Then
    i = 17
    Else
    i = i
    End If
  Else
  If 0.75 <= Rnd And Rnd < 1 Then
    If j <= 3 Then
    j = 17
    Else
    j = j - 1
    End If
 
  Cells(i, j).Interior.ColorIndex = 3
  
  End If
  
     If GetAsyncKeyState(13) <> 0 Then
    
     Exit Do
    
     End If
  
  DoEvents
  
  
  Sleep 90

 Loop


End Sub

よろしくお願いいたします。

【80838】Re:ゲーム制作:自機の操作と敵機の自動...
回答  亀マスター  - 19/5/23(木) 0:59 -

引用なし
パスワード
   シューティングゲームのようなものを作ろうとしているのだと思います。

大体の感じですが、以下のようにすればいいと思います。

Do
  'キーボードの入力状況に応じて自機の座標(i, j)を変更
  '敵機の座標(I, J)を変更
  'すべてのセルの背景色をクリア
  '自機、敵機の座標のセルの背景色を設定
Loop

すべてのセルはCellsで取得できます。

ループのたびにセルの背景色をクリア・設定しているのは、自機・敵機が動いたかどうかでセルの背景色を変更するかどうかを判定していると、処理が煩雑になるためです。
ですので、ここでは自機・敵機の座標が変わったかどうかに関係なく、ループのたびに背景色を設定し直すという方法をとっています。

自機と敵機の処理を別のプロシージャにしたいなら、それぞれのプロシージャではキーボードの入力状況や乱数による座標の変更だけの処理にして、ループや背景色の設定に関しては呼び出し元で処理するようにすればいいでしょう。


なお、質問の部分ではありませんが、敵機の移動部分でRndを使う際、この関数は呼び出すたびに違う値を返すので、If x < Rnd で呼ばれるたびに違う値が使われ、思った挙動にならない可能性がありますよ。
そうしたくないなら、Rndを呼び出すのはループの中で1回だけにして、取得した値を変数にセットし、その変数を用いて条件判定すればいいと思います。

【80883】Re:ゲーム制作:自機の操作と敵機の自動...
お礼  SHUN  - 19/6/6(木) 19:53 -

引用なし
パスワード
   とても遅れました。
色々四苦八苦した結果、セルの色付けでなく、オートシェイプを動かす術を
身に着けたら解決できました。

ありがとうございます。

347 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free