WGGの活動log

都内でゲーム開発だったりVRだったりをしてるかもしれないエンジニアです. WGGは「ワグ」と読みます

Visual Studio Code で DxLibの開発をする

最近Unityで複数のゲームを開発してVSCodeがちょっと好きになりました.

今までよく使っていたVisual Studio + DxLib の開発環境ですが,Visual Studio が非常に重いので,VSCode で完結できないか試してみました.

できたもの

こんな感じに,VSCodeからコンパイルして,動作確認するまでできました
デバッグに関してはまだ試していないですが...

手順

大体↓の順序です

  1. VSCodeのインストール
    1. C++用の拡張機能を追加する
  2. Visual Studio のインストール
  3. batファイル, makeファイルの記述
    1. (必要なら)文字コード問題の解消
  4. プログラムを書く
  5. VSCodeからコンパイルする

1:VSCodeのインストール

↓ からダウンロードできます.
code.visualstudio.com

C++用の拡張機能を追加する

ここVSCodeの仕様がいまいちわかっていなくて合ってるのかわからないのですが, "C/C++" ってのと,"C++ Intellisense"ってのを入れました.
f:id:wgg00sh:20170920225000p:plain

Visual Studio のインストール

やり方は複数あると思いますが,今回は既に入ってたVS2015 を利用します
この辺を参考にして,とりあえずVSでDxLibの開発ができるようにします.

batファイル, makeファイルの記述

VSCodeからコンパイルするためのbatファイルおよび,makefileを作成します.

dxlibmake.bat
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"
nmake -f dxlib.mak


VsDevCmd.batはVisualStudioに付属している開発者用のコマンドプロンプトです
自分の場合パスは上記の通りでしたが,バージョンやインストールの方法によって変わるかもしれません.

dxlib.mak

こちらを参考にしました

TARGETDIR=src
TARGETNAME=*

C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT  /I "C:\DxLib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 /source-charset:utf-8

LINK_FLAGS=/SUBSYSTEM:WINDOWS /LIBPATH:"C:\DxLib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"

ALL:
  cl $(C_FLAGS) $(TARGETDIR)/$(TARGETNAME).cpp
  link /out:dxlib.exe $(LINK_FLAGS) $(TARGETNAME).obj
  dxlib.exe

実行ディレクトリ内の,srcディレクトリ直下に置いた.cppファイル全てをコンパイル対象とします.
ファイルの構成次第で自由に変えるべきかと思います.

"C:\DxLib" には,ここでいう「プロジェクトに追加すべきファイル_VC用」パスを渡しています.日本語パスが心配だったのでDxLibとリネームしました.

(必要なら)文字コード問題の解消

DxLibでプログラムを書く場合,DxLib.hを含めて基本的に全てShift-JISで書かれるのですが,UTF-8の方が良い場合には,4行目の /source-charset:utf-8 を記述する必要があります.
これをつけずにUTF-8ソースコードを書くと,コメントなどに日本語が含まれている場合に正常にコンパイルできない可能性があります.
また,UTF-8で指定する場合は,DxLibのヘッダファイル5つを全てUTF-8に直しておかないと,同様に大量の警告が表示されます.

プログラムを書く

とりあえずDxLibのHPに載っているサンプルコードを,見やすいように少しだけ書き換えたものを使います.

#include "./DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);

	if( DxLib_Init() == -1 )
	{
		return -1 ;	
	}
	
	// DrawPixel( 320 , 240 , GetColor( 255,255,255 ) ) ;	// 見辛い
	DrawCircle(320,240,0xffffff,TRUE);

	WaitKey() ;	

	DxLib_End() ;

	return 0 ;
}

VSCodeからコンパイルする

VSCodeから,プロジェクトとするフォルダを開きます.
Ctrl+Shift+Bでタスクを実行できるのですが,プロジェクト内の.vscodeディレクトリにタスクが登録されていないので,「タスクランナーの構成」→「Others」の順にクリックします
task.jsonが作成されるので,commandの内容を,先ほど作成したdxlibmake.batに変更します

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "0.1.0",
  "command": "dxlibmakebat",
  "isShellCommand": true,
  "args": ["Hello World"],
  "showOutput": "always"
}

