C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[36]: シューティングゲームのあたり判定について


(過去ログ 86 を表示中)

[トピック内 43 記事 (1 - 20 表示)]  << 0 | 1 | 2 >>

■50677 / inTopicNo.1)  シューティングゲームのあたり判定について
  
□投稿者/ 使い魔 (6回)-(2010/06/14(Mon) 22:37:04)

分類:[VB.NET/VB2005 以降] 

vb2008で、シューティングゲームを作っている、使い魔です。
前は、アニメーションのほうでお世話になりました。
今回は、シューティングゲームのあたり判定について質問(というか、全然わかりません)があります。

@弾が発射されます。’この部分についてはすでに組み終わっています。
A弾が標的にあたっているか判断します。
Bあたっていた場合、標的・弾を見えなくします。

@〜Bが繰り返される形になります。
わからないのは、あたり判定全般です。
あと、見えなくした、標的を再認識しないために、するための方法も、ご指導いただけると嬉しいです。
引用返信 編集キー/
■50678 / inTopicNo.2)  Re[1]: シューティングゲームのあたり判定について
□投稿者/ すなふきぬ (1回)-(2010/06/14(Mon) 22:46:17)
No50677 (使い魔 さん) に返信
> vb2008で、シューティングゲームを作っている、使い魔です。
> 前は、アニメーションのほうでお世話になりました。
> 今回は、シューティングゲームのあたり判定について質問(というか、全然わかりません)があります。
>
> @弾が発射されます。’この部分についてはすでに組み終わっています。
> A弾が標的にあたっているか判断します。
> Bあたっていた場合、標的・弾を見えなくします。

フレームではなくてタイマーを使用しているようなので、Timerのイベントで、

1.弾の配列に対してループ
2.標的の配列に格納されている座標と、弾の座標を比較する。
3.当たり判定が確定した場合は、当たったアクションを描画して弾、標的を配列から削除。

この辺になればクラスを使ってコレクション管理する方が簡単ですね。
引用返信 編集キー/
■50686 / inTopicNo.3)  Re[2]: シューティングゲームのあたり判定について
□投稿者/ やじゅ (1647回)-(2010/06/14(Mon) 23:24:47)
やじゅ さんの Web サイト
> ■No50677 (使い魔 さん) に返信

処理の流れは、すなふきぬさんの回答でいいと思います。

矩形を用いた当たり判定 あたりが参考になるかな。
http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%C5%F6%A4%BF%A4%EA%C8%BD%C4%EA

引用返信 編集キー/
■50687 / inTopicNo.4)  Re[2]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (7回)-(2010/06/14(Mon) 23:26:22)
No50678 (すなふきぬ さん) に返信
> フレームではなくてタイマーを使用しているようなので、Timerのイベントで、
>
> 1.弾の配列に対してループ
> 2.標的の配列に格納されている座標と、弾の座標を比較する。
> 3.当たり判定が確定した場合は、当たったアクションを描画して弾、標的を配列から削除。
>
> この辺になればクラスを使ってコレクション管理する方が簡単ですね。

すいません、弾の配列使ってないんです。というか、使い方がわからなくて、一弾に、対して、ピクチャーボックスとタイマーを一つ一つ使用している状況なんです。

引用返信 編集キー/
■50688 / inTopicNo.5)  Re[3]: シューティングゲームのあたり判定について
□投稿者/ すなふきぬ (4回)-(2010/06/14(Mon) 23:48:52)
No50686 (やじゅ さん) に返信
>>■No50677 (使い魔 さん) に返信
>
> 処理の流れは、すなふきぬさんの回答でいいと思います。
>
> 矩形を用いた当たり判定 あたりが参考になるかな。
> http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%C5%F6%A4%BF%A4%EA%C8%BD%C4%EA

標的と弾に、個別のPictureBoxを使用しているのですね。

高速な描画が必要になる場合は、1つのPictureBoxに対してDraw系で独自に描画をする方がいいと思います。
簡単なシューティングなら、個別の管理でもいいかもしれませんが、複雑な動作や描画を行うならクラスを用意した方がコードがすっきりします。

個別のPictureBoxで処理をしているなら、LocationとSizeプロパティで当たり判定できると思います。

