Vielen Dank erstmal für eure Hilfe.
Ich habs jetzt durch diverse Quellen geschafft das ganze funktionierend umzusetzen.
Mein einziges Problem ist die Kollision.
Ich habe ein Maparray mit 3 dimensionen. DIe 3. Dimension gibt den Layer an. Auf Layer 2 liegen die Kollisionen.
Das Problem ist halt, das ganze Pixelgenau zu prüfen. Was erschwerend hinzukommt: Der Spieler wird zur Maus ausgerichtet und seine Bewegung dann mit Sinus und Cosinus berechnet.
Der Kollision wegen lass ich dann einfach die neue Position auf die Mapvariablen umrechnen und schaue nach ob an dieser Stelle im 2. Layer eine Kollision ist oder nicht.
Das klappt, wenn sich entsprechendes Tile über oder links vom Player befindet. Wenn es unter oder rechts von ihm ist dann schlägt die Kollision immer ein Tile später an.
Ich hab hier einfach mal den COde dazu:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
Method Move(pscrollx:Float, pscrolly:Float)
fAngle = ATan2(fX - MouseX() - pscrollx, MouseY() + pscrolly - fY)
Local iNumberOfKeys:Int = KeyDown(Key_w) + KeyDown(key_a) + KeyDown(key_s) + KeyDown(Key_d)
Local fOldX:Float = fx
Local fOldy:Float = fy
Local fNewx:Float = fx, fNewy:Float = fy
'
'
If KeyDown(KEY_W) Then
fNewx = (fX - Sin(fAngle) * (fSpeed / iNumberOfKeys))
fNewy = (fY + Cos(fAngle) * (fSpeed / iNumberOfKeys))
EndIf
'Links
If KeyDown(KEY_A) Then
fNewx = (fX + Sin(fAngle + 90) * (fSpeed / iNumberOfKeys))
fNewy = (fY - Cos(fAngle + 90) * (fSpeed / iNumberOfKeys))
EndIf
'Rechts
If KeyDown(KEY_D) Then
fNewx = (fX - Sin(fAngle + 90) * (fSpeed / iNumberOfKeys))
fNewy = (fY + Cos(fAngle + 90) * (fSpeed / iNumberOfKeys))
EndIf
'Nach hinten
If KeyDown(KEY_S) Then
fNewx = (fX + Sin(fAngle) * (fSpeed / iNumberOfKeys))
fNewy = (fY - Cos(fAngle) * (fSpeed / iNumberOfKeys))
EndIf
Local MapX:Int = fnewx / itilesize
Local mapy:Int = fnewy / itilesize
If (MapX < iMapwidth - 1) And (MapX > - 1) Then
If (mapy < iMapheight - 1) And (mapy > - 1) Then
If (iGameMap[MapX, mapy, 2] = 0) Then
fX = fNewx
fY = fNewy
EndIf
EndIf
EndIf
If (fX < 0) Then fX = 0
If ((fX / iTilesize) > iMapwidth - 1) Then fX = ((iMapwidth - 1) * iTilesize)
If (fY < 0) Then fY = 0
If ((fY / iTilesize) > iMapheight - 1) Then fY = ((iMapheight - 1) * iTilesize)
End Method
|
Ich weiß nicht, aber wäre schön wenn da jemand was wüsste.
Lg, M0rgenstern