これでプロジェクトフォルダ内のdxlibmake.batが実行され,makefileが処理されます.
f:id:wgg00sh:20170920234617p:plain

あとは設定が正しければ正常にコンパイルされ,DxLibのウィンドウが開きます

完成

というわけで,VSCodeからDxLibのコンパイルをしてみました.
もしDxLibを使っていて,Visual Studioが重いと感じてらっしゃる方がいましたら,是非参考にしてみてください

弾雨ヲ切リ裂ク STG「アカとブルー」が楽しい

ゲーム系の話題は久しぶりかな?
最近サークルだったり研究室だったり,ゲーム会社のエンジニアインターンに複数社参加したりである意味充実した夏休みを過ごしています.


今回は,「アカとブルー」というゲームを遊んでみたのでその感想です

アカブルー

最近Twitterを見ていると,フォローしているゲームエンジニアの方がこのゲームについて頻繁に呟いていらっしゃったので,気になっていました
STGは(主に東方Projectのおかげで)とても好きなタイプのゲームなので,PVを見て「これは間違いなく面白い」と思ったので即遊んでみました

PV

公式のPVです
youtu.be
twitter.com

ゲーム概要

割と昔からある感じの弾幕STGです
暑苦しいおっさんのアカと,クールな女の子のブルーのW主人公からどちらかを選んでプレイします
僕は当然可愛い女の子のブルーを広射弾を撃てるおっさんの方が使いやすかったのでアカばかり使ってました
大量の弾を避けて敵を倒していきます

プレイ画面

遊びながらスクショ取るの難しいのですが,何枚か撮ってみました
f:id:wgg00sh:20170824224926p:plain
f:id:wgg00sh:20170824224951p:plain

見ただけで伝わりそうなのですが,難しいです
ドットスナイパーで世界ランキング1位を獲った僕の動体視力()をもってしても避け切るのは困難でした

弾雨ヲ切ク裂ク

何回かプレイして,「あ~これ気合じゃ勝てないやつだな...」ってのを理解したので,クリアするために何をすればいいか考えてみました.
すると気づいたのが,ボムを撃つとボムが溜まる事でした.書いててよくわからなくなりますが,その通りです.敵を倒したりすると,エネルギーが溜まってボムが撃てるようになります.ボムを発動すると,周辺や前方の弾を消すことができ,消した弾の分で再びエネルギーが溜まります.なのでまたボムが撃てます.そして,Lv2以上のボムを使用すると,前方に飛ばし,軌道上の弾を纏めて消すことができ,まさにこのゲームのキャッチコピーの弾雨ヲ切リ裂クようになります.

↓公式PV内でボムを使っているシーン(静止画じゃ伝わりにくいかも,1:46付近)
f:id:wgg00sh:20170824233008p:plain

多分これは狙って組まれたゲームバランスだと思います.肉眼で避けるのが難しい量の弾幕が降り注ぐ中,ボムで弾幕を切り裂いて活路を開く.
「ボムゲー」とか言われてしまうかもしれないですが,ボムのエフェクトや,キャラクターのボイスと相まってとても爽快でプレイしてて楽しかったです.

ちょこっと攻略アドバイス的な

多分エンディングを見るのは結構難しい部類のゲームだと思うので,自分がプレイしててこんな感じにすればクリアしやすいと思った点を

  • ボムのLvが上がる前に撃つ
  • 弾雨を「切り裂く」ことを意識する
  • 諦めない
ボムのLvが上がる前に撃つ

ボムは,チャージ量によってLvが1-5まで存在しますが,最もおすすめするのはLv2です.
というのも,このゲームのボムは撃っても自機が無敵になるとかは無く,あくまで敵の弾を消す効果だけなんですよね.Lvが高いボムは,消せる弾の量は多いですが,その分次にボムが撃てるまでのクールタイムも長くなります.そのため,Lv5のボムを撃って弾を消したのに,すぐにやってきた次の弾幕を消す手段が無く被弾する,といったことが発生しやすかったです.

そこでボムのLvが上がりきらないうちにこまめに撃つことで,クールタイム中の被弾を減らすことができました.

弾雨を「切り裂く」ことを意識する

