I “m 추가 XNA 4.0을 사용하여 WPF8 용 2D 게임 작업을하고 있습니다.
모든 것이 훌륭하지만 너무 빠릅니다. 게임이 끝날 때와 점수 화면 사이에, 그리고 게임이 시작되기 전에 무엇을 할 수 있을까요? 이를 수행하는 방법 (Windows Phone 스타일의 “로드”쓰기가 포함 된 검은 색 화면) 또는 구현 방법에 대한 샘플을 찾고 있습니다.
댓글
- 완전히 불필요한 로딩 화면을 표시하는 이유는 무엇입니까? ' 부드럽게 전환하지 않는 이유는 무엇입니까?
- 예, 그것도 해결책을 찾았지만 ' 그 방법을 찾지 못했습니다. 전환 애니메이션이있는 라이브러리처럼.
답변
XNA에 익숙하지 않기 때문에 코드가 없습니다.하지만 이것은보다 일반적인 “문제”입니다.
-
우선-주석에서 언급했듯이- (절대!) 가짜 로딩 화면을 추가하지 마세요! 사람들은 실제보다 더 나쁜 조명으로 앱을 보여줄 수있는 리소스가 무겁다 고 생각할 것입니다. 특히 모바일에서는 일반적으로 안전한 배터리에 대한 지속적인 로딩 화면을 보여주는 앱을 신뢰하지 않습니다.
-
대신 전환을 추가합니다. 전환하기 매우 쉬운 방법은 검은 색으로 /부터 혼합하는 것입니다. 셰이더를 사용하고 텍스처로 렌더링 할 때 더 흥미로운 작업을 수행 할 수 있지만이 단계는 속도를 늦추기에 충분합니다.
기본 단계는 거의 대부분입니다. 게임 상태, 진행 상황 등을 처리하는 방법에 따라 이에 접근 할 수있는 여러 가지 방법이 있습니다.
- 즉시 게임 상태를 전환하는 대신
GAME_PLAYING
에서GAME_HIGHSCORE
까지 카운터를 설정했습니다. 이름을blending_time
. - 여기서부터
blending_time
가 “0이 아닌 한”전체 화면에 검정색 사각형을 그립니다. 남은 시간을 기준으로 한 알파 값입니다. - 카운터가 0에 도달하면 상태 전환을 수행합니다.
- 소프트 블렌딩을 얻으려면 전체를 반대로 할 수 있습니다. .
- 다시
blending_time
를 블렌딩하려는 시간으로 설정합니다 (다른 값을 사용하거나 일부 토글을 사용하여 블렌딩 여부를 식별 할 수 있습니다. 검정). -
blending_time
가 “0이 아닌 한”전체 장면에 시간에 따라 알파가있는 검정 사각형을 다시 그립니다. 남았습니다 (이번에는 100 % 불투명하게 시작).
댓글
- 동의하지만 정말 현재는 할 일이 없습니다. 일부 게임은 높은 점수를 서버에 게시하고 일부는 광고를 표시하고 일부는 멋진 애니메이션을 표시합니다. ' 당신이 죽고 마지막 체크 포인트로 돌아가는 일종의 게임이라면, 플레이어가 정신적으로 리셋하고 준비하는 데 시간 만 필요하므로 간단한 카운트 다운과 적절한 음악 / SFX만으로도 충분합니다.
답변
원활한 이미지 전환, Incredipede에서 사용 된 멋지고 구현하기 쉬운 셰이더가 있습니다. 이 GDC 2013 강연 에서 아트 팀은 이에 대해 자세히 설명합니다. Unity에서도 구현했습니다. 아이디어를 얻고이를 XNA로 번역하는 코드를 보려면 다음과 같이하십시오.
Shader "Custom/InkPress" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _BlurTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { //Usual post processing setup ZTest Always Cull Off ZWrite Off Fog { Mode off } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #include "UnityCG.cginc" struct v2f { float4 pos : POSITION; float2 uv : TEXCOORD0; }; v2f vert (appdata_img v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } sampler2D _MainTex; sampler2D _BlurTex; float _threshold; float4 frag( v2f v ) : COLOR { // Step 1: Get the brightness of the blur texture float2 vUv = v.uv; float4 returnColour = float4(1.0 , 1.0 , 1.0 , 1.0); float3 texColour = tex2D(_BlurTex , v.uv).xyz; float bright = (texColour.r + texColour.g + texColour.b) / 3.0; //Step 2: Return the main texture pixel colour if its brightness is bellow //the threshold. Clear the pixel otherwise. if(bright < _threshold) { returnColour = tex2D(_MainTex , v.uv); } return returnColour; } ENDCG } } FallBack "Diffuse" }
위의 셰이더는 전환 일뿐입니다. 더 나은 효과를 얻으려면 강연에서 언급 한대로 이미지를 흐리게 처리해야합니다. 단순함을 위해 블러 부분은 생략했습니다.
자세한 내용과 전체 소스를 원하시면 내 페이지 를 확인하세요. .