本文へスキップstate=CHASE vy+=G*dt shake(0.3) perlin(u,v) fadeOut(1.0) RAYCAST LIGHTMAP MINIBOSS cross(a,b) sign(vx) FRAME if(combo>best) WEBGL moveTo(next) ease=t*t SKELETON vy=min(vy,MAX) ox=cx+cos(a)*d if(see(player)) perlin(u,v) orbit(t) shuffle(deck) FADE oy=cy+sin(a)*d present() dot(n,l) HITBOX MESH vx*=0.9 UPGRADE hitstop(0.05) play(hit) spin(0.05) shuffle(deck) spin(0.05) y+=vy*dt perlin(u,v) SPAWN scale=1+p*0.2 MINIBOSS WALK x+=vx*dt seed^=seed<<13 placeChest() dt=1/60 GAMELOOP fadeOut(1.0) STAMINA CRAFTING GRAVITY draw(sprite) PARRY GARBAGE play(hit) PLAYTEST if(see(player)) wave=sin(time*2) update(dt) SPRITE normalize(v) state=CHASE vy+=G*dt shake(0.3) perlin(u,v) fadeOut(1.0) RAYCAST LIGHTMAP MINIBOSS cross(a,b) sign(vx) FRAME if(combo>best) WEBGL moveTo(next) ease=t*t SKELETON vy=min(vy,MAX) ox=cx+cos(a)*d if(see(player)) perlin(u,v) orbit(t) shuffle(deck) FADE oy=cy+sin(a)*d present() dot(n,l) HITBOX MESH vx*=0.9 UPGRADE hitstop(0.05) play(hit) spin(0.05) shuffle(deck) spin(0.05) y+=vy*dt perlin(u,v) SPAWN scale=1+p*0.2 MINIBOSS WALK x+=vx*dt seed^=seed<<13 placeChest() dt=1/60 GAMELOOP fadeOut(1.0) STAMINA CRAFTING GRAVITY draw(sprite) PARRY GARBAGE play(hit) PLAYTEST if(see(player)) wave=sin(time*2) update(dt) SPRITE normalize(v) poll(input) y+=vy*dt PROFILER lives-- HEALTH HITBOX TWEEN pos=pos+vel SPAWN render() EASING draw(sprite) DROP aabb(a,b) TWEEN speed=8.0 LEVELUP ATTACK crit=rng()<0.1 TUTORIAL RESPAWN TWEEN VERTEX roll=rng(1,20) shake(0.3) SHADER if(lives==0) CHEST NOISE TUTORIAL score+=100 MEMORY PATROL BUGFIX orbit(t) if(combo>best) BUFF MANA fadeOut(1.0) HUD flood(x,y) perlin(u,v) update(dt) HEALTH flash(0.1) perlin(u,v) SEED state=IDLE sleep(rest) JUMP DODGE flee() neighbors(x,y) tile=map[idx] grid[y][x]=1 speed=8.0 RUN emit(particles) aggro+=1 MEMORY if(tile==WALL) noise(x,y) MESH die() TICK lvl=floor(exp/100) update(dt) WEBGL pick(table) sign(vx) state=IDLE score+=100 speed=8.0 clamp(v,0,1) IFRAMES if(roll>=15) poll(input) y+=vy*dt PROFILER lives-- HEALTH HITBOX TWEEN pos=pos+vel SPAWN render() EASING draw(sprite) DROP aabb(a,b) TWEEN speed=8.0 LEVELUP ATTACK crit=rng()<0.1 TUTORIAL RESPAWN TWEEN VERTEX roll=rng(1,20) shake(0.3) SHADER if(lives==0) CHEST NOISE TUTORIAL score+=100 MEMORY PATROL BUGFIX orbit(t) if(combo>best) BUFF MANA fadeOut(1.0) HUD flood(x,y) perlin(u,v) update(dt) HEALTH flash(0.1) perlin(u,v) SEED state=IDLE sleep(rest) JUMP DODGE flee() neighbors(x,y) tile=map[idx] grid[y][x]=1 speed=8.0 RUN emit(particles) aggro+=1 MEMORY if(tile==WALL) noise(x,y) MESH die() TICK lvl=floor(exp/100) update(dt) WEBGL pick(table) sign(vx) state=IDLE score+=100 speed=8.0 clamp(v,0,1) IFRAMES if(roll>=15) TICK play(hit) if(see(player)) TEXTURE sin(t)*r INVENTORY cooldown-=dt if(combo>best) WAVE VSYNC PROCGEN spawnRoom() FADE tween(x,to,0.4) DEADZONE FRAME PATROL SWARM lives-- combo*=2 lerp(a,b,t) fadeOut(1.0) if(lives==0) RAYCAST AGGRO vy=-JUMP orbit(t) BUFF LOOP MANA cos(t)*r play(hit) hp-=dmg WAVE dt=1/60 MINIBOSS draw(sprite) KNOCKBACK VIEWPORT scale=1+p*0.2 INVENTORY if(roll>=15) if(see(player)) fixedUpdate() VIEWPORT SPRITE cooldown-=dt FIXEDSTEP while(running) GRAVITY length(v) RESPAWN emit(particles) CAMERA speed=8.0 vy=min(vy,MAX) y+=vy*dt STAMINA crit=rng()<0.1 WEBGL HUD score+=100 connect(a,b) RIG ENEMY vy=-JUMP hitstop(0.05) MESH UPGRADE STAMINA lerp(a,b,t) SPRITE MESH PLAYTEST FPS ox=cx+cos(a)*d x+=vx*dt SEED alpha-=dt CRIT DEBUFF aggro+=1 exp+=50 tween(x,to,0.4) TICK play(hit) if(see(player)) TEXTURE sin(t)*r INVENTORY cooldown-=dt if(combo>best) WAVE VSYNC PROCGEN spawnRoom() FADE tween(x,to,0.4) DEADZONE FRAME PATROL SWARM lives-- combo*=2 lerp(a,b,t) fadeOut(1.0) if(lives==0) RAYCAST AGGRO vy=-JUMP orbit(t) BUFF LOOP MANA cos(t)*r play(hit) hp-=dmg WAVE dt=1/60 MINIBOSS draw(sprite) KNOCKBACK VIEWPORT scale=1+p*0.2 INVENTORY if(roll>=15) if(see(player)) fixedUpdate() VIEWPORT SPRITE cooldown-=dt FIXEDSTEP while(running) GRAVITY length(v) RESPAWN emit(particles) CAMERA speed=8.0 vy=min(vy,MAX) y+=vy*dt STAMINA crit=rng()<0.1 WEBGL HUD score+=100 connect(a,b) RIG ENEMY vy=-JUMP hitstop(0.05) MESH UPGRADE STAMINA lerp(a,b,t) SPRITE MESH PLAYTEST FPS ox=cx+cos(a)*d x+=vx*dt SEED alpha-=dt CRIT DEBUFF aggro+=1 exp+=50 tween(x,to,0.4) placeChest() if(lives==0) PROFILER placeChest() ENEMY BUGFIX SEED emit(particles) while(running) HURTBOX RESPEC seed^=seed>>17 rand()%6 spin(0.05) swapBuffers() FRICTION KEYFRAME LEVELUP MESH EASING GRAVITY if(near)attack() VSYNC coins++ RAYCAST atan2(dy,dx) noise(x,y) TILESET TILEMAP ATTACK HURTBOX PARALLAX SCREENSHAKE shuffle(deck) scale=1+p*0.2 VERTEX VSYNC abs(dx) PROCGEN tile=map[idx] if(see(player)) clamp(v,0,1) MINIMAP SHADER clamp(v,0,1) TWEEN combo*=2 shake(0.3) vy+=G*dt DEADZONE COOLDOWN PROFILER IFRAMES speed=8.0 vx*=0.9 CHECKPOINT DUNGEON BUFF PROCGEN DASH OVERLAY COLLIDER gameOver() orbit(t) MINIMAP orbit(t) ENEMY score+=100 DASH swapBuffers() hitstop(0.05) seed^=seed>>17 roll=rng(1,20) placeChest() if(lives==0) PROFILER placeChest() ENEMY BUGFIX SEED emit(particles) while(running) HURTBOX RESPEC seed^=seed>>17 rand()%6 spin(0.05) swapBuffers() FRICTION KEYFRAME LEVELUP MESH EASING GRAVITY if(near)attack() VSYNC coins++ RAYCAST atan2(dy,dx) noise(x,y) TILESET TILEMAP ATTACK HURTBOX PARALLAX SCREENSHAKE shuffle(deck) scale=1+p*0.2 VERTEX VSYNC abs(dx) PROCGEN tile=map[idx] if(see(player)) clamp(v,0,1) MINIMAP SHADER clamp(v,0,1) TWEEN combo*=2 shake(0.3) vy+=G*dt DEADZONE COOLDOWN PROFILER IFRAMES speed=8.0 vx*=0.9 CHECKPOINT DUNGEON BUFF PROCGEN DASH OVERLAY COLLIDER gameOver() orbit(t) MINIMAP orbit(t) ENEMY score+=100 DASH swapBuffers() hitstop(0.05) seed^=seed>>17 roll=rng(1,20) BUFF CRAFTING present() RESPAWN KEYFRAME TUTORIAL MINIMAP poll(input) ENEMY DELTATIME if(dist<r1+r2) tile=map[idx] PATROL NOISE PATROL present() PIXELART seed^=seed<<13 PLAYTEST scale=1+p*0.2 best=combo SHIELD RESPEC connect(a,b) CHECKPOINT RAYCAST oy=cy+sin(a)*d TRANSITION NOISE round(score) play(hit) if(roll>=15) y+=vy*dt JUMP PROFILER TILEMAP swapBuffers() hp-=dmg clamp(v,0,1) TUTORIAL PROFILER SPAWNER TRANSITION fixedUpdate() BUFF CRAFTING present() RESPAWN KEYFRAME TUTORIAL MINIMAP poll(input) ENEMY DELTATIME if(dist<r1+r2) tile=map[idx] PATROL NOISE PATROL present() PIXELART seed^=seed<<13 PLAYTEST scale=1+p*0.2 best=combo SHIELD RESPEC connect(a,b) CHECKPOINT RAYCAST oy=cy+sin(a)*d TRANSITION NOISE round(score) play(hit) if(roll>=15) y+=vy*dt JUMP PROFILER TILEMAP swapBuffers() hp-=dmg clamp(v,0,1) TUTORIAL PROFILER SPAWNER TRANSITION fixedUpdate() length(v) flee() TEXTURE JUMP PLAYTEST tween(x,to,0.4) LIGHTMAP SEED DEADZONE MESH aggro+=1 draw(sprite) aggro+=1 CHEST if(near)attack() ease=t*t overlap(r1,r2) for(i=0;i<n;i++) GRAVITY ox=cx+cos(a)*d alpha-=dt fadeOut(1.0) SPRITE PARRY ATTACK score+=100 flood(x,y) atan2(dy,dx) die() if(combo>best) next=path.shift() if(near)attack() COLLIDER TICK DELTATIME lives-- SEED SWARM PLAYTEST if(roll>=15) present() emit(particles) BUGFIX MINIMAP dt=1/60 SHIELD idx=y*W+x BUFF PARALLAX ATTACK FRICTION path=astar(a,b) FRICTION hp-=dmg lvl=floor(exp/100) roll=rng(1,20) dt=1/60 vy+=G*dt length(v) flee() TEXTURE JUMP PLAYTEST tween(x,to,0.4) LIGHTMAP SEED DEADZONE MESH aggro+=1 draw(sprite) aggro+=1 CHEST if(near)attack() ease=t*t overlap(r1,r2) for(i=0;i<n;i++) GRAVITY ox=cx+cos(a)*d alpha-=dt fadeOut(1.0) SPRITE PARRY ATTACK score+=100 flood(x,y) atan2(dy,dx) die() if(combo>best) next=path.shift() if(near)attack() COLLIDER TICK DELTATIME lives-- SEED SWARM PLAYTEST if(roll>=15) present() emit(particles) BUGFIX MINIMAP dt=1/60 SHIELD idx=y*W+x BUFF PARALLAX ATTACK FRICTION path=astar(a,b) FRICTION hp-=dmg lvl=floor(exp/100) roll=rng(1,20) dt=1/60 vy+=G*dt IFRAMES connect(a,b) COOLDOWN combo*=2 atan2(dy,dx) LOOP CHEST rand()%6 RESPAWN ATTACK NPC dot(n,l) UPGRADE FIXEDSTEP y+=vy*dt x+=vx*dt sign(vx) DELTATIME CRIT poll(input) round(score) sleep(rest) hp-=dmg clamp(v,0,1) fixedUpdate() SKELETON IFRAMES vx*=0.9 SAVEPOINT RESPAWN dist=hypot(dx,dy) sin(t)*r pos=pos+vel play(hit) rand()%6 DUNGEON overlap(r1,r2) wave=sin(time*2) LIGHTMAP poll(input) floor(x/TILE) play(hit) lerp(a,b,t) HURTBOX play(hit) shake(0.3) atan2(dy,dx) LIGHTMAP SPAWNER WAVE dot(n,l) while(running) vy=min(vy,MAX) placeChest() IFRAMES PATCH MESH pick(table) IFRAMES connect(a,b) COOLDOWN combo*=2 atan2(dy,dx) LOOP CHEST rand()%6 RESPAWN ATTACK NPC dot(n,l) UPGRADE FIXEDSTEP y+=vy*dt x+=vx*dt sign(vx) DELTATIME CRIT poll(input) round(score) sleep(rest) hp-=dmg clamp(v,0,1) fixedUpdate() SKELETON IFRAMES vx*=0.9 SAVEPOINT RESPAWN dist=hypot(dx,dy) sin(t)*r pos=pos+vel play(hit) rand()%6 DUNGEON overlap(r1,r2) wave=sin(time*2) LIGHTMAP poll(input) floor(x/TILE) play(hit) lerp(a,b,t) HURTBOX play(hit) shake(0.3) atan2(dy,dx) LIGHTMAP SPAWNER WAVE dot(n,l) while(running) vy=min(vy,MAX) placeChest() IFRAMES PATCH MESH pick(table) rand()%6 fadeOut(1.0) GAMELOOP sleep(rest) SKELETON GAMELOOP VELOCITY AGGRO if(near)attack() abs(dx) TILESET moveTo(next) SKILLTREE y+=vy*dt lives-- spin(0.05) DEBUFF CRIT SKELETON flash(0.1) ANIMATION pick(table) aabb(a,b) KEYFRAME neighbors(x,y) vx*=0.9 OVERLAY moveTo(next) TRANSITION KEYFRAME HITSTUN vy=-JUMP moveTo(next) while(running) perlin(u,v) if(see(player)) if(near)attack() if(near)attack() hp-=dmg moveTo(next) length(v) ENEMY sin(t)*r AGGRO crit=rng()<0.1 ox=cx+cos(a)*d KEYFRAME VIEWPORT lives-- sign(vx) HEALTH aabb(a,b) MINIBOSS GRAVITY ENEMY dt=1/60 die() DEBUFF dt=1/60 SEED cos(t)*r gameOver() SPAWN RUN MANA LIGHTMAP if(see(player)) STAMINA rand()%6 fadeOut(1.0) GAMELOOP sleep(rest) SKELETON GAMELOOP VELOCITY AGGRO if(near)attack() abs(dx) TILESET moveTo(next) SKILLTREE y+=vy*dt lives-- spin(0.05) DEBUFF CRIT SKELETON flash(0.1) ANIMATION pick(table) aabb(a,b) KEYFRAME neighbors(x,y) vx*=0.9 OVERLAY moveTo(next) TRANSITION KEYFRAME HITSTUN vy=-JUMP moveTo(next) while(running) perlin(u,v) if(see(player)) if(near)attack() if(near)attack() hp-=dmg moveTo(next) length(v) ENEMY sin(t)*r AGGRO crit=rng()<0.1 ox=cx+cos(a)*d KEYFRAME VIEWPORT lives-- sign(vx) HEALTH aabb(a,b) MINIBOSS GRAVITY ENEMY dt=1/60 die() DEBUFF dt=1/60 SEED cos(t)*r gameOver() SPAWN RUN MANA LIGHTMAP if(see(player)) STAMINA UPGRADE VIEWPORT MINIMAP VELOCITY die() sleep(rest) lvl=floor(exp/100) grid[y][x]=1 VERTEX JUMP wave=sin(time*2) WALK TILEMAP RAYCAST cross(a,b) tween(x,to,0.4) tween(x,to,0.4) aabb(a,b) ease=t*t SPAWNER dt=1/60 SPAWN SHADER CRAFTING sign(vx) vx*=0.9 clamp(v,0,1) orbit(t) neighbors(x,y) LOOT EASING LEVELUP abs(dx) dot(n,l) PROFILER next=path.shift() SKELETON vy=-JUMP TILEMAP if(near)attack() atan2(dy,dx) PARTICLE if(roll>=15) carve(room) speed=8.0 LIGHTMAP state=CHASE FADE present() FRAME TILEMAP vy=min(vy,MAX) orbit(t) UPGRADE VIEWPORT MINIMAP VELOCITY die() sleep(rest) lvl=floor(exp/100) grid[y][x]=1 VERTEX JUMP wave=sin(time*2) WALK TILEMAP RAYCAST cross(a,b) tween(x,to,0.4) tween(x,to,0.4) aabb(a,b) ease=t*t SPAWNER dt=1/60 SPAWN SHADER CRAFTING sign(vx) vx*=0.9 clamp(v,0,1) orbit(t) neighbors(x,y) LOOT EASING LEVELUP abs(dx) dot(n,l) PROFILER next=path.shift() SKELETON vy=-JUMP TILEMAP if(near)attack() atan2(dy,dx) PARTICLE if(roll>=15) carve(room) speed=8.0 LIGHTMAP state=CHASE FADE present() FRAME TILEMAP vy=min(vy,MAX) orbit(t) lerp(a,b,t) CULLING KNOCKBACK y+=vy*dt FRAME CHECKPOINT wave=sin(time*2) WEBGL next=path.shift() HITSTUN PROFILER RESPAWN flee() WALK TRANSITION grid[y][x]=1 SPAWN rand()%6 if(dist<r1+r2) noise(x,y) vx*=0.9 FIXEDSTEP RESPAWN draw(sprite) MANA abs(dx) VELOCITY JUMP seed^=seed<<13 PATROL shake(0.3) PROFILER alpha-=dt speed=8.0 LEVELUP angle+=PI/60 state=IDLE spawnRoom() lvl=floor(exp/100) dt=1/60 vy=-JUMP PATROL MEMORY BIOME CHEST state=CHASE if(tile==WALL) DEADZONE hp-=dmg placeChest() MESH WAVE round(score) shake(0.3) FRAME for(i=0;i<n;i++) IDLE BOSS abs(dx) lvl=floor(exp/100) SPRITE present() flood(x,y) RESPAWN present() sleep(rest) vy=min(vy,MAX) lerp(a,b,t) CULLING KNOCKBACK y+=vy*dt FRAME CHECKPOINT wave=sin(time*2) WEBGL next=path.shift() HITSTUN PROFILER RESPAWN flee() WALK TRANSITION grid[y][x]=1 SPAWN rand()%6 if(dist<r1+r2) noise(x,y) vx*=0.9 FIXEDSTEP RESPAWN draw(sprite) MANA abs(dx) VELOCITY JUMP seed^=seed<<13 PATROL shake(0.3) PROFILER alpha-=dt speed=8.0 LEVELUP angle+=PI/60 state=IDLE spawnRoom() lvl=floor(exp/100) dt=1/60 vy=-JUMP PATROL MEMORY BIOME CHEST state=CHASE if(tile==WALL) DEADZONE hp-=dmg placeChest() MESH WAVE round(score) shake(0.3) FRAME for(i=0;i<n;i++) IDLE BOSS abs(dx) lvl=floor(exp/100) SPRITE present() flood(x,y) RESPAWN present() sleep(rest) vy=min(vy,MAX) roll=rng(1,20) if(hp<=0) PATCH SKELETON shake(0.3) VERTEX seed^=seed>>17 grid[y][x]=1 MINIMAP vy=-JUMP fadeOut(1.0) lvl=floor(exp/100) FADE WEBGL MINIMAP carve(room) PARALLAX ENEMY HURTBOX cross(a,b) BUILD JUMP exp+=50 KNOCKBACK if(roll>=15) HUD clamp(v,0,1) RAYCAST TILESET dist=hypot(dx,dy) sleep(rest) aggro+=1 floor(x/TILE) SWARM while(running) if(lives==0) PROFILER if(near)attack() DROP clamp(v,0,1) gameOver() connect(a,b) if(roll>=15) PARRY HURTBOX update(dt) WALK state=IDLE overlap(r1,r2) BIOME LOOP VIEWPORT shuffle(deck) exp+=50 seed^=seed<<13 DEADZONE GRAVITY PATROL idx=y*W+x cooldown-=dt lives-- atan2(dy,dx) state=IDLE if(dist<r1+r2) onHit(dmg) spin(0.05) moveTo(next) flood(x,y) TWEEN SHIELD VSYNC render() BUGFIX gameOver() SCREENSHAKE roll=rng(1,20) if(hp<=0) PATCH SKELETON shake(0.3) VERTEX seed^=seed>>17 grid[y][x]=1 MINIMAP vy=-JUMP fadeOut(1.0) lvl=floor(exp/100) FADE WEBGL MINIMAP carve(room) PARALLAX ENEMY HURTBOX cross(a,b) BUILD JUMP exp+=50 KNOCKBACK if(roll>=15) HUD clamp(v,0,1) RAYCAST TILESET dist=hypot(dx,dy) sleep(rest) aggro+=1 floor(x/TILE) SWARM while(running) if(lives==0) PROFILER if(near)attack() DROP clamp(v,0,1) gameOver() connect(a,b) if(roll>=15) PARRY HURTBOX update(dt) WALK state=IDLE overlap(r1,r2) BIOME LOOP VIEWPORT shuffle(deck) exp+=50 seed^=seed<<13 DEADZONE GRAVITY PATROL idx=y*W+x cooldown-=dt lives-- atan2(dy,dx) state=IDLE if(dist<r1+r2) onHit(dmg) spin(0.05) moveTo(next) flood(x,y) TWEEN SHIELD VSYNC render() BUGFIX gameOver() SCREENSHAKE
公開までの流れ
作品を zip にまとめる
書き出した作品を一度最後まで遊んで確かめてから、zip にします。ブラウザで遊べる形なら zip の直下に index.html、ダウンロード配布なら書き出したままの並びで。上限は 200MB です。
画面の写真を用意する
カバー 1 枚と、遊んでいる場面の写真を 6 枚まで。横 600 × 縦 315 以上(png / jpg / webp、1 枚 3MB まで)。タイトル画面より、遊んでいる場面のほうが伝わります。
説明文を書く(運営におまかせもできます)
「何をする遊びか」を最初の 1 文に書きます。うまく書けないときは、運営が作品を見てキャッチコピーと説明文を無料で作成します。問い合わせ窓口から一言ください。
登録して投稿する
メールアドレスで登録し、投稿フォームから zip を送ります。自動のウイルス検査(数分)が通れば、そのまま公開できます。
公開して、URL を知らせる
公開すると作品の URL が決まります。SNS で知らせるときはこの URL を貼ってください。感想と★評価がこのページに集まります。作品ページは Google と AI 検索(ChatGPT など)の両方から見つかる構造で公開されます。
zip のまとめ方
ここでつまずく人がいちばん多いところです。ブラウザで遊べる形にするかどうかで、 正しい形が変わります。
| ブラウザで遊べる形 | zip の直下に index.html がある形。 書き出したフォルダごとではなく、フォルダの中身を圧縮します。 素材への参照はすべて相対パスにしてください。 |
|---|
| ダウンロード配布 | 実行ファイルとデータのフォルダが、書き出したときの並びのまま入っている形。 遊ぶ人は展開してそのまま起動します。編集用のプロジェクトファイルは 入れないでください。 |
|---|
| 大きさの上限 | zip 200MB、ファイル数 5,000、展開後の合計 400MB まで。 この上限は、ウイルス検査が中身を最後まで調べきれる範囲から決めています。 |
|---|
大きすぎて収まらないときは、まず使っていない素材を外してください。作りながら 差し替えた画像や音声が残っていることが多く、それだけで数十MB 減ることがあります。 ツールによっては書き出し時に「未使用の素材を含めない」指定ができます。
ファイル名は半角の英数字にしておくと安全です。手元の Windows では日本語名でも 動きますが、配信側では大文字小文字が区別されるため、スクリプトの記述と実際の ファイル名がずれていると読み込めません。
使っているツール別の書き出し手順を見る
画面の写真の撮り方
一覧に並んだとき、遊ぶかどうかを決めているのはほとんど画像です。 カバー 1 枚と、遊んでいる場面を 6 枚まで登録できます。
- カバーは 1 枚目に見せたい場面を。タイトル画面より、遊んでいる場面のほうが伝わります。一覧カードでは 横長に切り取られるため、大事なものを中央に置いてください
- UI が読める大きさで撮る。縮小して表示されるので、細かい文字は潰れます。撮るときに画面を拡大しておくと 読める写真になります
- 違う場面を並べる。似た構図を 6 枚並べても情報は増えません。戦闘・会話・マップのように、 何が起きる遊びなのかが分かれる場面を選んでください
- 形式と大きさ。png / jpg / webp、1 枚 3MB まで、横 600 × 縦 315 以上、4096 × 4096 まで。 画像は再エンコードせずそのまま配信するので、撮ったままの画質で出ます
カバーを登録しないと、SNS に貼ったときは既定の絵になります。作品を特定できる 画像にしておくほうが、クリックされる率は上がります。
説明文の書き方
説明文は、遊ぶ人が読むだけのものではありません。検索エンジンと AI 検索が この作品を何だと理解するかも、ここで決まります。あらすじから始めず、何をする遊びかを最初の 1 文に置いてください。
書くのが苦手なら、運営が代わりに作成します(無料)。投稿のときは短い紹介をひとまず入れておき、問い合わせ窓口から「説明文の作成希望」とご連絡ください。作品を見て、キャッチコピーと 説明文の案をお送りします。書くことより、作品を仕上げることに時間を 使ってください。
| キャッチコピー | 8〜80 字。一覧と検索結果に出ます。「感動の物語」ではなく 「町を歩いて聞き込み、3 日以内に犯人を当てる推理ゲーム」のように、 この作品にしか当てはまらない 1 文にしてください。 |
|---|
| 説明文 | 40〜4000 字。遊び方、操作方法、1 回あたりのプレイ時間、動作を確かめた環境。 この 4 つが入っていれば、遊ぶ人が知りたいことはだいたい埋まります。 |
|---|
| ジャンルとタグ | ジャンルは 1 つ、タグは 10 個まで。タグは検索の入口になるので、 作品を説明する語を選んでください。数を埋めるための語は入れないほうが 結果的に見つけてもらえます。 |
|---|
ネタバレは畳んで書けないので、書かないほうが無難です。終盤の展開を説明文に 書くと、一覧のカードにもそのまま出ます。
使った素材のクレジットは、説明文の末尾か同梱の readme に書いてください。 素材の規約で表記が求められている場合は、書かないと規約違反になります。
検査について
投稿された zip は、公開前に必ずウイルス検査を通ります。展開してファイルを 1 つずつ調べるため、ファイル数が多いほど時間がかかります。検査中は ページを開いたままにしてください。
検査に落ちた場合は理由が表示されます。実行ファイルを含む作品では、 検出のしくみ上、問題がないものが引っかかることもあります。心当たりが ない結果が出たときは問い合わせ窓口から連絡してください。
検査で何を見ているかの詳細
詰まりやすい点
- 「index.html が zip 直下にありません」と言われた
- 書き出したフォルダを右クリックしてそのまま圧縮すると、zip の中がフォルダ 1 つになり、index.html が 1 段深くなります。フォルダを開いて、中のファイルをすべて選んでから圧縮してください。
- 検査にどのくらいかかりますか
- 中身の量によりますが、数十MB の作品でおおむね数分です。zip を展開して、含まれるファイルを 1 つずつ調べるため、ファイル数が多いほど時間がかかります。使っていない素材を外しておくと短くなります。
- 画像が受け付けられない
- 横 600 × 縦 315 より小さい画像は受け付けていません。SNS でカードとして出るときに引き伸ばされてしまうためです。形式は png / jpg / webp のみ、1 枚 3MB までです。
- 「位置情報が含まれています」と出た
- スマートフォンで撮った写真には撮影場所が埋め込まれていることがあります。投稿を止めはしませんが、そのまま公開すると誰でも読める状態になります。画像編集ソフトで書き出し直すと消えます。
- 説明文がうまく書けない
- 運営が代わりに作成します(無料)。投稿のときは短い紹介(40 字以上)をひとまず入れておき、問い合わせ窓口から「説明文の作成希望」とご連絡ください。作品を見て、キャッチコピーと説明文の案をお送りします。
- 公開したあとに直せますか
- 直せます。同じアカウントで同じ URL の作品として投稿し直すと、説明文もビルドも差し替わります。URL 自体を変えると別の作品になるため、古いほうは取り下げてください。
- ブラウザで遊べる形にできないツールを使っている
- ダウンロード配布で問題ありません。Windows 向けの実行ファイルは、遊ぶ人の環境で警告が出ることがありますが、その説明は作品ページに自動で表示されます。投稿者側で用意するものはありません。
ゲームを投稿する