블로그·사이트·앱에 냥게임즈 넣기

동물 친구 미니게임을 블로그 글 안에, 회사 이벤트에, 어린이 앱의 보상 한 판으로 넣어요

이런 곳에이렇게 넣어요
블로그·카페·개인 홈페이지게임을 고르고 코드 두 줄을 글에 붙여요
회사 사이트·이벤트블로그와 같은 코드로 넣고, 기간과 조건은 문의로 정해요
어린이 앱 (인터넷 연결)웹뷰로 냥게임즈 주소를 열고 신호를 받아요
어린이 앱 (인터넷 없이)앱 전용 파일 묶음(SDK)을 앱 안에 넣어요
맞춤 제작브랜드에 맞춘 화면이나 새 게임을 만들어요

블로그·카페에 넣기

게임을 고르고 코드를 블로그 글에 붙이면, 글 안에서 바로 냥게임즈를 할 수 있어요

1게임 고르기

맨 앞 키즈 모드 전체는 아이용 게임 목록을 통째로 넣어요. 상자 안에서 게임을 골라 하고 목록으로 돌아와요.

2모드와 크기

3코드를 글에 붙이기

기본 코드 · 블로거, 워드프레스, 직접 만든 홈페이지의 HTML 편집 화면

간단 코드 · 티스토리처럼 스크립트를 막는 곳의 HTML 모드

알아 두면 좋아요

  1. 처음엔 가벼운 표지만 보이고, 바로 하기를 누르면 게임을 불러와요. 글이 무거워지지 않아요.
  2. 게임 위쪽에 냥게임즈 로고가 나와요. 키즈 모드가 아니면 로고를 눌러 냥게임즈에서 더 많은 게임을 볼 수 있어요.
  3. 점수는 냥게임즈 랭킹에 그대로 올라가요.
  4. 게임이 화면 밖으로 스크롤되면 혼자 하는 게임은 저절로 멈춰요.
  5. 게임이 추가되거나 고쳐지면 붙여 둔 게임도 자동으로 최신이 돼요.
  6. 네이버 블로그·카페는 글에 코드를 넣을 수 없어요. 게임 주소(예: nyang.games/jump/)를 붙이면 그림이 있는 미리보기 카드로 들어가고, 누르면 냥게임즈에서 열려요.

미리보기

블로그 글 안에 이렇게 보여요

회사 사이트·이벤트에 넣기

회사 홈페이지나 이벤트 페이지에 냥게임즈 게임을 넣어요. 붙이는 방법은 블로그와 같고, 쓰는 기간과 조건은 문의로 정해요

어린이 앱에 넣기

앱에서 보상 조건을 채우면 냥게임즈 한 판을 열어요. 인터넷으로 주소를 열거나, 파일 묶음을 앱 안에 넣어 인터넷 없이 열 수 있어요

앱이 열어요보상 조건(예: 문제 10개)을 채우면 웹뷰로 게임을 열어요
아이가 한 판진행 상황이 ready start end 신호로 앱에 와요
앱으로 돌아와요돌아가기를 누르면 close가 와요. 웹뷰를 닫으면 끝이에요

두 가지 넣는 방법

인터넷 연결인터넷 없이 (SDK)
여는 것https://nyang.games/kids/ 주소앱 안에 넣은 파일
인터넷필요해요필요 없어요
앱 크기늘지 않아요약 2.5MB 늘어요 (게임 10개 기준, 그중 글꼴이 2MB)
새 게임·고친 점바로 반영돼요새 묶음으로 바꿔 넣으면 반영돼요
들어가는 게임키즈 게임 전체 (주소로 골라 보여 주기)계약한 게임만 묶음에 들어가요
신호 (ready·end·close 등)똑같아요. 앱 쪽 코드는 여는 주소만 바꾸면 돼요

아이 정보 보호

키즈 모드에서 쓸 수 있는 게임