上述の通り,あくまでボムは弾を消すのがメインの効果なので,より多く前方の弾を消す(切リ裂ク)ことを重視すると生存率が上がりそうです.
横から攻撃してくるボスもいるので,そこは結構苦戦しました...

諦めない

どんなゲームでも一緒ですが,当然ですね.
ただこのゲームに関しては,当たり判定が見た目以上に小さいので,残機0ボム0の大ピンチになっても,諦めずに気合避けし続ければ立て直せることも結構多いです.

おわりに

スマホゲームの中でも,かなり良くできてる作品だと思いますので,この記事や,PVを見て面白そうと思ってくだされば,是非遊んでみてください!(\960)

(...こんなゲーム作れるように頑張ろっと)

ウィンドウを透過するショートカットキーを作成した

普段作業をしていると,「文章を書きながら動画も見たい」なんて思うことがありました.
かといってウィンドウを分割するとそれぞれの面積が小さくなり文章は書きづらくなります.

そこで,ウィンドウを半透明にできれば1つの領域に2つのウィンドウを置くことができます.

今回作ったもの

www.youtube.com

使ったアプリケーション

www.gigafree.net

TranspWnds

TranspWndsはウィンドウ拡張ツールです.
キー+マウスで以下のような機能を利用することができます.

  • タイトルバー以外をドラッグしてもウィンドウを移動できる
  • ウィンドウの端以外をドラッグしても拡大縮小できる
  • タイトルバーを非表示にする
  • ウィンドウを最前面に固定する
  • ウィンドウの透過率を指定する

今回は,透過率指定の機能を利用します.

TranspWnds単体使用の問題点

TransWndsだけを用いると,ウィンドウの透過はALT/CTRL/SHIFT/Win キー + マウスホイールの回転でしか実行できません
僕のようにマウスを使わないユーザーにとっては非常に使いづらいので,これをキーボードだけで実行できるようにするのが,AutoHotKeyです

AutoHotKey

AutoHotkeyはホットキーへの機能の割り当てなど常駐ソフトの作成に特化したスクリプトエンジン。多彩なコマンドが用意されており、GUIを持ったプログラムの作成も可能。
任意のキーの割り当て変更、マクロ、ウインドウ操作 ...
オープンソースの簡易プログラム言語、Windowsフリーソフト
(AutoHotkey Wiki)

つまりは,スクリプトを書いて実行するだけで,入力内容を変更する常駐ソフトを作成することができます!

スクリプト作成例

今回は,AutoHotKeyとTranspWndsを組み合わせて,「Win+Tでウィンドウを半透明に,Win+Shift+Tで半透明にしたウィンドウを元に戻す」ように実装してみます.
まず,TranspWndsのオプションで「Transparent」の項目をALTだけチェックを入れておきます
次に,適当なファイルを作成し,拡張子を.ahkにして以下を記述します.

;;; Win + T → Windowを半透明に
#t::
  Send,{Alt Down}
  Send,{WheelDown 30}
  Send,{Alt Up}
  return

;;; Win + Shift + T → Windowの半透明化を元に戻す
#+t::
  Send,{Alt Down}
  Send,{WheelUp 30}
  Send,{Alt Up}
  return 


これに対してRun Script を実行することで,Win+Tキーでアクティブウィンドウを半透明にすることができます.
透明度はTranspWndsで上限を設定しておいてください

ahkスクリプトの説明

#+t::

#:Windowsキー

  1. :Shiftキー

t:tキー
の3つを同時に押したときに処理を実行します

Send,{Alt Down}
Send,{WheelUp 30}
Send,{Alt Up}

Send,{Alt Down}で Altキーを押した状態に変更,
Send,{WheelUp 30}で マウスホイールを上に30ミリ秒間回転
Send,{Alt Up}でAltキーを離します

まとめ

こんな感じで,AutoHotKeyを使うと,Windows標準ではできないショートカットの作成など,色んな機能を追加できます.
スクリプトの規則もそこまで複雑ではないのでぜひ試してみてくださいね♪

Bash on Ubuntu on Windows でデスクトップ環境(Xfce)を動かしてみた

あまり実用的ではなかったですが,Bash on Ubuntu on Windows(BoW)にデスクトップ環境を導入することができるらしく,実際に試してみました.

