Witam. Jestem w trakcie tworzenia gry. Opis mojego projektu można zobaczyć tutaj:
Otóż w grze posiadam jednostki o współrzędnych posX oraz posY (dwa wymiary).
Jednostki poruszają się za pomocą metody move:
public class Objects
{
public string ship_name; // name of a ship
public bool is_detected; // is unit detected by any friendly unit?
public double ship_posX; // position X on map
public double ship_posY; // position Y on map
public void move(int heading, int speed)
{
if (speed > 0)
{
if (heading == 0)
{
if (ship_posY > 2) ship_posY -= speed; // ship is heading NORTH
if (ship_posY <= 3) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
}
if (heading == 45) // ship is heading NORTH-EAST
{
if (ship_posX < 8910) ship_posX += speed;
if (ship_posY > 2) ship_posY -= speed;
if (ship_posY <= 2) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
}
if (heading == 90)
{
if (ship_posX < 8910) ship_posX += speed; // ship is heading EAST
if (ship_posX >= 8908) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
}
if (heading == 135) // ship is heading SOUTH-EAST
{
if (ship_posX < 8910) ship_posX += speed;
if (ship_posX >= 8908) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
if (ship_posY < 6410) ship_posY += speed;
}
if (heading == 180)
{
if (ship_posY < 6410) ship_posY += speed; // ship is heading SOUTH
}
if (heading == 225) // ship is heading SOUTH-WEST
{
if (ship_posX > 2) ship_posX -= speed;
if (ship_posX <= 2) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
if (ship_posY < 6410) ship_posY += speed;
}
if (heading == 270)
{
if (ship_posX > 2) ship_posX -= speed; // ship is heading WEST
if (ship_posX <= 2) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
}
if (heading == 315) // ship is heading NORTH-WEST
{
if (ship_posX > 2) ship_posX -= speed;
if (ship_posX <= 2) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
if (ship_posY > 2) ship_posY -= speed;
if (ship_posY <= 2) speed = 0; // gdy okręt dopłynie do krawędzi mapy i jest wciąż skierowany w jej kierunku, to wyzeruj jego prędkość
}
}
} // end of void move
}
Klasę wykorzystuję w następujący sposób:
public Objects[] unit; // w public partial class Form1 : Form
// a to poniżej w Form Load (gdy uruchamia się gra):
unit = new Objects[100];
for (int i = 0; i < 100; i++)
{
unit[i] = new Objects();
}
// przesuwanie jednostek, w Timer1, co sekundę:
unit[0].move(unit[0].ship_heading, unit[0].ship_current_speed);
// Współrzędne X odczytuje się ze zmiennej: unit[0].ship_posX
// Współrzędne Y odczytuje się ze zmiennej: unit[0].ship_posY
Zastanawiam się od wielu dni, jak sprawić, aby okręt płynął prostym kursem prosto do wyznaczonego punktu (może sam wyznaczać kurs, jeśli jest do tego jakiś wzór)?
Czytałem coś na temat Algorytmu Dijkstry, ale nie potrafię tego zastosować w swoim projekcie mając moje nazwy zmiennych. Widziałem w innych grach, że jednostki po kliknięciu w określony punkt mapy gnają prosto w jego kierunku. Sposób na ominięcie przeszkód nie będzie teraz tematem do dyskusji, niech jednostki przesuwają się kursem prostym w kierunku celu.
Dodam tylko, że układ współrzędnych nie jest taki idealnie jak się uczyliśmy w szkole, gdyż nie ma tu wartości ujemnych. (ikony jednostek to PictureBoxy (o nazwie PictureBoxObjectX, gdzie X to numer jednostki), które są ustawione na innym PictureBoxMainMap, do którego jest wczytywana mapa gry). Jednostki są przesuwane po mapie co sekundę za pomocą timera poleceniem:
PictureBoxObject0.Location = new Point(x, y);
Ponieważ mapa gry to PictureBox, nie może mieć wartości ujemnych, dlatego:
a) lewy górny róg mapy ma współrzędne (1,1)
b) prawy górny róg mapy ma współrzędne (9000, 1)
c) lewy dolny róg mapy ma współrzędne (1, 6420)
d) prawy dolny róg mapy ma współrzędne (9000, 6420)
Przesuwając wskaźnik myszy po obrazie w paincie też na tej samej zasadzie wyświetlane są współrzędne i działa to w ten sam sposób.
Mam nadzieję, że w miarę czytelnie objaśniłem swój problem?