どのレベルのゲームを作成するかにもよりますが、FPS、サーフェス、キー入力等でぐぐれば色々なサンプルがあると思います。
引用返信 編集キー/
■50695 / inTopicNo.6)  Re[3]: シューティングゲームのあたり判定について
□投稿者/ やじゅ (1648回)-(2010/06/15(Tue) 13:13:06)
やじゅ さんの Web サイト
No50687 (使い魔 さん) に返信
> すいません、弾の配列使ってないんです。というか、使い方がわからなくて、一弾に、
> 対して、ピクチャーボックスとタイマーを一つ一つ使用している状況なんです。

うーむ、複数の弾はあとに置いておいて・・・
複数のタイマーイベントを使うのではなく、1つのタイマーイベントでゲームループという1つの流れの中で、
自機・敵機・弾を「わずかばかり動かしてループに戻す」という仕組みにした方がよいね。
http://www5f.biglobe.ne.jp/~kenmo/program/task/task2/task2.html

引用返信 編集キー/
■50742 / inTopicNo.7)  Re[4]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (8回)-(2010/06/16(Wed) 20:40:11)
No50686 (やじゅ さん) に返信
とりあえず、弾を配列にする方法が、ようやくわかりました。
その過程で、
Me.PictureBox(i).Visible = False
を組んだところ、エラーが出てしまいました。
当たり前といえば、当たり前なのですが、この問題を解決できないと
先に進めない気がします。
i = 0が、入っています。
ピクチャーボックス(弾)の配列で、iに値する位置にあるピクチャーボックスは
非表示であるかどうかを判断したい、と思っています。
何かいい解決方法はあるでしょうか。
説明たらなかったらすいません。
引用返信 編集キー/
■50743 / inTopicNo.8)  Re[5]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (9回)-(2010/06/16(Wed) 20:52:18)
すみません。
前後の関係を見たところ、相関関係が取れていないことが判明いたしました。

引用返信 編集キー/
■50745 / inTopicNo.9)  Re[6]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (10回)-(2010/06/16(Wed) 21:42:21)
Private Sub Form1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown


End Sub

下の部分を上の処理の中にcall文をつかって、入れたいと思っています。
これって、可能でしょうか。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick


End Sub
引用返信 編集キー/
■50746 / inTopicNo.10)  Re[7]: シューティングゲームのあたり判定について
□投稿者/ 魔界の仮面弁士 (1669回)-(2010/06/16(Wed) 23:03:49)
2010/06/16(Wed) 23:13:38 編集(投稿者)

No50745 (使い魔 さん) に返信
> 下の部分を上の処理の中にcall文をつかって、入れたいと思っています。
> これって、可能でしょうか。
NG です。そもそもイベントは「システムから呼び出される物」であって、
「プログラマが Call で呼び出す物」ではありません。
(呼ぶ事自体は可能ですが、プログラミングの方向性としては間違っています)

Timer1_Tick は、「x ミリ秒ごとに呼び出される」イベントハンドラですし、
Form1_PreviewKeyDown は、「キー押下時に呼び出される」イベントハンドラです。

それぞれは別のタイミングで呼ばれる物であり、一方から Call するものではありません。
-------

質問の答えになっているかどうかは分かりませんが、とりあえず、
Form1_PreviewKeyDown と Timer1_Tick を使ったサンプルを書いてみました。
フォームに Label と Timer を貼って、下記を実行してみて下さい。

ラベルがゆっくりと左右に行ったり来たりしていますが、スペースバーを叩くと
ラベルが逆方向に移動するという物です。

Public Class Form1
 Private IsReverse As Boolean = False

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  Label1.Text = "■"
  Label1.Location = Point.Empty
  Timer1.Interval = 1
  Timer1.Start()
 End Sub

 Private Sub Form1_PreviewKeyDown(ByVal sender As Object, ByVal e As PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown
  If e.KeyCode = Keys.Space Then
   IsReverse = Not IsReverse
  End If
 End Sub

 Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
  If IsReverse Then
   If Label1.Left > 1 Then
    Label1.Left -= 1
   Else
    Label1.Left = 0
    IsReverse = False
   End If
  Else
   If Label1.Right < Me.Width - 1 Then
    Label1.Left += 1
   Else
    Label1.Left = Me.Width - Label1.Width
    IsReverse = True
   End If
  End If
 End Sub
End Class
引用返信 編集キー/
■50786 / inTopicNo.11)  Re[8]: シューティングゲームのあたり判定について
□投稿者/ 米村貴祐 (2回)-(2010/06/17(Thu) 21:12:02)
Option Strict On
Option Explicit On
'VisualBasic2010_ブロック崩し
'Timer1コンポーネントを入れる
Imports System.Drawing.Drawing2D

