Thông tư Bullet lây lan thậm chí không


7

Tôi đang tạo ra một game bắn súng nhiều theo phong cách của Touhou. Ngay bây giờ tôi muốn có một phát bắn tròn rất đơn giản được bắn từ kẻ thù.

Tuy nhiên, khoảng cách là rất không đồng đều, sẽ không tốt nếu bạn muốn sống sót.

Mã tôi đang sử dụng là đây:

private function shoot() : void
{
    const BULLETS_PER_WAVE : int = 72;
    var interval : Number = BULLETS_PER_WAVE / 360;

    for (var i : int = 0; i < BULLETS_PER_WAVE; ++i)
    {
        var xSpeed : Number = GameConstants.BULLET_NORMAL_SPEED_X * Math.sin(i * interval);
        var ySpeed : Number = GameConstants.BULLET_NORMAL_SPEED_Y * Math.cos(i * interval);

        BulletFactory.createNormalBullet(bulletColor_, alice_.center, xSpeed, ySpeed);
    }

    canShoot_ = false;
    cooldownTimer_.start();
}

Tôi tưởng tượng lỗi của tôi là ở các chức năng sin& cos, nhưng tôi không hoàn toàn chắc chắn điều gì sai.


Làm thế nào mà một lỗi gõ vào đoạn mã của bạn? Bạn đã không sao chép dán từ trình chỉnh sửa của mình sau khi xác nhận rằng mã biên dịch?
aaaaaaaaaaaa

2
Đây không phải là một câu trả lời toán học nhưng BulletML sẽ giúp bạn xác định và lưu trữ các loạt đạn trong XML: asahi-net.or.jp/~cs8k-cyu/bONSml/index_e.html
BrandFeelsood 14/11/11

@eBusiness: Lỗi gõ gì? Các mã biên dịch tốt.
IAE

@SoulBeaver Không có dấu ngoặc kết thúc trên dòng 6, không có nó, vì vậy tất nhiên nó có trong mã của bạn, nhưng tại sao nó không làm cho nó thành câu hỏi?
aaaaaaaaaaaa

@eBusiness: Tôi hoàn toàn không biết chuyện gì đã xảy ra ở đó. Tôi có thể đã mắc lỗi trong khi thụt lề và định dạng mã để nhìn đúng trên GameDev, nhưng tôi không có lời giải thích nào khác xD Đã sửa, cảm ơn.
IAE

Câu trả lời:


13

Nguyên tắc vàng khi làm việc với bất kỳ loại góc nào: Hãy chắc chắn rằng bạn đang sử dụng đúng đơn vị. Trong trường hợp này, bạn nên sử dụng radian, không phải độ.

Math.sin(i * interval * Math.PI / 180);
Math.cos(i * interval * Math.PI / 180);

Nếu bạn muốn bắn đạn trực tiếp giữa ông chủ và người chơi, hãy sử dụng atan2, FYI.


Tại sao radian tốt hơn độ?
tro999

Bởi vì bạn đang chia cho 360. Về cơ bản, bạn quay vòng tròn hàng trăm lần, đó là lý do tại sao nó thậm chí không.
UltimateBrent

1
Radian là cần thiết cho các cuộc gọi chức năng trig trong AS3. Nhưng về lý do tại sao chúng tốt hơn về mặt toán học (và do đó tại sao nhiều ngôn ngữ chọn chúng), đó là vì radian liên quan trực tiếp đến giá trị của pi, là hằng số toán học phổ quát. Trong khi đó độ là một cấu trúc nhân tạo, do đó, một mức độ gián tiếp bổ sung có liên quan đến việc xử lý (đó là *hoặc / Math.PI/180bạn thấy ngoài trời - nếu nó không được bao gồm trong các hàm cơ bản, bạn phải tự làm chuyển đổi sang và từ độ).
Kỹ sư

1
Sine và Cosine được tính là một chuỗi các phân số, ở dạng đơn giản nhất, các chuỗi này lấy radian làm đầu vào. Chỉ bằng cách giới thiệu một hằng số dựa trên π, các chuỗi này mới có thể được sử dụng với độ. Tôi khuyên bạn nên bỏ qua độ hoàn toàn để thể hiện nội bộ, radian có thể mất một chút để làm quen, nhưng về lâu dài sẽ dễ dàng hơn để không phải chuyển đổi mọi lúc.
aaaaaaaaaaaa

