Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

1

06.10.2008, 21:17

Spieler zwischen zwei Objekten

Hallo zusammen

Ich bin dabei, auf einem WoW Server (mangos,scriptdev2,udb) den Boss Netherspite zu programmieren.
Dieser Boss spawnt nun 3 Portale um sich herum welche jeweils einen Strahl auf den Boss richten. Dadurch bekommt der Boss einen Buff (Zauber) auf sich welcher ihn stärker macht. Nun soll sich der Spieler zwischen das Portal und den Boss stellen, damit der Strahl auf ihn geht.
Mein Problem ist nun, wie kann ich herrausfinden, ob ein Spieler im Strahl steht (der Strahl ist kein Objekt, der wird dynamisch von der mangoscore gezeichnet)?

Die momentane Formel sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
i_dist = m_creature->GetDistance(pUnit);
i_boss_dist = NetherSpite->GetDistance(pUnit);
if( i_dist + i_boss_dist <= boss_dist + 2 && i_dist < cur_dist && i_boss_dist < boss_dist) {
  // ...

}


pUnit ist der Spieler, das Programm geht alle Spieler im Umfeld durch (ebenfalls Funktion von Mangos). m_creature ist das Portal und NetherSpite ist der Boss. i_dist ist die Distanz des Portals zum Spieler und i_boss_dist die Distanz vom Boss zum Spieler.
Das Problem an dieser Formel ist, dass der Spieler genau auf der Linie stehen muss, d.h. 0.0% Abweichung haben darf, und dies ist einfach schlicht nicht möglich.

Noch zur Info: der Code stammt nicht von mir, den gab es bereits, aber es war nur ein Anfang und bis jetzt hat ihn noch niemand weiterentwickelt.

Ich habe nun mal im Forum von ScriptDev2 (da werden alle Bosse etc. gescriptet) gesucht und einen Thread gefunden, wo schon mal jemand diese Frage hatte. Er erhielt dann auch eine gute Antwort mit einer schönen Formel. Das Problem ist nun, dass mir diese Formel zu kompliziert ist (ich versteh sie nicht :().

Hier mal der Post aus dem Forum:

Zitat von »"http://forums.scriptdev2.com/index.php?showtopic=3240"«

Suppose you have the two mob's positions given by (M1_x, M1_y) for mob 1 and (M2_x, M2_y) for mob 2, and the player given by (P_x, P_y). The midpoint of the two mobs is ( (M1_x+M2_x)/2, (M1_y+M2_y)/2 ). So if you want to test if the player is in a circle of radius r centered at the midpoint, you can test:

( P_x - ( M1_x + M2_x )/2 )^2 + ( P_y - ( M1_y + M2_y )/2 )^2 <= r^2

That should help remove some of the exactness of where you must be standing. You could even make the radius r be a function of how far apart the two mobs are... Perhaps a logistic curve so that the radius is not too small as the mobs get close together, yet is not infinitely getting larger as the mobs spread apart. Are there any simple functions with non-zero values at x=0, but converge to a linear function as x increases? Perhaps a piecewise function could be used for r, or even some series with those characteristics.

Edit:
I realized that the player doesn't have to be centered between the two mobs.. Just between them.. Similarly, you could check:

d >= abs( P1_x + P2_x * (M1_x+M2_x) / (M2_y) / (1-M1_y/M2_y) - M1_x - (M1_y/M2_y) * (M1_x+M2_x) / (1-M1_y/M2_y) ) / sqrt (1 + ((M1_x+M2_x) / (M2_y) / (1 - M1_y/M2_y))^2)

I'm sure that simplifies, but I'm too lazy to work through it right now. Just worked it out quickly in Notepad. If anyone has access to Mathematica or a pen-and-paper, they may get better results on this slightly more complicated equation. Comes from finding the line between the two mobs in the form Ax+By+C=0 and then using the formula for the perpendicular distance to (m,n):

d = abs( m*A + n*B + C) / sqrt( A^2 + B^2)


Ich verstehe hier leider nicht, wie sich diese Formel nun anwenden lässt und hoffe, dass mir da einer von euch weiterhelfen kann.

Hinweis für alle die selbst den Mangos und den ScriptDev2 Code haben: es handelt sich hierbei um das File ScriptDev2/Scripts/zone/Karazhan/boss_netherspite.cpp

Danke schonmal
DasBlub

neido

Treue Seele

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

2

06.10.2008, 22:23

Dafür brauchst du grundlegende Kenntnisse von Vektoren.
Ab wann verstehst du es denn nicht?

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

3

06.10.2008, 22:35

also die erste formel versteh ich, aber ab der zweiten wirds für mich komisch... woher nimmt er z.b. P2_x und was ist mit P1_y ? und die dritte sagt mir schon gar nichts mehr :(

naja vektoren kenn ich mich ein bisschen aus, habe es aber leider noch nicht gehabt (werde es aber in ca. 2 wochen in der schule anfangen).

die erste formel könnte ich implementieren, da ist aber das problem, dass der spieler in der mitte des strahls stehen müsste, was auch nicht der sinn der sache wäre...

4

06.10.2008, 23:58

Satz des Phytagoras, normale Mittelpunksberechnung ... joa das war's schon ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige