Memindahkan sprite dalam XNA / C #, menggunakan vektor


9

Saat ini saya sedang mencari pengembangan game XNA dengan bahasa C #.

Saya memiliki dua kelas: pengendali permainan utama dan kelas "sprite". Berikut ini adalah beberapa pseudo-code dasar yang saya harap cukup menjelaskan masalah ini.

Game.cs

class game {
  sprite the_sprite;
  void update(time) {
    var mouse = mouse.state
    if(mouse.clicked) { this.the_sprite.moveTo(mouse.x, mouse.y) }
    this.the_sprite.update(time)
    base.update(time)
  }
}

Sprite.cs

class sprite {
  vector2 location;
  vector2 move_to;
  void moveTo(x, y) { this.move_to = new vector2(x, y) }
  void update(time) {
    if(this.location.x > this.move_to.x /* (or less than) */) {
      // adjust location.x
    }
    if(this.location.y > this.move_to.y /* (or greater than) */) {
      // adjust location.y
    }
  }
}

Pada dasarnya: ketika pengguna mengklik suatu tempat di jendela game, koordinat x dan y mouse diambil, dan objek game akan bergerak menuju lokasi itu selama periode waktu tertentu.

Yah ... kodenya berfungsi, tapi jelek, dan objek tidak bergerak langsung ke arah objek (sebaliknya, itu gerakan diagonal, diikuti oleh gerakan sumbu tunggal). Saya menduga ada beberapa fungsi matematika yang bisa saya gunakan, tapi jujur ​​saya tidak tahu harus mulai dari mana. Ada saran?


3
Halo tamu. Apa yang Anda cari adalah normalisasi. Silakan baca jawaban untuk pertanyaan ini: gamedev.stackexchange.com/questions/7540/… . Satu menawarkan kode yang Anda butuhkan, kedua menjelaskan cara kerjanya dengan sangat baik.
Notabene

Halo, saya telah melihat tautannya dan itulah yang saya butuhkan. Terima kasih!
Matt

Jawaban:


12

Jika saya memahami masalah Anda dengan benar, Anda seharusnya hanya memiliki Vector2 yang mewakili arah yang ingin Anda pindahkan ke dalam kelas sprite Anda. Seperti ini:

public Vector2 Direction { get; set; }

Ini adalah vektor yang dinormalisasi (yang artinya memiliki panjang 1) yang menunjukkan ke mana Anda ingin pergi.

Lalu, tambahkan properti Speed ​​float, yang mengatakan seberapa cepat sprite seharusnya bekerja.

public float Speed { get; set; }

Anda juga perlu menambahkan fungsi UpdateSprite, jadi mengapa tidak memasukkannya ke dalam kelas Sprite Anda?

public Update(GameTime gameTime)
{
   Position += Direction * Speed * gameTime.ElapsedGameTime.TotalSeconds;
}

Ini akan memperbarui posisi sprite untuk membuatnya bergerak (Anda mengalikannya dengan delta detik sehingga sprite bergerak dengan benar di komputer yang lambat juga).

Akhirnya, Anda cukup menetapkan properti arah Anda seperti ini:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();

Perhatikan juga bahwa jika panjang sprite.Direction (sebelum normalisasi) kurang dari beberapa ambang batas, sprite Anda telah tiba.
TreDubZedd

Tepat, saya akan mengedit posting saya, tapi saya rasa saya tidak akan. Jika Anda tidak ingin sprite Anda terus-menerus mencari target, cukup atur Direction ke Vector2.Zero ketika itu cukup dekat dengan target.
Jesse Emond

Jawaban yang sangat bagus ... dan Anda juga mengajari saya tentang penggunaan gameTime (untuk memindahkan sprite pada kecepatan yang sesuai pada komputer yang lebih lambat), jadi dua burung dengan satu batu. Saya akan menandai jawaban ini sebagai diterima.
Matt

:) Ngomong-ngomong saya pribadi suka meletakkan normalisasi di dalam kelas sprite saya (di dalam fungsi pembaruan saya), untuk mencegah keharusan terus-menerus menormalkannya di luar kelas. Anda juga harus memastikan bahwa panjang vektor tidak sama dengan 0, jika tidak, Anda akan mendapatkan pembagian dengan 0 pengecualian. Cukup periksa apakah Direction.LengthSquared ()> 0 sebelum menormalkannya menjadi aman (panjang kuadrat sehingga Anda tidak harus menghitung fungsi persegi yang mahal;)).
Jesse Emond

Katakanlah kita menggunakan IDE berbeda yang tidak memiliki fungsi normalisasi, seperti apa persamaan Normalize?
Spooks

1

Google normalisasi ... saya juga sedikit tersesat dalam hal ini, tetapi saya cukup yakin ini akan membantu menyelesaikan masalah Anda. Orang lain dapat menguraikan atau menyangkal jawaban saya, saya yakin

Sunting: Saya bisa menjawab ini dengan lebih baik, permintaan maaf

Saya pribadi selalu melihat ke posting blog ini untuk membantu dengan jenis masalah ini: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

Itu dimulai dari awal dan relevan untuk pengembangan game.


3
Anda benar, itu normalisasi. Tetapi selalu lebih baik untuk mencoba menemukan jawaban yang baik dalam pertanyaan sebelumnya. Dan jika Anda menjawab selalu lebih baik sedikit menjelaskan atau membagikan kode atau apa pun yang menurut Anda dapat bermanfaat, tidak hanya menunjuk ke google.
Notabene

Saya seharusnya berkomentar, Anda benar.
Douglas Rae
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.