Public Class Form1
'ブロック
Const block_suu% = 48 'ブロック総数
Dim block_life(block_suu - 1) As Boolean 'ブロック表示on_off
Dim block_x(block_suu - 1) As Integer 'ブロック左角横位置
Dim block_y(block_suu - 1) As Integer 'ブロック左角縦位置
'ブロック&ボールの色
Dim brush_1 As LinearGradientBrush = New LinearGradientBrush(New Rectangle(0, 0, 300, 150), Color.Aqua, Color.Blue, 90)
Dim brush_2 As LinearGradientBrush = New LinearGradientBrush(New Rectangle(0, 0, 300, 20), Color.Red, Color.White, 90)
'ボール
Dim boul_x% : Dim boul_y% 'ボールの位置
Dim boul_x_speed% : Dim boul_y_speed% 'ボールの速さ
Dim boul__x_muki As Boolean : Dim boul_y_muki As Boolean 'ボールの向き
'乱数
Dim my_random As Random = New Random

Public Sub New()

' この呼び出しはデザイナーで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後で初期化を追加します。

Me.Size = New Size(300, 300)
Me.BackColor = Color.Black
Me.StartPosition = FormStartPosition.CenterScreen
Me.Text = "Reo.Co.Jp"
Me.MinimizeBox = False
Me.MaximizeBox = False
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
game_clear()
Timer1.Interval = 1
Timer1.Enabled = True
Me.DoubleBuffered = True
End Sub
Sub game_clear()
'ブロックの初期化
Dim a% : Dim b%
For i = 0 To block_suu - 1
block_x(i) = a * 35 + 5
block_y(i) = b * 20 + 10
block_life(i) = True
a += 1 : If a = 8 Then a = 0 : b += 1
Next
'ボールの初期化
boul_x = 140 : boul_y = 230
boul_random()
boul__x_muki = True : boul_y_muki = False
End Sub
Sub boul_random()
'ボールのスピード初期化
boul_x_speed = my_random.Next(1, 3)
boul_y_speed = my_random.Next(1, 3)
End Sub
Sub block_hyouji(ByVal g As Graphics, ByVal x%, ByVal y%)
'ブロック表示
g.FillRectangle(brush_1, x, y, 30, 15)
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim map As Bitmap = New Bitmap(Width, Height)
Dim g As Graphics = Graphics.FromImage(map)
g.SmoothingMode = SmoothingMode.AntiAlias
'ブロック表示
For i = 0 To block_suu - 1
block_hyouji(g, block_x(i), block_y(i))
Next
'ボール表示
g.FillEllipse(brush_2, boul_x, boul_y, 15, 15)
'ボールの処理(外壁)
If boul__x_muki = True Then boul_x += boul_x_speed
If boul_x > 270 Then boul__x_muki = False : boul_random()
If boul__x_muki = False Then boul_x -= boul_x_speed
If boul_x < -3 Then boul__x_muki = True : boul_random()
If boul_y_muki = False Then boul_y -= boul_y_speed
If boul_y < -3 Then boul_y_muki = True : boul_random()
If boul_y_muki = True Then boul_y += boul_y_speed
If boul_y > 248 Then boul_y_muki = False : boul_random()
'ボールの処理(ブロック接触)
'
'ここが!!!知りたいですか?!!!
'ぼくは、忙しいので、明日か明後日に書きますよ。

Me.BackgroundImage = map
g.Dispose()
End Sub

End Class

引用返信 編集キー/
■50790 / inTopicNo.12)  Re[9]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (11回)-(2010/06/17(Thu) 22:02:37)
Private Sub Form1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown

Select Case e.KeyCode


Case Keys.Up
imgMain.Top = imgMain.Top - 50
Case Keys.Down
imgMain.Top = imgMain.Top + 50
Case Keys.Left
imgMain.Left = imgMain.Left - 50
Case Keys.Right
imgMain.Left = imgMain.Left + 50
Case Keys.Space
k = 0
Do Until b = 1
If TAMA(k).Visible = False Then
TAMA(k).Visible = True
Me.Timer1.Enabled = True
b = 1
Else
k = k + 1
End If
Loop
b = 0
End Select

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If TAMA(k).Top <= 0 Then
TAMA(k).Enabled = False
TAMA(k).Visible = False
Else
TAMA(k).Top = TAMA(k).Top - 40
End If

