Oppure

Loading
01/10/11 10:37
GN
Allora, sto sviluppando un gioco in 3D con DirectX9 in VB.NET e sto implementando la gestione delle collisioni. Ho scritto questo codice, che però non va:
    Function Collisione(ByVal mesh1 As oggX, ByVal mesh2 As List(Of oggX)) As Boolean
        For Each i As oggX In mesh2
            If CollisioneOggetto(mesh1, i) Then
                Return True
                Exit Function
            End If
        Next
        Return False
    End Function

    Sub BoundingBox(ByVal corrMesh As oggX, ByRef min As Vector3, ByRef max As Vector3)
        Dim descr As VertexBufferDescription = corrMesh.mesh.VertexBuffer.Description
        Dim vertexData As GraphicsStream = corrMesh.mesh.VertexBuffer.Lock(0, 0, LockFlags.ReadOnly)
        Geometry.ComputeBoundingBox(vertexData, corrMesh.mesh.NumberVertices, descr.VertexFormat, min, max)
        corrMesh.mesh.VertexBuffer.Unlock()
        Return
    End Sub

    Function CollisioneOggetto(ByVal m1 As oggX, ByVal m2 As oggX) As Boolean
        Dim min1 As New Vector3()
        Dim max1 As New Vector3()
        Me.BoundingBox(m1, min1, max1)
        Dim min2 As New Vector3()
        Dim max2 As New Vector3()
        Me.BoundingBox(m2, min2, max2)
        Dim r1 As New RectangleF(min1.X, min1.Z, max1.X - min1.X, max1.Z - min1.Z)
        Dim r2 As New RectangleF(min2.X, min2.Z, max2.X - min2.X, max2.Z - min2.Z)
        Return r1.IntersectsWith(r2)
    End Function

La funzione Collisione() dovrebbe restituirmi un booleano che indichi se un oggetto passato come parametro sia in collisione con anche uno solo di quelli passati nell' altro parametro, ma non funziona. La struttura oggX non contiene altro che una mesh e qualche altra informazione:
Public Structure oggX
    Public pos As Vector3
    Public rot As Vector3
    Public mesh As Mesh
    Public numX As Integer
    Public tex() As Texture
    Public mat() As Material
End Structure

Grazie mille a chiunque mi aiuterà.

EDIT 1: dimenticavo di dire che ho usato i Rectangle perchè le collisioni mi bastano in 2D perchè gli oggetti hanno tatti la stessa posizione so Y.

EDIT 2: ho notato che avevo fatto una cavolata, cioè:
Me.BoundingBox(m1, min1, max1)
Me.BoundingBox(m2, min1, max1)

invece che
Me.BoundingBox(m1, min1, max1)
Me.BoundingBox(m2, min2, max2)

Però non ho risolto.
Ultima modifica effettuata da GN 03/10/11 19:51
aaa
01/10/11 10:50
HeDo

con tutti i motori fisici che integrano già la collisione detection perchè stare a riscrivercela?
aaa
01/10/11 23:23
Thejuster
Se vuoi prova ad usare il mio sistema.

hai una lista di oggetti esempio


list<ogg> Oggetti  = new <ogg>();
struct ogg {

public int id;
public int x;
public int y;
}




ti basta fare semplicemente in questo modo

Se oggetto in movimento e nell'area dell'oggetto della lista[n]
x >= x && X <= x + width stessa cosa per asse Y allora restitusce true


int coll = false;

void rendering() {


for( int i = 0; i < Oggetti.Count; i++) {

if(player.x >= Oggetti[i].x && player.x <= Oggetti.x + width && player.y >= Oggetti[i].y && player.y <= Oggetti[i].y + Height) 
{

coll = true; //Collisione
}

}

}



Width e Height sarebbe la grandezza dell'oggeto che player il và ad interscarsi con l'oggetti statico: Guarda grafico



Oggetti.Y
Oggetti.X |-----------------| Oggetti.X + Width
| Player | |
| <== |
| |
|____________|
Oggetti.Y + Height
mire.forumfree.it/ - Mire Engine
C# UI Designer
02/10/11 11:16
Il Totem
Non so quale struttura Rectangle tu stia usando, ma di solito il terzo e il quarto parametro sono width e height, corrispondenti a |max1.X - min1.X| e |max1.Z - min1.Z|, non alla somma.
aaa