Apa yang harus saya lakukan untuk mencegah monster saya berjalan keluar dari platform?

8

Saya punya pertanyaan yang membuat saya gila karena saya pikir seharusnya cukup mudah untuk menemukan tutorial tentang itu. Saat ini saya menggunakan XNA dan Farseer untuk membuat game platformer sederhana. Aku hampir selesai dengan itu tapi aku ingin monsterku menjadi lebih pintar. Dalam hal ini itu berarti aku tidak ingin monsterku jatuh dari tebing.

Sederhananya, saya ingin sesuatu yang memeriksa area di depan "monster" saya untuk menentukan kapan monster itu harus mengubah arah. Bisakah kalian mengarahkan saya ke arah yang benar?

Apa yang harus saya gunakan, harus ada solusi sederhana atau algoritma sederhana untuk memeriksa ini, bukan?

Daniel Figueroa
sumber

Jawaban:

17

Saya tidak pernah bekerja dengan XNA sebelumnya dan saya pikir itu akan muncul solusi yang lebih baik daripada milikku. Tetapi solusi yang mungkin berhasil adalah Anda bisa meletakkan benda tak terlihat di ujung tebing dan monster itu bisa memeriksa tabrakan dengan benda itu. Jika itu bertabrakan, maka berubah arah.

gmemario
sumber
2
Sederhana dan elegan, +1
Valmond
Itu solusi yang bagus. Farseer mendukung " sensor ", jadi gunakan ini di tebing.
bummzack
Saya sangat suka jawaban Anda jadi saya tidak ingin membantahnya. Dia juga bisa menggunakan ubin bawah-kiri / kanan (tergantung pada arah gerakan) - yang merupakan solusi yang lebih 'jelas'.
Jonathan Dickinson
1
Masalah utama dengan solusi seperti ini adalah Anda harus menempatkan penghalang untuk setiap tebing. Jika ada beberapa dalam permainan, maka itu mungkin baik-baik saja, tetapi sebaliknya, itu bisa memakan waktu lama, dan Anda bisa melewatkan beberapa tebing.
AlbeyAmakiir
4
@AlbeyAmakiir Baiklah, Anda juga bisa menukar ini dan meletakkan sensor di bagian bawah di depan pemain (yang bergerak dengan pemain). Segera setelah sensor ini berhenti mendaftarkan tabrakan, Anda berada di tebing.
bummzack
7

Satu cara naif untuk mengimplementasikannya adalah dengan menggunakan raycasting.

Hitung di mana monster Anda akan berada dalam beberapa waktu kecil (mungkin bingkai). Dari posisi itu (atau jika Anda ingin menjadi lebih kuat, posisi itu +/- area pembatas musuh Anda) melakukan raycast ke bawah. Jika itu tidak mengenai sesuatu dalam rentang yang sesuai (tergantung di mana Anda memulai raycast Anda secara vertikal, ketinggian karakter, "ukuran langkah" yang Anda inginkan, dll.) Anda dapat mengetahui bahwa ada tebing di mana karakter ingin berada, dan memutuskan untuk mengubah arah dengan tepat.

Tetrad
sumber
1

Dengan AI saya, saya cukup memeriksa apakah ada platform di bawah dan ke arah perjalanannya (tidak menggunakan sistem tiles, hanya sistem tabrakan asyik). Jika tidak ada - atau jika menyentuh blok padat, itu akan menjadi bingung dan berbalik.

Dengan cara ini Anda dapat memiliki peta dinamis dan masih memiliki AI yang berfungsi (istilah digunakan secara longgar).

ultifinitus
sumber
0

Saya menduga Anda menggunakan peta ubin, dalam hal ini solusinya adalah melakukannya berdasarkan indeks ubin. Anda perlu mencari di ubin apa rakasa Anda aktif, dengan rumus berikut:

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

Setelah Anda mengetahui ini, Anda harus menemukan ke arah X mana Anda akan pergi (untuk memeriksa blok di depan):

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

Sekarang Anda memiliki arah X yang dinormalisasi untuk bekerja dengannya.

Selanjutnya, Anda akan ingin memeriksa blok di sekitar untuk melihat apakah Anda harus mengubah arah:

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

Anda mendapatkan ide umum. Pastikan Anda kembali TileCollision.Impassable(atau apa pun) jika indeks ubin berada di luar peta, untuk mencegah program Anda menabrak indeks yang tidak valid, dan itu juga mencegah monster keluar di luar peta.

Saya kira itu benar-benar tergantung pada cara Anda menangani ubin, tetapi ini adalah solusi yang bekerja untuk saya.

Berdasarkan tutorial dari http://www.sgtconker.com/ (walaupun situs web sedang down saat saya menulis ini)

Jesse Emond
sumber
0

Atur kotak di bagian luar platform yang ada di layer terpisah, dan minta monster memeriksanya, sehingga mereka tidak akan jatuh tetapi pemain masih bisa.

Darren
sumber
Saya pikir ini adalah jawaban yang sama yang diberikan Gilson.
Richard Marskell - Drackir
ya terlihat benar
Darren