0

私は基本的にたくさんのブラック ボックスを持っており、プレーヤー (PictureBox1) に重力、落下、およびボックスをヒットさせて、それらを飛び越えなければならないようにしたい.... 私はすべての基本的な動きを持っています。コーディングする必要があります。

以下のコードはタイマーで実行されているため、常にプレーヤーを 8 ずつ押し下げており、ブロックと交差すると、反対方向に押し始めます....

すべての「ブロック」を Blocks(49) = Picturebox .. でグループ化し、個別に Blocks(1)= Pictuebox1 、 Blocks(2) = Picturebox2 を実行しました。後で...

 PictureBox1.Top += 8

    For x As Integer = 1 To 1

        If PictureBox1.Bounds.IntersectsWith(floor(x).Bounds) And floor(x).Visible = True Then
            standing = True
            PictureBox1.Top -= 1
        End If
    Next x

    For y As Integer = 1 To 49
        If PictureBox1.Bounds.IntersectsWith(blocks(y).Bounds) And blocks(y).Visible = True Then
            standing = True
            PictureBox1.Top -= 1
        End If

    Next y
4

1 に答える 1

0

すべての「ブロック」を Blocks(49) = Picturebox .. でグループ化し、個別に Blocks(1)= Pictuebox1 、 Blocks(2) = Picturebox2 を実行しました。後で...

PictureBox1 はブロックではなくプレーヤーであるため、Blocks(1)= Picturebox1 を実行しないでください ;-) また、配列は VB.NET では 0 ベースなので、インデックス 0 から開始する必要があります。フォームでは、代わりにブロックに PictureBox2、PictureBox3 などの名前を付けます。BlockPicBox1、BlockPicBox2 などの名前を付けることをお勧めします。次に、次のように配列を割り当てることができます。

Dim Blocks As PictureBox() = {BlockPicBox1, BlockPicBox2, BlockPicBox3, BlockPicBox4, ...}

コードを見てみましょう。

For x As Integer = 1 To 1
    ....
Next

このループは間違っています。すべてのフロアをループしたいとします。Count プロパティを使用して、すべてのフロアを確実にループするか、For Each ループを使用することをお勧めします。

If PictureBox1.Bounds.IntersectsWith(floor(x).Bounds) And floor(x).Visible = True Then
    standing = True
    PictureBox1.Top -= 1
End If

状態は良さそうですが、なぜ Top プロパティを -1 引くのでしょうか? キャラクターを床に立たせたいので、それに応じて Top プロパティを設定します。

また、命名にも取り組む必要があります。これにより、コードが読みやすくなります。たとえば、PictureBox1 の代わりに PlayerPicBox を使用します。また、配列には複数形を使用します (「フロア」ではなく「フロア」)。それは次のようになります:

For Each currentFloor As PictureBox in floors
    If currentFloor.Visible AndAlso PlayerPicBox.Bounds.IntersectsWith(currentFloor.Bounds) Then
        standing = True
        PlayerPicBox.Top = currentFloor.Top - PlayerPicBox.Height
    End If
Next

2 番目のループにも同じ原則が適用されます。

于 2012-12-07T14:36:07.507 に答える