この記事は,一応既にBoW を利用している人向けに書いています
BoWの導入方法などは,ここ(宣伝)ここを読むと良いと思います

wgg.hatenablog.jp
qiita.com

今回作ったもの

youtu.be


導入の流れ

  1. WindowsX Window Server をインストール & 色々設定
  2. BoWにデスクトップ環境(今回はXfce4)をインストー
  3. Xfce4を動かしてみる

1.WindowsX Window Server をインストール & 色々設定

前のBoWの記事と同様に,Xmingをインストールします
VcXsrvとかでも多分大丈夫です

Xmingの設定

  1. 起動オプションの設定
  2. XmingのWindowをアクティブにすると勝手に英字入力になる問題
1.起動オプションの設定

今回は以下のように設定しています
起動オプションの詳細はここを見てください

"C:\hogehoge\Xming.exe" :1 -clipboard -xkbmodel jp106 -xkblayout jp -dpi 100 -nodecoration

大雑把に言うと,日本語キーボードで,クリップボードWindowsと共有して,dpiが100で,フルスクリーンで,スクリーン番号が1です.
スクリーン番号はXmingを複数起動する場合,他とかぶっていなければ多分何でも大丈夫です.

-nodecoration

ですが,-multiwindowではデスクトップが表示されなかったりしたので,おそらくこれか, -fullscreenあたりが良いと思います.

2.XmingのWindowをアクティブにすると勝手に英字入力になる問題

Windowsのキーボード設定で,英字(US)キーボードをONにしていると,Xmingで表示したWindowをクリックした瞬間にUS配列に変わってしまうことがあります.
どうもXmingが特定のタイミングでUSキーボードに強制変更するようにプログラムされているみたいなので,調べたところ,実行ファイルのバイナリを書き換えることで対処できました

StirlingXming.exeを編集

Stirlingじゃなく,バイナリエディタなら多分なんでも大丈夫ですが

以下のように編集します
f:id:wgg00sh:20170602113024p:plain
編集前


f:id:wgg00sh:20170602113038p:plain
編集後

これで,今まで勝手にUSキーボードに変わっていたタイミングで,勝手にJPキーボードに変わるようになります

2.BoWにデスクトップ環境(今回はXfce4)をインストー

  1. Xfce4のインストー
  2. 起動用のbatファイルの作成
1.Xfce4のインストー

まずはXfce4をインストールします

$ sudo apt-get install xfce4-session
2.起動用のbatファイルの作成

従来のbash.exeと使い分けられるように,起動するとXfce4が開くbatをWindowsで書きます

@echo off
start /min "" "Xming.lnk"
"C:\hogehoge\bash.exe" -c 'export DISPLAY=localhost:1.0;export XMODIFIERS="@im=uim";export GTK_IM_MODULE=uim;export QT_IM_MODULE=uim; xfce4-session'
taskkill /f /im Xming.exe
export DISPLAY=localhost:1.0;

出力先のディスプレイ番号の設定です
Xmingの起動オプションで設定した :1 の部分(今回は1)と同じ数値を入れます

XMODIFIERS="@im=uim";
export GTK_IM_MODULE=uim;
export QT_IM_MODULE=uim;

開いたデスクトップ環境で日本語入力を行うための設定です
詳しくはこちらを見てください

taskkill /f /im Xming.exe

xfceが終了した直後に実行され,Xmingを終了します

Xfce4を動かしてみる

最後に,実際にインストールしたxfce4を起動してみましょう

先に作成したbatファイルを開くとbashからxfce4が起動し,Windowsから切り替わります.
ログアウトすると,bash,Xmingともに自動的に終了します
Windowsの仮想デスクトップ機能を用いれば,Windowsのデスクトップと,BoWのデスクトップを併用することもできます.

f:id:wgg00sh:20170602150200p:plain
Bash on Windows から起動したデスクトップ環境です

まとめ

正直今まで通り -multiwindow で必要な場合だけGUI表示するだけでいいような気がします...
普段と違う雰囲気で利用できますが,便利かといわれると微妙...
あと時々挙動が不安定になるかもしれません

Ubuntuでよく見かける Unityも導入できるらしいですが,容量が大きくて試すのが面倒だったのでやってません.