월드 힐링 웨이브 효과는 어떻게 만듭니 까?


14

어둡고 우울한 배경행복한 잔디 배경 으로 실시간으로 변경하여 행복한 배경이 게임 캐릭터 주위의 반경에 표시 되도록하고 싶습니다 .

당신이 원한다면 행복힘장 .

사용자 정의보기에서 캔버스로 렌더링 할 때 가능한 한 성능 적으로 수행 할 수있는 방법은 무엇입니까?


업데이트 : 내 머리에서 작동하는 방법은 다음과 같습니다.

    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

}

나는 canvas.drawArc()동그라미를 만들기 위해 사용 하고 있지만 분명히 무언가를 놓치고 있습니다.


1
기술적으로 그것은 세계 치유의 파도
래칫 괴물

60fps로 자체 게임 루프에서 실행되는 사용자 정의보기에서 캔버스를 사용합니다
Green_qaue

장면을 두 번 렌더링 할 수 있습니까? 치유 된 버전의 경우 한 번, 죽은 버전의 경우 한 번, 원이 전체 화면을 덮을 때까지 계속 증가하는 서클에서 치유 된 인물을 그립니다.
Wolfgang Skyler

내가 생각했던 것의 종류. 비트 맵으로 그 문제를 해결하는 방법을 모릅니다. 그리고 한 번에 2 개의 bgs를 렌더링하는 것은 매우 비용이 많이 들기 때문에 더 좋은 방법이있을 수 있다고 생각합니다.
Green_qaue

2
혼란이 무엇인지 알 것 같습니다 .Android는 CanvasHTML <canvas>과 약간 다르게 작동합니다 . 일부 Android 관련 링크와 예제 코드를 사용하여 클리핑이 일반적으로 작동하는 방식을 설명하기 위해 답변을 편집했습니다.
Anko

답변:


20

데모

GameDev 힐링 웨이브

GameDev 메타 : 변신 홈페이지 ! :디

코드는 사용 canvas clip지역requestAnimationFrame최대의 품질과 효율성을. (더 나은 라이브 입니다.)

나는 당신이 HTML을 의미한다고 생각했다 canvas! 그렇지 않은 경우에도 다른 렌더링 엔진 (예 : Android의 2D 렌더링 파이프 라인)은 하드웨어 가속 클립 영역을 지원 합니다 . 코드는 비슷하게 보일 것입니다.

requestAnimationFrame(또는 다른 플랫폼에서 제공하는 솔루션으로) 애니메이션 프레임을 요청 하면 엔진이 렌더링 타이밍을 결정할 수있게하여 고품질 애니메이션이됩니다.

이것은 저 범위 넷북과 내 안드로이드 폰에서 부드럽게 렌더링됩니다.

설명

이를보다 일반적으로 유용하게하려면 클리핑을 이해해 봅시다 .

이 두 직사각형이 있다고 가정 해 봅시다.

하나는 다른 하나와 겹치는 두 개의 직사각형

클리핑은 선, 점, 이미지 또는 렌더링하려는 다른 것에서도 잘 작동합니다. 간단하게 사각형을 고수하고 있습니다.

여기서 빨간 사각형이 보이지 않게하기를 원합니다 (검은 색 원).

두 개의 직사각형, 빨간색 직사각형의 원하는 컷 아웃 영역 (검정색)

그래서 우리는 할 렌더러를 지시 할 수 있습니다 클립 이 원으로 빨간색 사각형을.

두 개의 직사각형;  빨간색이 잘려서

즉, 빨간색 사각형을 그릴 때 검은 색 원이 있던 곳을 제외한 모든 곳에서 그려집니다.

렌더러마다 클립 할 영역을 지정하는 방법이 다릅니다. JavaScript에서 HTML을 사용하여 <canvas>본질적으로

// 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.

이제 안드로이드 Canvas에서는 비슷한 일을하고 싶지만 렌더러는 약간 다른 코드를 기대합니다.

// 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.

문제에 대한 Android 설명서 가 도움이 될 수 있습니다. StackOverflow 에는 이와 같은 좋은 질문 있습니다.


3

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();

모든 도움을 주신 Anko에게 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.