게임 id이름한 판이 끝나는 때score 값
sushi냥냥 초밥집하트 3개가 다 없어지면받은 손님 수
flag냥냥 청기백기하트 3개가 다 없어지면맞힌 명령 수
odd냥냥 다른 그림 찾기시간 막대가 바닥나거나 하트 3개가 다 없어지면찾은 개수
rps냥냥 눈치 가위바위보하트 3개가 다 없어지면맞힌 판 수
color냥냥 색깔 맞히기하트 3개가 다 없어지면맞힌 글씨 수
cushion냥냥 방석탑시간 막대가 바닥나면뺀 방석 수
link냥냥 이어팡기운 막대가 바닥나면한 판 점수
pair냥냥 짝꿍 찾기단계 1개를 깨거나 시간이 끝나면깬 단계 번호 (못 깨면 0)
tiles냥냥 짝꿍 블럭판 1개를 깨거나 시간이 끝나면깬 판 번호 (못 깨면 0)
volley냥냥 배구컴퓨터와 한 판(7점)이 끝나면내가 낸 점수 (0~7)
train냥냥 기차놀이울타리나 내 기차에 부딪히면태운 친구 수
run냥냥 달리기장애물에 부딪히면달린 거리(m)
jump냥이 점프떨어지면올라간 높이(m)
kung쿵쿵 냥이가시·청소기에 닿으면내려간 층수
fish냥냥 낚시낚시 시간이 끝나면가장 큰 물고기(mm)
block냥냥 블럭블럭이 무너지면쌓은 높이(cm)
merge뭉쳐라 냥냥통이 꽉 차면점수
chain냥냥 몽글몽글판이 꽉 차면점수
trio반짝냥판이 꽉 차면점수
yarn팡팡냥젤리가 선을 넘으면점수
escape냥냥 대탈출스테이지 1개를 깨거나 실패하면깬 스테이지 번호 (못 깨면 0)
bung냥냥 붕어빵하루 장사가 끝나면번 돈(원)

인형뽑기(뽑기 방식), 트리(다른 사람이 쓴 쪽지), 오목·윷놀이·댄스 같이하기(링크로 다른 사람과 연결)는 어린이 앱에 맞지 않아 키즈 모드에 넣지 않았어요.

인터넷 연결: 웹뷰로 주소 열기

따로 설치할 것 없이 주소 하나면 돼요.

무엇을주소
아이가 게임을 고르는 화면https://nyang.games/kids/?partner=앱이름
보여 줄 게임만 골라서https://nyang.games/kids/?partner=앱이름&games=jump,merge,fish
게임 하나를 바로https://nyang.games/jump/?mode=kids&partner=앱이름

partner는 영문·숫자·-·_·.로 된 앱 이름이에요(40자까지). 신호에 그대로 실려 와서 어느 앱에서 열었는지 구분할 수 있어요.

연동 방법 자세히 보기 · 신호와 앱 코드 예시

받는 신호

모든 신호는 아래 모양이에요. source가 "nyang.games"인 것만 받으세요.

{ "source": "nyang.games", "type": "end", "partner": "앱이름",
  "game": "jump", "score": 132, "scoreText": "245점" }
type언제같이 오는 값
ready화면이 열렸을 때 (고르기 화면은 game: "")game
pick고르기 화면에서 게임을 눌렀을 때game
start시작 버튼을 눌렀을 때game
end한 판이 끝났을 때 (한 번만)game, score(숫자), scoreText(화면에 보이는 글)
close"돌아가기" 또는 고르기 화면의 "닫기"를 눌렀을 때game

보상은 앱이 이미 줬으니(게임 한 판 자체가 보상), 보통은 close만 받아서 웹뷰를 닫으면 충분해요. end의 점수는 "오늘의 기록" 같은 재미 요소로 쓰면 좋아요. 점수는 아이 기기에서 만들어지는 값이라, 포인트·현금성 보상의 근거로는 쓰지 마세요.

앱 코드 예시

게임은 아래 다섯 가지 통로로 동시에 신호를 보내요. 앱 종류에 맞는 것 하나만 받으면 돼요.

