Làm cách nào để tạo hiệu ứng World Healing Wave?


14

Tôi muốn thay đổi của tôi tối và nền depressing đến một nền cỏ hạnh phúc , trong thời gian thực, chẳng hạn rằng nền hạnh phúc được thể hiện trong một bán kính xung quanh một nhân vật trò chơi.

Một trường lực của hạnh phúc , nếu bạn muốn.

Làm thế nào điều này có thể được thực hiện một cách hiệu quả nhất có thể khi kết xuất thành một khung vẽ trong chế độ xem tùy chỉnh?


CẬP NHẬT: Đây là cách nó hoạt động trong đầu tôi:

    private int hModeX, hModeY;
    private float hModeRadius = 0.1f;
    private float hModeStart = 0;
    happyModeBg = Bitmap.createScaledBitmap(happyModeBg, getWidth(),getHeight(), true);
    hModeX = getWidth()/2;
    hModeY = getHeight()/2;

private void initHappyMode(Canvas canvas){
    hModeRadius = 75 * thread.getDelta();

    if(hModeRadius > 500) {
        hModeStart = timestep; //What is timestep?
    }

    //context.arc(x, y, radius, 0, 2 * Math.PI, false); <- your version
    canvas.save();
    canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint) // <- my version
    //context.clip(); <- dont know what this does or if there is an equivilant
    canvas.drawBitmap(happyModeBg, 0, 0, null);
    canvas.restore();
    //requestAnimationFrame(step); <- dont know what this does since I cant seem to find it for android

}

Tôi đang sử dụng canvas.drawArc()để tạo một vòng tròn, nhưng tôi chắc chắn đang thiếu một cái gì đó.


1
về mặt kỹ thuật, nó được gọi là World Healing Wave
ratchet freak

Tôi chỉ sử dụng canvas trên chế độ xem tùy chỉnh được chạy bởi vòng lặp trò chơi của riêng tôi ở 60fps
Green_qaue

Bạn có thể kết xuất cảnh hai lần? Một lần cho phiên bản được chữa lành, một lần cho phiên bản đã chết, và sau đó vẽ người được chữa lành qua người chết trong một vòng tròn ngày càng tăng cho đến khi vòng tròn bao phủ toàn bộ màn hình.
Wolfgang Skyler

Đó là những gì tôi đã suy nghĩ. Chỉ không biết làm thế nào để đi về điều đó với một bitmap. Và tôi nghĩ có lẽ có một cách tốt hơn vì việc hiển thị 2 bss cùng một lúc rất tốn kém
Green_qaue

2
Tôi nghĩ rằng tôi thấy những gì nhầm lẫn là về - Android Canvaslàm mọi thứ hơi khác một chút so với HTML <canvas>, mà tôi nghĩ bạn có ý nghĩa! Tôi đã chỉnh sửa câu trả lời của mình để giải thích cách thức hoạt động của việc cắt nói chung, với một số liên kết và mã ví dụ cụ thể của Android.
Anko

Câu trả lời:


20

Bản giới thiệu

Làn sóng chữa bệnh GameDev

GameDev Meta : Henshin chính !! : D

Mã này sử dụng một canvas clipvùngrequestAnimationFrame cho chất lượng và hiệu quả tối đa. ( Sống tốt hơn .)

Tôi giả sử bạn có nghĩa là HTML canvas ! Ngay cả khi bạn không làm như vậy, các công cụ kết xuất khác (như đường dẫn kết xuất 2D của Android, mà bạn có thể có nghĩa) cũng hỗ trợ các vùng clip được tăng tốc phần cứng . Mã có thể sẽ trông tương tự.

Yêu cầu các khung hình động với requestAnimationFrame(hoặc giải pháp được cung cấp bởi nền tảng khác) dẫn đến hoạt ảnh chất lượng cao hơn bằng cách để động cơ xác định thời gian kết xuất.

Điều này hiển thị mượt mà trên netbook tầm thấp và trên điện thoại Android của tôi.

Giải trình

Để làm cho điều này thường hữu ích hơn, hãy thực sự hiểu về việc cắt .

Hãy nói rằng chúng ta có hai hình chữ nhật:

hai hình chữ nhật, một hình chữ nhật chồng lên nhau

Cắt cũng hoạt động tốt trên các dòng, điểm, hình ảnh hoặc bất cứ điều gì bạn có thể muốn kết xuất. Tôi chỉ gắn bó với hình chữ nhật cho đơn giản.

Chúng tôi không muốn hình chữ nhật màu đỏ hiển thị ở đây (hình tròn màu đen).

Hai hình chữ nhật, khu vực cắt mong muốn của hình chữ nhật màu đỏ

Vì vậy, chúng ta có thể hướng dẫn trình kết xuất cắt hình chữ nhật màu đỏ theo hình tròn đó.

hai hình chữ nhật;  cái màu đỏ đã được cắt bớt

Nói cách khác, khi hình chữ nhật màu đỏ được vẽ, nó được vẽ ở mọi nơi trừ nơi hình tròn màu đen đó sẽ có.

Các trình kết xuất khác nhau có các cách khác nhau để chỉ định vùng cần cắt theo. Trong JavaScript, với HTML <canvas>, về cơ bản, tôi đã làm

// Draw the blue rectangle

context.save(); // Save the current state of the graphics context,
                // so we can go back to it.

// Draw the black circle
context.clip(); // Tell the renderer that was our clip region,
                // since the last `context.save()`.

// Draw the red rectangle.
// It will appear clipped by the black circle.

context.restore(); // Tell the renderer we should restore all
                   // the clipping settings back to what they were
                   // `context.save`d as.

// From here on, nothing is clipped anymore.

Bây giờ, trong Android Canvas, bạn sẽ muốn làm một điều tương tự, nhưng trình kết xuất mong đợi mã hơi khác:

// Draw the blue rectangle

canvas.save(); // Same idea as above -- just setting a point we can
               // restore to later.

// Now, `canvas.clipPath` expects a `Path` object.
// Let's create one that contains a circle.
Path path = new Path();
path.addCircle(100, 100, 100, Direction.CW); 
canvas.clipPath(path);

// Draw the red rectangle
// It will be clipped by the circle defined in the `path` that we
// used as the `clipPath`.

canvas.restore(); // Aaaand restore the state.

// Things drawn here won't be clipped anymore.

Tài liệu Android về vấn đề này có thể có ích. Có những câu hỏi hay như thế này trên StackOverflow về nhiều thứ bạn có thể muốn thử với nó.


3

Thực hiện làm việc bằng phương pháp Ankos:

canvas.drawBitmap(depressingBg, 0, 0, null);
canvas.save();
radius += 400*thread.getDelta(); // expansion speed
Path path = new Path();
// draw around player position
path.addCircle(player.x, player.y, radius, Direction.CW);
canvas.clipPath(path);
canvas.drawBitmap(happyBg, 0, 0, null);
canvas.restore();

Cảm ơn Anko vì tất cả sự giúp đỡ!

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.