vsmiswについて

こんにちは。NYLONです。ゲーム作るの楽しいのでみんなもPICO8始めよう。

 

 

1.PICO8とは

PICO8とはゲームエンジンです。ゲームエンジンとはゲームを作るにあたり必要な処理(ウィンドウを出す、画像を出す、音を鳴らすなど)を簡単に出来るようにまとめてくれたものです。画像を出すのにいちいち長いコードを書かなくていいので便利です。

PICO8は主にLuaという言語で書きます。Luaの難しいことを知らなくても書けるのでちょっと読めれば問題ないです。早速今回のゲーム(https://nylon1919.github.io/vsmisw/)について解説していきます。

 

2.1タブ目

f:id:himawarifurutani1919:20200316160153p:plain

1タブ目

コード全体はこんな感じ

function _init()
  game=0
  select=0
  col={}
  scores={}
  t=0
  for i=1,10 do
    scores[i]=0
  end
end
 
function _update()
  if game==0 then
    update_menu()
  elseif game==1 then
    update_game()
  else
    if btnp(4) or btnp(5) then
      game=0
      sfx(62)
    end
  end
end
 
function _draw()
  cls()
  if game==0 then
    draw_menu()
  elseif game==1 then
    cls(2)
    draw_game()
  elseif game==2 then
    draw_howto()
  elseif game==3 then
    drawscore(64,17,5)
    drawscore(64,16,7)
  end
end
 
PICO8では三つの特別な関数が存在します。
1. _init()
2. _update()
3. _draw()
_initはプログラムを起動したときに読み込まれる関数。_updateは1/30秒に一回ごとに呼び出される関数。_drawは_updateが終わるたびに呼び出される関数です。
自分はゲームの状態を表す変数gameで管理していてgame=0のときメニュー画面、game=1のときゲーム画面を、game=2のとき遊び方を、game=3のときスコア画面を表示してます。他にいい管理方法があれば教えてください。
update_~とかdraw_~は自作した関数で2タブ目以降に書かれています。selectはメニュー画面のカーソル位置を表していてscoresは要素数10のテーブルです。テーブルとはCにおける配列と構造体を合わせた機能みたいな感じでここでは配列として使ってます。最初のトップ10のスコアが全部0であるように初期値で設定してます。colも配列のように使ってますがこれはメニュー画面での文字色で深い意味はありません。
clsはclear of screenの略で画面を一色で塗りつぶす関数です。
 
3.2タブ目
”--”で”コメントアウトできます。1行目のコメントアウトはエディタ内でタブにカーソルを合わせると表示してくれるので便利です。
--menu

function update_menu()
  if btnp(2) then
    select-=1
    sfx(63)
  end
  if btnp(3) then
    select+=1
    sfx(63)
  end
  if select==3 then
    select=0
  end
  if select==-1 then
    select=2
  end
  for i=0,2 do
    col[i]=7
  end
  col[select]=8
  if btnp(5) then
    sfx(62)
    if select==0 then
      game_init()
    end
    game=select+1
  end
  t+=1
end
 
function draw_menu()
  for i=0,15 do
    for j=0,15 do
      spr(9,i*8,j*8)
    end
  end
  spr(224,8,32,14,2)
  spr(192,8+cos(t/4),32+sin(t/4),14,2)
  printcs("game start",64,0,col[0])
  printcs("how to play",72,0,col[1])
  printcs("high score",80,0,col[2])
  printcs("press ❎",96,1,7)
  printcs("thanks for mis.w",108,1)
  printcs("presented by wce",116,1)
end
 
function printcs(a,y,c,s)
  if s==nil then
    s=0
  end
  local x=64-2*#a
  for i=0,3 do
    print(a,x+cos(i/4),y+sin(i/4),s)
  end
  print(a,x,y,c)
end
 
function newscore(score)
  if scores[10]scores[10-i] then
      scores[11-i],scores[10-i]=scores[10-i],scores[11-i]
    end
  end
end
 
function drawscore(x,y,c)
  for i=1,10 do
    local l=s_length(scores[i])
    print(scores[i],x-l*2,y+i*8,c)
  end
end
 
function draw_howto()
  local x=4 y=4
  palt(0,false)
  palt(15,true)
  for i=0,4 do
    rectfill(x-1,y-1+i*24,x+8,y+8+i*24,6)
    spr(25+i,x,y+24*i)
  end
  palt(15,false)
  palt(0,true)
  for i=0,2 do
    spr(48,x+12,y+i*24,3,1)
    spr(55,x+36,y+i*24)
    spr(37,x+12,y+10+i*24,3,1)
    spr(55,x+36,y+10+i*24,5,1)
  end
  spr(37,x+44,y,7,1)
  spr(37,x+44,y+24,3,1)
  spr(47,x+68,y+24)
  spr(37,x+44,y+48,3,1)
  spr(44,x+68,y+48,3,1)
  spr(68,x+12,y+72,7,1)
  spr(68,x+12,y+82,7,1)
  spr(50,x+12,y+96,3,1)
  spr(100,x+12,y+106,12,1)
end
2タブ目はメニュー画面についてです。関数btnpは引数のボタンについて前フレームは押されていないが今のフレームで押されているときにtrueを返します。(押しっぱなしになってから15フレームが経過すると4フレームごとにtrueを返す機能があるのでメニュー画面にめちゃ便利です。)対応しているボタンは以下の通り(引数:ボタン)
0:左
1:右
2:上
3:下
4:z,〇
5:x,×
なのでメニュー画面では上ボタンが押されるとselect値が下がり、下ボタンが押されるとselect値が上がりますが直後の処理で0~2をはみ出したら戻す処理をしています。選択ボタンが押されているときsfx関数(PICO8独自)によって対応する効果音を鳴らしています。
さっきのタブにあったcolはここで使われていて一回全部白(PICO8では色の識別番号として白には7が割り振られている)にしたあと選択されているものだけ赤(8)にしています。この辺は自分のメニューの挙動を押しまくったりして確認した方が早いと思います。
そして選択されたあとx,×ボタン(5)によってgame変数をselectの値に応じて変えています。またselectが0のときのみゲームが始まるのでgame_init関数を呼んでます。t(時間値)を更新している(t+=1:tを1フレームごとに1ずつ増やしている)のはタイトルを揺らす為です。
その下にメニュー画面を描画する関数draw_menu()があります。早速Luaのfor文が書いてありますがその中のspr関数とはPICO8独自の関数で図を描画してくれます。詳細は以下の通りです。
spr(s,x,y,w,h,flip_x,flip_y)
s:スプライト(図)番号
x:表示したい位置のx座標(0(左)~127(右))
y:表示したい位置のy座標(0(上)~127(下))
w:幅(nilのとき1)
h:高さ(nilのとき1)
flip_x:trueで画像を左右反転させる(nilのときfalse)
flip_y:trueで画像を上下反転させる(nilのときfalse)
今回作成したスプライトについてはこのようになってます。

f:id:himawarifurutani1919:20200316164420p:plain

スプライト全体

左上が0で右に進んでいきます。9番のスプライトは1番上の左から10個目のMIS.W様のロゴマーク(のつもりで描いたやつ)です。二重forループによって縦横満遍なく敷き詰められているのがわかります。いいですね。

その下は”みすさいこう”の黄色、その下が”みすさいこう”の水色の表示です。水色は三角関数を使いグルグル回してます。回し放題なので回す周期を変えたりしてゲラゲラ笑って見てました。ちなみにPICO8の仕様かLuaの仕様かは知りませんがこの三角関数は特殊で1周期は1(≠2π)であり、描画上の見やすさからsinの値が正負反転しています。(ゲーム画面上y軸は下向きを正と取る為)なので難しいことを考えなくても三角関数は反時計回りです。

その下に並んでいるprintcsは文字列を真ん中(center)に影付き(shadow)で表示できる関数です。前になんかのPICO8記事で見たのを参考にしてます。引数はprintcs(string,y,c,s)で文字列、書きたいy座標、文字色、影色(nilなら黒(0))です。#stringで文字列の長さを取得できるので真ん中(=64)から文字の横幅が4であることに注意してずらしています。PICO8内の通常のprint関数は文字列と位置(x,y)と色で描けるので先に影でぐるっと文字を書いてから、その上に文字を書いてます。

その下はスコア更新用の関数で新しいスコアを引数にscores[10]から比べさせて大きければ上に進む方式を取ってます。このときに前はswap関数を作っていたのですがLuaだとx,y=y,xでxとyの入れ替えができるみたいです。便利ですね。

スコアの表示画面はめんどくてシンプルに書いてますが何桁の数だろうと中央に配置したかったのでs_length関数を作りました。これは数値の桁数を取得する関数ですがPICO8で扱える数値の最大値は確か32768(=215)しかないので5桁まで地道に数えさせました。かっこいい方法を知っている人は教えてください。

遊び方のところはめんどいので省略。paltという関数はPICO8独自のもので非表示色の切り替えができます。通常は0(黒)がtrueにされていて黒は切り抜かれていますがここで自由に肌色を切り抜いたり黄緑を切り抜いたりしてます。フォントはニンテンドーDSのフォントを参考に作りました。7×7に収まるので偉いです。

 

4.3タブ目

このタブはゲーム画面についてです。

--game

function game_init()
  t=0
  score=0
  pl_init()
  enemy={}
  gim={}
  hole={}
  music(0)
end
 
function update_game()
  if pl.life>0 then
    update_pl()
    foreach(enemy,update_enemy)
    foreach(gim,update_gim)
    foreach(hole,update_hole)
    t+=1
    if t%10==1 then
      score+=1
    end
    if t%30==0 then
      add_enemy()
    end
    if t%10==0 then
      if rnd(3)<1 then
        if rnd(2)<1 then
          add_gim()
        else
          add_hole()
        end
      end
    end
  else
    if btnp(4) then
      game=0
    elseif btnp(5) then
      game_init()
    end
  end
end
 
function draw_game()
  rectfill(0,112,127,127,14)
  palt(0,false)
  palt(11,true)
  spr(64,0-t%8/4,48,4,8)
  palt(11,false)
  palt(15,true)
  foreach(hole,draw_hole)
  foreach(enemy,draw_88)
  foreach(gim,draw_88)
  palt(15,false)
  palt(0,true)
  draw_pl()
  rectfill(0,0,127,12,0)
  print("highscore",2,1,7)
  print(scores[1],20-2*s_length(scores[1]),7,7)
  if pl.life==0 then
    rectfill(0,48,127,80,0)
    spr(48,2,60,3,1)
    spr(53,26,60,2,1)
    draw_score(score)
    spr(48,80,60)
    spr(32,88,60,5,1)
    printcs("restart ❎/back to menu 🅾️",72,1)
  else
    print("score",64-10,1,7)
    print(score,64-s_length(score)*2,7,7)
  end
  for i=1,pl.life do
    spr(10,91+i*9,4)
  end
end
 
function s_length(s)
  local l=0
  if s<10 then
    l=1
  elseif s<100 then
    l=2
  elseif s<1000 then
    l=3
  elseif s<10000 then
    l=4
  else
    l=5
  end
  return l
end
 
function draw_score(s)
  for i=1,s_length(s) do
    spr(84+s%10,78-6*i,60)
    s=flr(s/10)
  end
end
 
function dist(a,b)
  return sqrt((a.x-b.x)^2+(a.y-b.y)^2)
end
game_initでは時間を初期化し(みすさいこうをグルグル回すのに更新していたため)プレイヤーの初期化、敵とギミック(しょうがいぶつ)、穴のテーブルを用意しBGMを鳴らしています。
ゲーム中は各種更新処理をしていますがforeach関数(foreach(テーブル,作用させたい関数))を用いて簡単に書けてます。便利ですね。
10フレームに一回スコアを増やし、30フレームに一回敵を追加し、10フレームに一回1/3の確率でしょうがいぶつか穴を半々の確率で出しています。あとから付け足した感のある書き方で可愛いですね。
これらの処理はプレイヤーの体力値が正であるというif文の中にある為もちろんゲームオーバーになればゲームオーバー画面が出ます。ゲームオーバー中はbtnpによってリスタートかメニューに戻ることが出来ます。(開発当初はメニューに戻れる機能を付けてなくて上述のスコア表示機能は死んでました。アホですね。)
また何回かメニュー画面でゲームBGMが流れる現象を観測しそれが同時押しによるものだと突き止めたのでelseで完全に分断しました。同時押しはメニューに戻るほうが優先されます。
ゲームの描画についてはrectfill関数でピンクの床を作ったあとミスちゃんをでっかく配置し(適当に振動させられている)、foreachで各種ものを描いたり、プレイヤーを表示したりしています。
ゲームオーバーのときに出てくる数字はスプライトで描いてるためそれ用の関数draw_scoreを作りました。似たような名前の関数をごちゃごちゃ作るのでマナーが悪いです。(実はメニューの処理とかは自分の中ではプリセットとして作っていて昔の自分の関数の命名法が多く今適当に関数名をつけても競合しないことが多いです)
最後にゲーム内の当たり判定に用いる距離関数を実装しています。テーブルが引数にされること前提で引数を抑え見やすくしています。(以前はdist(x1,y1,x2,y2)みたいな書き方でした)これはユークリッドノルムなので丸い円が書けますがマンハッタンノルム(return abs(a.x-b.x)+abs(a.y-b.y))やreturn max(abs(a.x-b.x),abs(a.y-b.y))などで四角い円を描くこともできます。
(3/18追記)
Luaでも再帰が使えそうだったのでs_lengthを以下のように書き換えました。
function s_length(s)
  if s<10 then
    return 1
  else
    return s_length(s/10)+1
  end
end
 10より小さいと一桁でそれ以外は10で割った桁より1大きいで答えさせてます。whileを使っても書けそうですがこっちの方が好きなのでこっちにしました。綺麗ですね。
 
5.4タブ目
このタブはプレイヤーについての処理です。
--player

function pl_init()
  pl={}
  pl.x=64
  pl.y=104
  pl.vx=0
  pl.vy=0
  pl.jump=false プレイヤーのジャンプ判定
  pl.jcf=0  プレイヤーのジャンプチェックフレーム
  pl.mt=0  プレイヤーのアニメーション状態
  pl.s=0  プレイヤーのスプライト
  pl.life=3  プレイヤーの残機
  pl.df=0  プレイヤーのダメージ判定
  pl.drop=false  プレイヤーの穴への落下判定
end
 
function update_pl()
  if pl.drop then
    pl_drop()
  else
    pl_movex()
    if not pl.jump then
      pl_jump()
    else
      pl_movey()
    end
    pl_mot()
  end
  pl_flag()
end
 
function pl_jump() プレイヤーのジャンプ処理
  if btn(4) or btn(2) then
    pl.jcf+=1
  elseif pl.jcf>0 then
    pl.jump=true
    pl.vy=-6
    pl.jcf=0
    sfx(63)
  end
  if pl.jcf==3 then
    pl.jump=true
    pl.vy=-8
    pl.jcf=0
    sfx(63)
  end
end
 
function pl_movex() プレイヤーの左右移動
  if btn(0) then
    if pl.vx>-4 then
      if pl.jump then
        pl.vx-=0.5
      else
        pl.vx-=1
      end
    end
  end
  if btn(1) then
    if pl.vx<4 then
      if pl.jump then
        pl.vx+=0.5
      else
        pl.vx+=1
      end
    end
  end
  if not btn(0) and not btn(1) then
    if pl.vx>2 then
      pl.vx-=1
    elseif pl.vx<-2 then
      pl.vx+=1
    else
      pl.vx=0
    end
  end  
  if abs(pl.x+pl.vx-64)<64 then
    pl.x+=pl.vx
  end
  if pl.x<16 then
    if pl.vx==0 then
      pl.x=16
    else
      pl.x-=pl.vx
    end
    if pl.df==0 then
      pl_damage()
    end
  end
end
 
function pl_movey() プレイヤーの上下移動
  pl.y+=pl.vy
  pl.vy+=1
  if pl.y>104 then
    pl.y=104
    pl.jump=false
    pl.vy=0
  end
end
 
function pl_mot() プレイヤーのアニメーション管理
  if pl.jump then
    pl.s=0
  else
    if pl.vx>0 then
      pl.mt=2
    elseif pl.vx==0 then
      pl.mt=4
    else
      pl.mt=6
    end
    pl.s=flr((t%(4*pl.mt))/pl.mt)
  end
end
 
function pl_damage() プレイヤーのダメージ処理
  pl.df+=1
  pl.life-=1
  sfx(62)
  if pl.life==0 then
    newscore(score)
    pl.df=0
    music(2)
  end
end
 
function pl_flag() プレイヤーのフラグ管理(?)
  if pl.df>0 then
    pl.df+=1
  end
  if pl.df==30 then
    pl.df=0
  end
end
 
function pl_drop() プレイヤーの落下処理
  if pl.vy<0 then
    pl.drop=false
  else
    pl.x-=3
    pl.s=0
    pl.y+=pl.vy
    pl.vy+=1
    if pl.vy<3 then
      pl_jump()
      if btn(4) or btn(2) then
        pl.drop=false
      end
    end
  end
  if pl.y>135 then
    pl.life=0
    newscore(score)
    music(2)
  end
end
 
function draw_pl() プレイヤーの描画
  if pl.df%2==0 then
    spr(2*pl.s,pl.x-8,pl.y-4,2,2)
    spr(8,pl.x-pl.s%2,pl.y-8-pl.s%2)
  end
end
ここはゲームのメインとも言えるプレイヤーの処理です。各処理ごとに関数を分けているので読みやすいっちゃ読みやすいし関数をまたぐ判定や順序関係もあるのでバグが見つかりにくいとも言えます。
まず穴への落下判定が起きてるか起きてないかで分けます。起きてない場合から進めます。
まずプレイヤーのx座標を更新します。これは速度を加算する方式をとりボタンによって直接座標を更新する処理を避けてます。この方が操作性にクセが出て面白いです。このとき自分のゲームでは採用しがちですが左右どちらも押されてない場合のみ減速します。これによって左右同時押しによる微妙な速度での等速移動など地味なテクニックが生まれます。この点も前述の面白さの一つです。
座標更新する前に画面外に出てしまう可能性がある場合は移動させません。これは絶対値を使って書いてます。またミスちゃんとの当たり判定はただ単にx座標が小さいときに起きていてプレイヤーの速度を用いて押し返しています。後述のしょうがいぶつに速度を追加させる能力を与えず座標の直接更新をさせてしまったので速度0でミスちゃんにめりこむ可能性を考慮し最悪の場合は直接座標を外に押し返しています。ミスちゃんと接触時ダメージフレームが0ならダメージを食らいます。
ダメージ処理は簡単にダメージフレームを1にしてライフを一つ減らし効果音を鳴らしライフがゼロになったらスコア更新とゲームオーバー音も鳴らさせています。ゲームオーバー画面にプレイヤーを見せたかったのでダメージフレームを0にしています。(詳しくは後述)
その後ジャンプ中ならy座標の更新処理をそうでないならジャンプ入力受付をしています。ジャンプ入力受付はボタンが押されているとjcf(=jump check frame)が加算され2フレーム以内で離されると小ジャンプ、それ以外は大ジャンプになります。この仕様はスマブラを参考にしました。この違いは初速度でしか実現してませんが実際これだけでいろいろ変わります。プレイヤーがジャンプすると効果音が鳴りjcfが0に戻されジャンプ判定がtrueになります。
ジャンプ中はy座標が更新されy方向の速度が毎フレーム下向きに+1されます。y座標が一定値を超えると着地した扱いになりジャンプ判定をfalseにしてy座標を元に戻します。
移動以外だとアニメーションとフラグ管理をしていて地味に右に動くと速く走り、左に動くと遅くなる様子がここで実装されています。またジャンプ中はアニメーションを固定しているのもここです。フラグ管理は今回はダメージ処理だけですがゲームによってはファイアレートや回避などもここで管理することが多いです。シンプルに~fのつく変数が正のときは毎フレーム1ずつ加算させて希望するフレームになったときに0に戻す作業をしていることが多いです。
最後に落下判定ですが落下判定がtrueのときはx座標を3ずつ流すことで他のものが4で流れていくことからゆっくり落ちてるように見せてます。この仕様のせいで落下判定が甘いときゆっくりバックジャンプしながら操作を受け付けずに落ちていく現象を観測したので上向きに速度があるときは落ちてない判定にすることにしました。落下判定が出てる時も下向きの速度が一定値になるまではジャンプを許す仕様にしたのでなんとなく甘いです。この仕様はクラッシュバンディクーを参考にしました。ただしジャンプの落下地点に穴があるとこの仕様により回避できません。
プレイヤーの描画はダメージ判定が出ていると点滅しますがpl.dfをうまく使って表現しています。さっきのゲームオーバーのときにプレイヤーが見えなくなるのもこれが原因で修正しました。また顔の位置はアニメーションに合わせて揺らしてます。
 
6.5タブ目
これはプレイヤー以外のものについての処理用のタブです。
--enemy
 
function add_enemy() 敵の追加
  local e={}
  e.x=rnd(96)+24 ランダムにプレイヤーのいそうなところに発生
  e.y=-8 上の方
  e.n=flr(rnd(3)) 0で音符、1で鉛筆、2でコード
  e.s=e.n+25 スプライト番号
  e.v=(e.n+1)*2 落下速度
  add(enemy,e)
end
 
function add_gim() しょうがいぶつの追加
  local g={}
  g.x=135 右の方
  g.y=112 床上
  g.s=28 スプライト番号
  add(gim,g)
end
 
function add_hole() 穴の追加
  local h={}
  h.x=135 穴の中央
  add(hole,h)
end
 
function update_enemy(e) 敵の更新
  e.y+=e.v 落下処理
  if dist(e,pl)<12 then プレイヤーとの当たり判定
    if pl.df==0 then
      pl_damage() プレイヤーのダメージ処理
    end
  end
  if e.y>135 then
    del(enemy,e) 画面外から出たら消去
  end
end
 
function update_gim(g) しょうがいぶつの更新
  g.x-=4 左へ流す
  if dist(g,pl)<12 then プレイヤーとの当たり判定
    if pl.x>g.x then プレイヤーの座標の直接更新
      pl.x+=1
    elseif pl.x-4>8 then
      pl.x-=4
    end
  end
  if g.x<-4 then
    del(gim,g) 画面外から出たら消去
  end
end
 
function update_hole(h) 穴の更新
  h.x-=4 左へ流す
  if abs(pl.x-h.x)<8 and pl.y==104 then プレイヤーは接地しているときに穴に近いと落下する
    pl.drop=true 落下判定をtrueに
  end
  if h.x<-4 then
    del(hole,h) 画面外から出たら消去
  end
end
 
function draw_88(a) スプライトの描画
  spr(a.s,a.x-4,a.y-4) 左上が基準点なので中央にするためのずらし
end
 
function draw_hole(h) 穴の描画
  rectfill(h.x-8,112,h.x+7,127,2) 単に塗りつぶしている。
end
上の方はゲーム内で呼び出されていたものを追加する関数です。だいたい書き方は一緒でもの自体もテーブルにすることが多いので注意してください。ものたちの箱もテーブルでもの自体もテーブルです。テーブルの要素は直接宣言すれば追加できますが(a.x=64など)、add関数を用いると勝手に追加してくれます。(add(enemy,e)でenemy[1]をeにしている)またdel関数も便利でdel(enemy,e)でenemyからeを消してくれます。この辺はLuaの仕様ですがゲームを作るのにも便利でいいですね。
当たり判定の実装はシンプルに距離関数を使ってます。前述の通りPICO8で使える数値には限りがあるので注意が必要です。画面外に出たものを即座に消しているのもこの為です。なぜかご丁寧にsqrt(-4)=-2と返してくるので32768を超えると出てくる負の値はルートをとっても負なので当たり判定の式を満たしてしまいます。dist(pl,e)>=0 and dist(pl,e)<12などがより丁寧です。このせいでPICO8初心者時代は見えない銃弾で敵が死にまくってました。
 
7.export
こうしてコードを書いてPICO8ではゲームを作れますが実際プロジェクトファイルから実行ファイルにエクスポートしないとみんなに遊んでもらえません。PICO8ではいくつかの形式でファイルを書き出せますがスマホ対応を勝手にしてくれるhtml&jsが最強です。htmlで書き出したらgit hubに適当にリポジトリを作りファイルを置いてgit hub pagesに対応させます。これだけ聞くと一瞬で公開できる感じがするし実際そうなんですけど自分がgitを使うの下手すぎてよくわかんないエラーとか404が出たりとか発狂しそうなときもあります。何回も消したりファイルをアップロードしたりブランチ消したりまた再生させたりリポジトリ作り直したりしている内に公開できますが誰か詳しい人がいたら助けてください。
 
8.総括
今回作ったゲームについては色々とMIS.W様のご厚意で前向きに取られているようですが今後とも宜しくお願いします。僕自体はMIS.WもWCEもいいサークルだと思っていてせっかく二つ選択肢があるので大人数が合わないなーって思ったらWCEに来ればいいと思うし、刺激が足りないなーって思ったらMIS.Wに行くといいと思います。そういう選択肢があるのに利用しない手は無いのでどちらかのサークルに居場所が無くても、もう片方に移ったり個人で活動を始めたり創作活動をする環境としてより自分に合ったものを選べばいいと思います。なのでぜひどちらのサークルにも見学しに行ってください。
 
WCEについてのQ&A
Q1.何してるの?
→A.ゲーム作ってるよ
Q2.MIS.Wとの違いは?
→A.人が少なくて弱いよ(これは長所です)
 Q3.イベントとかある?
→A.理工展(早稲田理工の学祭)やM3(同人音楽の即売会)とかに出展してるよ
Q4.年会費、入会金は?
→A.毎年年度初めや入会したときに2000円もらってるよ
Q5.制作ソフトに指定は?
→A.ないよ。サークル員同士で同じの使ったほうが便利だから被ることが多いけど
Q6.初心者でも大丈夫?
→A.いいぜ、歓迎、誰でもゲーム作れるようにしてやるからな
Q7.エロいいね研究会との関係は?
→A.我々はそのような団体、組織とは一切の関係は御座いません。
 
9.参考