Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
mám 2 body - výchozí A a cílový B. Potřebuji plynule přenést dělové koule z A do B. Ale ne po přímce, ale spíše takovým obloučkem - prostě tak jak děla střílí. Rád bych se vyhnul výpočtům náročných na výkon - protože se mi tu již dost počtů sčítá - a s výkonem začínám mít problémy... Děkuji.

Aktuálně střílím po přímce a s dost neefektivní veličinou - t (proměnná frame):

if (frame < 1) {

    fireCoordinates = [ oponentCoordinates[0] + fireVector[0] * frame, oponentCoordinates[1] + fireVector[1] * frame ];

    graphics.drawImage(images['fireImg'], fireCoordinates[0], fireCoordinates[1]);

    frame += 0.1;
}
 
Odpovědět 23.12.2012 18:41
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Jako "oblouček" bys raději parabolu nebo balistickou křivku? Ta druhá se ti bude hodit, pokud budeš mít ve hře i vítr. Také je realističtější.

Nahoru Odpovědět 23.12.2012 18:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Jestli půjde ta balistická střela bez náročných operací, tak proč ne - že... Moc jsem o fyzikálním modelu hry nepřemýšlel...

 
Nahoru Odpovědět 23.12.2012 18:50
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Výstřel z děla je vrh šikmý, dráhou ve vakuu je parabola. Vystačíš si s násobením a sčítáním.

Pokud chceš skutečnou balistickou křivku, v každém kroku spočítáš absolutní hodnotu rozdílu rychlosti střely a větru. Z toho spočítáš brzdný vektor, který odečteš od vektoru rychlosti střely.

Napsal jsem to hodně zjednodušeně, ale pro hru by to mohlo stačit.

Nahoru Odpovědět 23.12.2012 19:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Tak sám vidíš, jak to mám:

oponentCoordinates je bod ležící na přímce - spojuje vektor s jedinou přímkou - jedná se o pozici lodi v době výstřelu

fireVector - vektor z oponentCoordinates a místa kliknutí

Jak by jsi z toho tedy vycházel? Děkuji.

Editováno 23.12.2012 19:06
 
Nahoru Odpovědět 23.12.2012 19:05
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

http://www.itnetwork.cz/…ni-pole-zeme - koukni dolů, máš tam vše potřebné.

EDIT: Koukám, že vzorec tam z nějakého důvodu neni :[ Takže wiki: http://cs.wikipedia.org/…%A1ikm%C3%BD

Editováno 23.12.2012 19:10
Nahoru Odpovědět 23.12.2012 19:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

Splodil jsem:

if (fireCoordinates[0] != oponentCoordinates[0] + fireVector[0] || fireCoordinates[1] != oponentCoordinates[1] + fireVector[1]) {

    fireCoordinates = [ oponentCoordinates[0] + fireVector[0] * frame, oponentCoordinates[1] + fireVector[1] * frame - (frame * frame * 5) ];

    graphics.drawImage(images['fireImg'], fireCoordinates[0], fireCoordinates[1]);

    frame += 0.1;
}

Jenže jak spočítat počáteční úhel (vektor) - aby mi to pěkně vyšlo?

Editováno 23.12.2012 19:19
 
Nahoru Odpovědět 23.12.2012 19:18
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Po zkušenostech už tvé programy moc nečtu. Jakmile to musím scrolovat, je to pro mne nezajímavé.

Pohyb střely by neměl navazovat na výchozí, ale na předchozí pozici. Jen tak můžeš započítat i proměnlivé síly, které mohou vzniknout nebo se měnit během letu.

Nahoru Odpovědět 23.12.2012 19:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Pokud se aktuální pozice dělové koule nerovná cílové pozici, tak proveď:

x += čas * složka x (B - A vektor počátku střely)
y += čas * složka y - (5 * čas * čas) // počítám s G = 10 - ne 9.82

Jen jsem se ptal - jak spočítat úvodní vektor? Protože ten B - A je pro přímý pohyb...

Editováno 23.12.2012 19:26
 
Nahoru Odpovědět 23.12.2012 19:25
Avatar
matesax
Redaktor
Avatar
Odpovídá na matesax
matesax:

Prostě jak z počátečního bodu a cílového spočítat vektor - na který mohu již použít vrh šikmý - tak aby mi to vyšlo do cíle...

 
Nahoru Odpovědět 23.12.2012 19:34
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Když si ty výrazy zderivuješ podle času, tak se zjednoduší.

Je to jednoduchý cyklus:

vy -= G * dt
x += vx * dt
y += vy * dt

dt je krok času, vy je rychlost v ose y ...

Nahoru Odpovědět 23.12.2012 19:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Ale jaký bude ten počáteční úhel/vektor? Děkuji. (To tvoje bude jen ztrácet Y - prvně ale musí vzletět...)

 
Nahoru Odpovědět 23.12.2012 19:47
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Jo takhle? Ty potřebuješ výpočet pro dělostřelce? Pohyb se skládá ze 2 částí:

  • rovnoměrný pohyb z A do B
t = (Bx - Ax) / vx
  • vrh svislý.
t = sqrt((2 * (By - Ay)) / G)

Tyto časy se rovnají.

vx = v * cos(alfa)
vy = v * sin(alfa)

kde v je úsťová rychlost a alfa je náměr. Stačí ty rovnice spočítat.

Nahoru Odpovědět 23.12.2012 19:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Kit
matesax:

Nevěděl jsem jak to pojmenovat - sorry. Náměr spočítám jak? Z toho t jsem trochu nešťastný. :)

Mohl by jsi být trochu konkrétnější?

Výchozí bod mám pozici lodi - tedy my.x a my.y a cílový pozici myši - e.pageX, e.pageY - děkuji.

Tedy první rovnice je jasná to je ten můj vektor fireVector, ale kam se podělo t?

Editováno 23.12.2012 20:05
 
Nahoru Odpovědět 23.12.2012 20:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.