Wektory, poruszanie postacią (GRY)

0

Witam. Dowiedziałem się ostatnio, że ruch postaci powinno się tworzyć na podstawie wektorów. I teraz nie wiem na jakiej zasadzie ma to wygladac. Czy mam stworzyc sobie klase wektor, ktora ma parametry X i Y oraz konstruktor, również z z dwoma parametrami, a następnie stworzyc w klasie gameplay obiekty :

  • WektorPołożenia [Xpoczatkowa, Y poczatkowa]
  • WektorPrzesunieciaPoX czy tam prędkości, ktory bedzie dodawany lub odejmowany do WektoraPołożenia w zaleznosci od kierunku lewo/prawo (np. WektorPrzesunieciaPoX [10, 0] )
  • WektorPrzesunieciaPoY - analogicznie

Podpowiedzcie mi, bo szukam szukam i każdy tlumaczy inaczej, a chciałbym obrać jeden kurs i trzymac się go.

0

Jeśli chcesz dobre i poprawne rozwiązanie, to nie pisz swojej klasy do wektorów, tylko skorzystaj z biblioteki do gier (albo na jej podstawie napisz własną klasę).

Twoja postać powinna mieć wektor położenia i wektor prędkości (na początku zerowy, bo postać się nie rusza).
Pozycja postaci powinna się zmieniać na podstawie prędkości. W każdej klatce do pozycji postaci dodajemy prędkość pomnożoną przez czas klatki (delta time).
Natomiast samą prędkością trzeba zarządzać w kontrolerze postaci. Np. gdy gracz wciśnie strzałkę w lewo, to ustawiamy wektorPrędkości.x = -prędkośćPozioma;.

0

Zależy czy postać ma się poruszać jednostajnie czy ruchem jednostajnie przyśpieszonym.

Jeśli jednostajnie to wystarczy sam parametr vecotra x i y:

if(kliknieta strzelka w prawo){
   vectorx+=wartosc_poruszania;
}

Jeśli przyspieszonym to jak wyżej wspomniano muszą być dodatkowe zmienne przyspieszenia:

if(kliknieta strzelka w prawo){
   velocityx+=wartosc_przyspieszenia;
}
vectorx+=veocityx;

//maksymalna predkosc
if(Math.abs(velocityx)>maxspeed) velocityx=(velocityx>0)? maxspeed : -maxspeed;
//warto dodac odrazu spadek przyspieszenia - np.tarcie
velocityx+= (velocityx>0)? -spadek : ((velocityx<0)? spadek : 0);

Przykłady dla prędkości horyzontalnej.

0

Przejrzyj sobie ten tutorial, tam bylo to fajnie wytlumaczone. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php

0

No dobra, a nie wystarczyła by taka klasa ?

public class Postać {
	
    public String NazwaPliku;
    public int    Xposition; 
    public int    Yposition;
    public int    Width;
    public int    Height;
    public int    Prędkość;
    public int    Jump; 

    public Postać(String N, int X, int Y, int W, int H, int P, int J)
{
     NazwaPliku = N;    
     Xposition  = X;
     Yposition  = Y;
     Width      = W;
     Height     = H;
     Prędkość   = P;
     Jump       = J;

}
}

Jest w niej prędkość, pozycjaX i pozycjaY.

0

Nie bardzo... Zdecyduj się, czy chcesz to mieć porządnie, czy byle jak. Bo jak na razie nie zastosowałeś się do porad, o które prosiłeś... Bo przecież chcesz to zrobić porządnie, a nie jak najprościej i byle jak, prawda?

I konstruktor też tandetny, nie rób takich skrótowców w prototypach metod.

0

Stworzyłem taką klase:

package pudełko;

public class Vector {

	public float x, y;
	
	public Vector(float x, float y)
	{
		this.x = x;
		this.y = y;
	}
	
	public String toString()
	{
		return "(" + x + ", " + y + ")";
	}
	
	public float length()
	{
		return(float)(Math.sqrt(x*x + y*y));
	}
	
	public Vector normalize()
	{
		float length = length();
		x/=length;
		y/=length;
		return this;
	}
	
	public Vector rotate(float angle)
	{
		double rad = Math.toRadians(angle);
		double cos = Math.cos(rad);
		double sin = Math.sin(rad);
		return new Vector ((float)(x*cos - y*sin), (float)(x*sin + y*cos));
	}
}

A w klasie GamePlay stworzyłem trzy obiekty:

	Vector WektorPołożenia = new Vector(100,680);
	Vector WektorPrędkościPoziomej = new Vector(50, 0);
	Vector WektorPrędkościPionowej = new Vector(0, 15);
	

Czy to wystarczy ? Czy dodac jakies inne metody ?
I teraz czy klasa postać jest wgl potrzebna ?
Taką mam już zamote z tym wszystkim, że nie wiem co i jak.

0

Czy coś dodać... Obczaj sobie klasę Vector z Unity 3D - https://docs.unity3d.com/ScriptReference/Vector2.html
Może kodu metod nie podglądniesz, ale zobaczysz chociaż jak wygląda klasa Vector ogólnego przeznaczenia (taka, która ma pasować większości programistów).
Ty sobie zaimplementuj tylko metody, których na pewno będziesz używał w swojej grze. Reszta wyjdzie w praniu - doimplementujesz w razie potrzeby.

Klasa postać jest potrzebna chociażby jako kontener, który łączy wszystkie obiekty postaci. Na tym polega programowanie obiektowe. Hermetyzacja. Gracz jest akurat tylko jeden (jednak też wskazane jest aby miał swoją klasę). Jak będziesz dodawał wrogów, to zobaczysz, że to ułatwia ;) Będziesz mógł w łatwy sposób dodawać na scenę i usuwać ze sceny obiekty wrogów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1