[vb+dx] character movement

Pagina: 1
Acties:

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Yep, ik ben ook maar is begonnen met DirectX, ik heb net een progseltje gebouwd wat je hier kunt downloaden.
Alleen ik heb nu te kampen met één probleempje en ik hoop dat jullie mij er bij kunnen helpen, de map van het spel (voor zover je het spel kunt noemen) is opgedeeld in 9 fictionele rechthoeken, als de speler klikt in de eerste rechthoek (links-boven dus) dan verplaatst de map naar linksboven, klikt de speler in de 6e rechthoek (rechts) dan verplaatst de map naar rechts.

Als de speler echter in de middelste rechthoek klikt is het de bedoeling dat het spelkarakter zich alleen verplaatst, en NIET de map zoals eerdergenoemd.
Dit zal op zich geen probleem zijn, ik moet echter wel de directie uitrekenen waarheen het karakter gaat omdat de animatie van het spelkarakter daar aan aangepast moet worden.
Dat heb ik getracht te doen door de hoek te berekenen tussen het spelkarakter en de plaats waar de muis is.
Maar die waarde is echter niet absoluut want wanneer de afstand ook maar iets veranderd, veranderd de hoek in een aantal gevallen in een vrij onlogische waarde, zodat ik niet kan detecteren wat voor directie het spelkarakter uitgaat....
Ik meen dat hier een andere mathematische(?) methode voor moet zijn om dit in een juiste manier te berekenen.
Zelf ben ik niet echt een ster in de wiskunde, dus hierbij doe ik een beroep op jullie wiskundige kennis ;)

Hieronder staat het stukje code dat de hoek berekend
code:
1
2
Dim Angle As Double
Angle = R2D(Atn((Mouse.mousePos.pY - CharArray(1).pPos.pY) / (Mouse.mousePos.pX - CharArray(1).pPos.pX)))

*

ik heb het ook nog op een andere manier geprobeerd, namelijk deze:
code:
1
2
3
4
5
6
Dim Angle As Double, DiffX As Long, DiffY As Long
Angle = Atn((Mouse.mousePos.pY - CharArray(1).pPos.pY) / (Mouse.mousePos.pX - CharArray(1).pPos.pX))) 
   
If Angle < 0 Then Angle = Angle + Pi
    
GetAngle = R2D(Angle)

*

* R2D is een functie die de radialen converteerd naar graden, Atn is de functie voor de ArcTangent (Boog tangens)

Verder moet er nog een hoop gebeuren aan de engine, oa.
• Pathfinding (A* Algoritme of Dijkstra's algoritme)
• Padding en doppler effect in geluid
• Perfect collision detection
• Hardware enumeration voor Direct3D (items, NPC's wil ik 3d maken)
• Interface

Ohja, de resolutie in het spel kan getweaked worden met F2 (maar dit is nog wel buggy)

Hier nog enkele specs die minimaal nodig zijn om het progsel te startten:
• DirectX 7 of hoger
• VB Runtimes (anders krijg je een mooie ActiveX error)

Als laatste hoop ik jullie te vermaken met een screenshot (dit is ook de enige, want verder is er niet veel te zien :D)
Afbeeldingslocatie: http://raiden.remoteserver.org/1.gif

ps.
Als je in de 'game' in de middelste rechthoek klikt dan krijg je de hoek in graden te zien van het karakter en de muis, en kopieer het font wat in de directory staat naar je windows-font map om wat redelijke fonts te zien te krijgen.

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
huh? meer dan 30 downloads en niemand die ook maar iets weet :?

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Hmm, niet vaak dat ik iemand zie posten op Lucky's en hier :), topic kwam me opeens zo bekend voor, maar dan in het Nederlands (Als moderator op Lucky's lees ik namelijk ook alles :)) :P

Anyway, Misschien helpt dit?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Const convertDegrees = (180 / pi)

Public Function CalculateAngle(SourceX As Long, SourceY As Long, DestX As Long, DestY As Long) As Single
    On Local Error GoTo ErrorHandler
    
    If DestX > SourceX Then
      CalculateAngle = 90 + Atn((DestY - SourceY) / (DestX - SourceX)) * convertDegrees
    Else
      CalculateAngle = -90 + Atn((DestY - SourceY) / (DestX - SourceX)) * convertDegrees
    End If

    If CalculateAngle > 0 Then CalculateAngle = 360 + CalculateAngle
    If CalculateAngle > 360 Then CalculateAngle = CalculateAngle - 360

Exit Function
ErrorHandler:
    If Err.Number <> 11 And Err.Number <> 6 Then 'division by zero
      Call ReturnError(strModuleName, "CalculateAngle", Err.Number)
    End If
End Function