Radian Fun đố: Nếu bạn có một vòng tròn có bán kính một mét, và bạn đi bộ dọc theo một n arc radian của vòng tròn đó, bạn sẽ phải đi một khoảng cách chính xác n mét, và khu vực của đường tròn được xác định bằng cách đi bộ mà có diện tích chính xác ** n ** / 2 mét vuông. Radian là tuyệt vời.
Trevor Powell

7

Bạn đang thực hiện phép chia sai vòng, và bạn đang sử dụng độ chứ không phải radian, giống như các hàm toán học làm. Tình cờ điều này dẫn đến một mô hình trông hơi giống như mong muốn. Chỉ cần sửa tính toán của bạn về các biến khoảng.

var interval : Number = 2 * Math.PI / BULLETS_PER_WAVE;

Chỉnh sửa: Đối với những người không quen thuộc với khái niệm này, mã này tạo ra góc mong muốn giữa các viên đạn theo radian, do đó cho phép bỏ phép tính xSpeedySpeednhư không có hằng số nào được áp dụng.


+1 Đúng. Anh ta nên tính toán period = 2 * picác hàm sin / cos và sau đó interval = period / BULLETS_PER_WAVE.
dùng712092

5

Tôi nghĩ bạn nên thực hiện 360 / BULLETS_PER_WAVE thay vào đó trong trường hợp của bạn 360/72 = 5 độ giữa mỗi viên đạn. Ngoài ra, bạn có chắc chắn rằng các hàm Math.sin và Math.cos muốn đầu vào của chúng theo độ chứ không phải radian?


4

Trong khi bạn đã được trả lời, đây là một câu trả lời hài hước hơn: học từ thiên nhiên.

Sử dụng tỷ lệ vàng thay thế.

const GOLDEN_RATIO : Number = 1.618033989;
var interval : Number = 2 * Math.PI * GOLDEN_RATIO;

Xem: http://www.mathsisfun.com/numbers/nature-golden-ratio-fiborie.html


Bây giờ, nếu bạn đặt một độ trễ nhỏ giữa mỗi lần chụp thì đó sẽ là một mẫu rất đẹp.
aaaaaaaaaaaa

@Klems: Tuyệt vời! Tôi hoàn toàn sử dụng điều này cho mẫu tiếp theo của mình: 3
IAE

3

Ngoài vấn đề mức độ / radian có thể xảy ra, tôi cho rằng vấn đề chính là bạn đang sử dụng các giá trị nguyên cho các phép tính. Bạn chưa hiển thị GameConstants.BULLET_NORMAL_SPEED_Xhoặc đối tác Y của nó nhưng đảm bảo rằng chúng được biểu diễn dưới dạng số dấu phẩy động, không phải số nguyên. Ngoài ra, đúc chúng thành các giá trị dấu phẩy động trong quá trình nhân để tính tốc độ.


Các giá trị là autocast. Tôi không đủ quen thuộc với Actioncript để gọi mọi trường hợp, nhưng trong trường hợp này tôi chắc chắn đó không phải là vấn đề.
aaaaaaaaaaaa

Tôi không nghĩ rằng họ đang được chọn đúng. Nhìn vào 2 vòng tròn gần nhất với nhân vật, bên trên và bên phải của nó. Cả 2 và mỗi vòng tròn trong cả hai tia đó đều có giá trị Y giống hệt với một tia trong tia kia, đó không phải là điều bạn mong đợi nếu gia số Y là giá trị dấu phẩy động.
Kylotan

Bạn nói đúng, có một số vấn đề với các giá trị được làm tròn, nhưng tôi không nghĩ rằng nó có thể nhìn thấy trong đoạn mã được đăng, bất cứ điều gì có thể xấu ở đó sẽ dẫn đến 0 và do đó không tạo ra bất cứ thứ gì trông giống như một vòng tròn. Nó phải là một vấn đề xa hơn trong chuỗi, có lẽ một số biến nên được numberkhai báo thay thế int.
aaaaaaaaaaaa

+1: Tôi quên chỉ định loại BULLET_X nên AS mặc định nó là int. Giáo sư.
IAE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.