<iframe id="nyang" src="https://nyang.games/kids/?partner=myapp"
        style="width:100%;height:100%;border:0" allow="autoplay"></iframe>
<script>
  addEventListener('message', (e) => {
    if (e.origin !== 'https://nyang.games') return;
    const m = e.data;
    if (!m || m.source !== 'nyang.games') return;
    if (m.type === 'end') console.log('점수', m.game, m.score, m.scoreText);
    if (m.type === 'close') document.getElementById('nyang').remove(); // 게임 창 닫기
  });
</script>

붙일 때 알아 두면 좋은 것

  • 웹뷰는 화면 전체(세로)로 열어 주세요. 게임은 폰 세로 화면에 맞춰져 있어요.
  • 기기 뒤로 가기 버튼은 웹뷰를 닫는 것으로 처리하면 돼요 (게임 안에 따로 나가는 길이 없어요).
  • 배경 음악은 처음 탭한 뒤에 나와요. 소리 끄기 버튼은 게임 화면 위쪽에 있어요.
  • 한 판 길이는 게임마다 1~5분쯤이에요. 정해진 시간으로 끊고 싶으면 앱에서 타이머로 웹뷰를 닫아도 돼요.
  • 글꼴 파일 하나(Pretendard, jsDelivr)를 외부에서 불러와요.

인터넷 없이: 오프라인 SDK

냥게임즈 게임을 파일 묶음으로 앱 안에 넣어요. 비행기 모드나 와이파이 없는 태블릿에서도 열려요.

nyang-kids-sdk-0.1.0-앱이름.zip앱 하나를 위해 만든 묶음
  • www/kids/index.html게임 고르기 화면, 여기를 열어요
  • www/<게임 id>/index.html게임 하나를 바로 열 때
  • www/sdk.js사용 허가 확인 (고치지 마세요)
  • www/fonts/글꼴까지 들어 있어 바깥에서 받을 게 없어요
  • README.md · LICENSE.txt연동 요약 · 사용 조건
  • sdk.json · demo.html버전·게임·기한 · PC 시험 페이지

예: 게임 10개를 넣은 묶음 (약 2.5MB)

  1. 묶음 받기
  2. www 폴더를 앱에 넣기
  3. 웹뷰로 kids/index.html 열기
  4. close가 오면 닫기

키즈 모드 게임 22가지 가운데 원하는 게임을 골라 묶을 수 있어요. 앱 이름(영문), 넣고 싶은 게임, 쓰실 기간을 알려 주시면 그 앱 전용 묶음을 만들어 드려요.

냥냥 청기백기flag냥냥 다른 그림 찾기odd냥냥 눈치 가위바위보rps 냥냥 색깔 맞히기color냥냥 초밥집sushi냥냥 방석탑cushion 냥냥 이어팡link냥냥 짝꿍 찾기pair냥냥 짝꿍 블럭tiles 냥냥 대탈출escape뭉쳐라 냥냥merge냥냥 몽글몽글chain 반짝냥trio팡팡냥yarn냥냥 블럭block 냥이 점프jump쿵쿵 냥이kung냥냥 달리기run 냥냥 기차놀이train냥냥 배구volley냥냥 낚시fish냥냥 붕어빵bung
SDK 넣는 방법 자세히 보기 · 앱 코드, 신호, 사용 허가

앱에 넣고 열기

앱 종류에 맞는 방법 하나만 하면 돼요. 저장(localStorage)과 자바스크립트를 켜 주세요. 게임 최고 기록이 여기에 남아요.

www 폴더를 app/src/main/assets/nyang/에 넣고, WebViewAssetLoader로 열어요. 앱 안 파일이 https://appassets.androidplatform.net/ 주소로 열려서 사용 허가 확인까지 제대로 동작해요.

// build.gradle: implementation "androidx.webkit:webkit:1.11.0"
val loader = WebViewAssetLoader.Builder()
    .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this))
    .build()

webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true            // 최고 기록 저장
webView.settings.mediaPlaybackRequiresUserGesture = false
webView.webViewClient = object : WebViewClientCompat() {
    override fun shouldInterceptRequest(v: WebView, r: WebResourceRequest) =
        loader.shouldInterceptRequest(r.url)
}
webView.addJavascriptInterface(NyangBridge(this), "NyangBridge")   // 이름은 꼭 "NyangBridge"
webView.loadUrl("https://appassets.androidplatform.net/assets/nyang/kids/index.html")

class NyangBridge(private val activity: Activity) {
    @JavascriptInterface
    fun postMessage(json: String) {
        val m = JSONObject(json)
        if (m.optString("source") != "nyang.games") return
        when (m.optString("type")) {
            "end" -> Log.d("nyang", "score=${m.optInt("score")}")
            "close" -> activity.runOnUiThread { activity.finish() }
        }
    }
}

게임 하나만 바로 열 때는 kids/index.html 대신 jump/index.html처럼 게임 폴더의 index.html을 열면 돼요.

받는 신호

인터넷 연결 방식과 똑같은 신호가 와요. 오프라인 SDK에는 error 하나가 더 있어요.

type언제같이 오는 값
ready · pick · start · end · close인터넷 연결 방식과 같아요game (end는 score, scoreText도)
error사용 기한이 지났거나, 허가되지 않은 게임·묶음일 때 (게임 대신 안내 화면이 떠요)reason

partner에는 묶음에 적힌 앱 이름이 자동으로 실려요.

사용 허가와 표시

  • 묶음마다 파트너 키가 들어 있어요. 앱 이름, 넣은 게임, 사용 기한이 적혀 있고 냥게임즈가 서명했어요.
  • 게임은 열릴 때마다 인터넷 없이 이 키를 확인해요. 기한이 지나거나, 묶음에 없는 게임이거나, 파일이 바뀌어 서명이 맞지 않으면 게임 대신 "게임을 열 수 없어요" 안내가 뜨고 error 신호가 와요.
  • 게임 결과 화면과 고르기 화면 아래에 작은 냥게임즈 표시가 있어요. 가리지 말아 주세요.
  • www 안 파일을 고치거나 다른 앱·웹사이트로 옮기면 안 돼요. 묶음마다 고유 번호가 들어 있어요 (자세한 건 LICENSE.txt와 계약서).
기한이 다가오면 새 키가 든 묶음을 다시 드려요. 기한이 지나도 게임이 열리지 않을 뿐, 앱이 멈추지는 않아요.

업데이트

  • 새 게임이나 고친 점이 나오면 새 버전 묶음을 드려요. www 폴더를 통째로 바꿔 넣고 앱을 업데이트하면 돼요.
  • 신호 모양이 바뀌는 큰 변경은 버전 앞자리를 올리고(예: 1.x → 2.0) 미리 알려 드려요. 그 밖의 업데이트는 앱 쪽 코드를 고칠 필요가 없어요.
  • 인터넷이 될 때 새 묶음을 알아서 받아 두는 자동 업데이트는 준비 중이에요.

알아 두면 좋은 것

  • 소리와 음악은 파일 없이 기기에서 만들어져요. 글꼴도 묶음 안에 있어서 바깥에서 불러오는 파일이 하나도 없어요.
  • 웹뷰는 화면 전체(세로)로 열어 주세요. 기기 뒤로 가기 버튼은 웹뷰를 닫는 것으로 처리하면 돼요.
  • PC에서 먼저 보고 싶으면 묶음의 demo.html을 로컬 서버로 열어 보세요 (예: 묶음 폴더에서 npx serve). 파일을 바로 열면 브라우저가 막을 수 있어요.

맞춤 제작

브랜드나 서비스에 맞춘 게임 화면, 새 미니게임을 냥게임즈 그림체로 만들어요. 일정과 조건은 문의로 정해요

문의

문의 창구(카카오톡 채널·이메일)를 준비하고 있어요. 열리면 이 자리에 안내할게요. 블로그·카페에 넣는 건 문의 없이 위 코드로 바로 하시면 돼요.