End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
TAMA(a).Top = TAMA(a).Top -30
End Sub

自力でこんな感じなんですけど。(結構省略して載せました)
わからないのは、(k)と(a)の値を一緒にしたいのですが、それをどうやったらいいのか、ということです。





引用返信 編集キー/
■50829 / inTopicNo.13)  Re[10]: シューティングゲームのあたり判定について
□投稿者/ やじゅ (1654回)-(2010/06/19(Sat) 08:41:31)
やじゅ さんの Web サイト
No50790 (使い魔 さん) に返信

がんばんって、タイマーイベントは全体(自機、弾、敵機)で1つにしましょうよ。

引用返信 編集キー/
■50836 / inTopicNo.14)  Re[11]: シューティングゲームのあたり判定について
□投稿者/ 米村貴祐 (3回)-(2010/06/19(Sat) 19:56:28)

> ■No50790 (使い魔 さん) に返信
>
ほら、面白いよ。
修正とかは、後付けでよい。○
ああ、シューティングでしたか。
じゃあ、次回はシューティングにしようかな?あはは。
Option Strict On
Option Explicit On
'VisualBasic2010_ブロック崩し
'手順
'Timer1コンポーネントを先に入れてからコードをすべて消す
'すべてのコードをコピーして貼りつける
'手順ミスだと機能しない

Imports System.Drawing.Drawing2D

Public Class Form1
'ブロック
Const block_suu% = 240 'ブロック総数
Dim block_life(block_suu - 1) As Boolean 'ブロック表示on_off
Dim block_x(block_suu - 1) As Integer 'ブロック左角横位置
Dim block_y(block_suu - 1) As Integer 'ブロック左角縦位置
'ブロック&ボールの色
Dim brush_1 As LinearGradientBrush = New LinearGradientBrush(New Rectangle(0, 0, 300, 640), Color.Yellow, Color.Blue, 90)
Dim brush_2 As LinearGradientBrush = New LinearGradientBrush(New Rectangle(0, 0, 300, 20), Color.Red, Color.White, 90)
'ボール
Dim boul_x% : Dim boul_y% 'ボールの位置
Dim boul_x_speed% : Dim boul_y_speed% 'ボールの速さ
Dim boul__x_muki As Boolean : Dim boul_y_muki As Boolean 'ボールの向き
'乱数
Dim my_random As Random = New Random

Public Sub New()

' この呼び出しはデザイナーで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後で初期化を追加します。

Me.Size = New Size(300, 700)
Me.BackColor = Color.Black
Me.StartPosition = FormStartPosition.CenterScreen
Me.MinimizeBox = False
Me.MaximizeBox = False
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
game_clear()
Me.DoubleBuffered = True
Timer1.Interval = 1
Timer1.Start()
'ボールの初期化
boul_x = 140 : boul_y = 230
boul_random()
boul__x_muki = True : boul_y_muki = False
End Sub

Sub game_clear()
'ブロックの初期化
Dim a% : Dim b%
For i = 0 To block_suu - 1
block_x(i) = a * 35 + 5
block_y(i) = b * 20 + 10
block_life(i) = True
a += 1 : If a = 8 Then a = 0 : b += 1
Next
'ボールの初期化
boul_x = 140 : boul_y = 230
boul_random()
boul_muki_random: boul_y_muki = False
End Sub

Sub boul_random()
'ボールのスピード初期化
boul_x_speed = my_random.Next(1, 3)
boul_y_speed = my_random.Next(1, 3)
End Sub
Sub boul_muki_random()
Dim x% : x = my_random.Next(2)
If x = 0 Then boul__x_muki = True Else boul__x_muki = False
End Sub
Sub block_hyouji(ByVal g As Graphics, ByVal x%, ByVal y%)
'ブロック表示
g.FillRectangle(brush_1, x, y, 30, 15)
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim map As Bitmap = New Bitmap(Width, Height)
Dim g As Graphics = Graphics.FromImage(map)
g.SmoothingMode = SmoothingMode.AntiAlias
'ブロック表示
For i = 0 To block_suu - 1
If block_life(i) = True Then
block_hyouji(g, block_x(i), block_y(i))
End If
Next
'ボール表示
g.FillEllipse(brush_2, boul_x, boul_y, 15, 15)
'ボールの処理(外壁)
If boul__x_muki = True Then boul_x += boul_x_speed
If boul_x > 270 Then boul__x_muki = False : boul_random()
If boul__x_muki = False Then boul_x -= boul_x_speed
If boul_x < -3 Then boul__x_muki = True : boul_random()
If boul_y_muki = False Then boul_y -= boul_y_speed
If boul_y < -3 Then boul_y_muki = True : boul_random()
If boul_y_muki = True Then boul_y += boul_y_speed
If boul_y > 648 Then boul_y_muki = False : boul_random()
'ボールの処理(ブロック接触)
For i = 0 To block_suu - 1
If block_life(i) = True Then
'ブロックに当たったか?の判定
'接触_上
If (boul_x > block_x(i) And boul_x < block_x(i) + 30) Or (boul_x + 15 > block_x(i) And boul_x + 15 < block_x(i) + 30) Then
If (boul_y > block_y(i) And boul_y + 15 < block_y(i) + 10) Or (boul_y + 15 > block_y(i) And boul_y + 15 < block_y(i) + 10) Then
block_life(i) = False : boul_y_muki = False : boul_muki_random() : boul_random()
End If
End If
'接触_下
If (boul_x > block_x(i) And boul_x < block_x(i) + 30) Or (boul_x + 15 > block_x(i) And boul_x + 15 < block_x(i) + 30) Then
If (boul_y > block_y(i) + 9 And boul_y + 15 < block_y(i) + 18) Or (boul_y + 15 > block_y(i) + 9 And boul_y + 15 < block_y(i) + 18) Then
block_life(i) = False : boul_y_muki = True : boul_muki_random() : boul_random()
End If
End If
End If
Next
Me.BackgroundImage = map
g.Dispose()
'点数
Dim a%
For i = 0 To block_suu - 1
If block_life(i) = False Then a += 1
Next
Me.Text = "Score__" + (a * 10).ToString
End Sub

End Class


引用返信 編集キー/
■50980 / inTopicNo.15)  Re[12]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (12回)-(2010/06/22(Tue) 22:49:20)
2010/06/22(Tue) 22:49:55 編集(投稿者)

はあはあ、何とか自力(検索含む)で、ここまできました。

Public Class Form1
Dim TEKI(36) As System.Windows.Forms.PictureBox
Const KName As String = "PictureBox"
Dim TAMA(6) As System.Windows.Forms.PictureBox
Const TName As String = "PictureBox"
Dim Timer(6) As System.Windows.Forms.Timer
Const MName As String = "Timer"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Left As Integer = 0
Dim Top As Integer = 0
For l As Integer = 0 To 5
For t As Integer = 0 To 7
TEKI(t) = New PictureBox
TEKI(t).Parent = Me
With TEKI(t)
.Name = KName & t
.Tag = t
.Top = Top
.Left = Left
Left += 170
.Image = Image.FromFile("C:\Users\name\Documents\teki.gif")
.Visible = True
.SizeMode = PictureBoxSizeMode.AutoSize
End With
Next
Left = 0
Top += 90
Next
For suu As Integer = 0 To 5
TAMA(suu) = New PictureBox
TAMA(suu).Parent = Me
With TAMA(suu)
.Name = TName & suu
.Tag = suu
.Top = imgMain.Top - 40
.Left = imgMain.Left - 40
.Visible = False
End With
Next
For v As Integer = 0 To 5
Timer(v) = New Timer
With Timer(v)
.Interval = 5000
.Enabled = False
End With
AddHandler Timer(v).Tick, AddressOf Subtimer_Tick
Next

Me.WindowState = FormWindowState.Maximized
End Sub

Private Sub Form1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown
Select Case e.KeyCode
Case Keys.Up
imgMain.Top = imgMain.Top - 50
Case Keys.Down
imgMain.Top = imgMain.Top + 50
Case Keys.Left
imgMain.Left = imgMain.Left - 50
Case Keys.Right
imgMain.Left = imgMain.Left + 50
Case Keys.Space
For b As Integer = 0 To 5
If TAMA(b).Visible = False Then
With TAMA(b)
.Visible = True
.Top = imgMain.Top
.Left = imgMain.Left + 24
.SizeMode = PictureBoxSizeMode.AutoSize
.Image = Image.FromFile("C:\Users\name\Documents\tama.gif")
End With
With Timer(b)
.Enabled = True
End With
End If
Next
End Select
End Sub

Private Sub Subtimer_Tick(ByVal myObject As Object, ByVal e As EventArgs)
For k As Integer = 0 To 5
If TAMA(k).Visible = True Then
If TAMA(k).Top <= Me.Top Then
TAMA(k).Top -= 40
Else
TAMA(k).Visible = False
Timer(k).Enabled = False
End If
End If
Next
End Sub
End Class

まだ、タイマー処理が完了していないのですが。
タイマーの配列は見ての通り、6個あります。
タイマーを配列化した後の動かし方が本格的にわかりません。
Startか、それともEnableを使えばいいのでしょうか。
引用返信 編集キー/
■51033 / inTopicNo.16)  Re[13]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (13回)-(2010/06/23(Wed) 19:50:59)
スペースキーを押したときに、弾を表示し、その弾の配列の番号?とおなじ、タイマーの配列をスタートさせます。
その後、弾のトップをタイマーを利用して減らしていって、フォームのトップ以下になったとき、弾を非表示とし、タイマーも停止させます。
わからなくなっているのは、タイマーを配列化した後、どうやって、それぞれを動かしていき、その後停止させるかです。
どなたか教えていただけませんでしょうか。
引用返信 編集キー/
■51038 / inTopicNo.17)  Re[14]: シューティングゲームのあたり判定について
□投稿者/ επιστημη (2518回)-(2010/06/23(Wed) 23:37:56)
επιστημη さんの Web サイト
> わからなくなっているのは、タイマーを配列化した後、どうやって、それぞれを動かしていき、その後停止させるかです。
> どなたか教えていただけませんでしょうか。

TimerのEnabledプロパティで開始/停止できるす。

引用返信 編集キー/
■51092 / inTopicNo.18)  Re[15]: シューティングゲームのあたり判定について
□投稿者/ 使い魔 (14回)-(2010/06/24(Thu) 18:51:33)
ちょっと説明不足のところがあったので、ご理解いただけなかったようですが。(というか、ちょっと内容を間違えたかもしれません。)
Enabledプロパティによって、開始/停止できるのはわかります。

Private Sub Subtimer_Tick(ByVal myObject As Object, ByVal e As EventArgs)
If TAMA(k).Visible = True Then      ここより下のkの値をスペースが押されたときに表示された。弾の配列の番号を一致させたいのです。
If TAMA(k).Top <= Me.Top Then       つまり、スペースを押したときの配列番号をそのまま引き継いで使いたいのです。
TAMA(k).Top -= 40             保存用のラベルを使用することも考えたのですが。もっと簡単にできないものでしょうか。
Else                   今のところ、デバッグをかけると弾が表示され動かない状態を保ってしまっています。
TAMA(k).Visible = False          あと、subtimerというのは、配列化したタイマーすべての処理を分けて管理するという形になっているのでしょうか。
Timer(k).Enabled = False         それとも、subtimer(a)のようにしたほうがいいものなのでしょうか。
End If
End If
End Sub

引用返信 編集キー/
■51098 / inTopicNo.19)  Re[16]: シューティングゲームのあたり判定について
□投稿者/ やじゅ (1661回)-(2010/06/24(Thu) 20:18:03)
やじゅ さんの Web サイト
2010/06/25(Fri) 00:12:06 編集(投稿者)

No51092 (使い魔 さん) に返信

複数の弾の速度が全て同じなら、タイマーは1つでいいんじゃないの

スペースキーを押したら弾のタイマーを開始するって方式をやめる。
タイマーは常に動かしたままで、弾の移動と表示のオンとオフのみ制御

本の片隅に絵を描いてパラパラマンガを作成したとする。
ページめくりは一定(タイマー)でも、中の絵は動いている。

引用返信 編集キー/
■51099 / inTopicNo.20)  Re[17]: シューティングゲームのあたり判定について
 
□投稿者/ 山田祥 (1回)-(2010/06/24(Thu) 20:24:24)
うむ。確かに。カニカニ。

小さな家を建てるだけなのに、全長100メートルのクレーンを使用してるような感じがする。
小さな家は、「かなずち」を使用しましょう。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 >>

管理者用

- Child Tree -