Liberent-Dev’s blog

株式会社リベル・エンタテインメントのテックブログです。

ebitengineでゲームを作る3

こんにちは!
システム開発部のK.Mです。

今回も前回・前々回からの続きとなりますが、ebitengineを使用して作ったシューティングゲームのようなものを更に改良していきます。
前回の修正にて、ゲームとしての体裁が整ったので、もう少しクオリティを上げるための対応を下記の目次通りで対応していきます。

  • 敵のガクガク移動の修正
  • 自機や敵がやられた時の爆発エフェクト付ける
  • 音を鳴らす
  • スコアを画像化
  • おまけ
  • まとめ
続きを読む

ebitengineでゲームを作る2

こんにちは!
システム開発部のK.Mです。

今回も前回からの続きとなりますが、ebitengineを使用して作ったシューティングゲームのようなものを改良していきます。
前回作ったものから、下記の内容で修正を行なっていきます。

  • 自機や敵、弾を構造体で管理する
  • 敵を複数体表示させる
  • 自機及び敵にて弾を連射できるようにする
  • 自機と敵が画面外に行かないようにする
    • 自機の修正
    • 敵の修正
  • 敵を倒した後に再登場させる&得点つける&自機の弾を消失させる
    • 得点計算
    • 敵を倒した場合に自機の弾を消す
    • 敵の復活
    • 不具合の件
  • おまけ
  • まとめ
続きを読む

ebitengineでゲームを作る

こんにちは!
システム開発部のK.Mです。

今回は前回からの続きで、ebitengineを使って簡単なシューティングゲームのようなものを作っていきます。

用意するもの

シューティングゲームなので自機・敵・弾などの各種画像が必要となります。
今回はいらすとやさんから調達させていただきました。

  • 自機の画像

  • 自機の弾の画像

  • 敵の画像

  • 敵の弾の画像

自機の表示と操作

画像ファイルのロード

ebitengineで画像表示するために用意されているAPIは、go標準の画像データを渡す形になっています。
そのため、goの処理にてファイルオープンを行いデコードした情報を渡す必要があります。

今回はpngファイルを使用しているため、下記の例はpngの画像ファイルをオープンする場合となります。

var drawImage *ebiten.Image
// ファイルオープン
file, _ := os.Open("pngファイルのパス")
defer file.Close()
// デコード
img, err := png.Decode(file)
if err != nil {
    panic(err)    
}
drawImage = ebiten.NewImmageFromImage(img)
続きを読む

ebitengineを触ってみる


こんにちは!
システム開発部のK.Mです。

はじめに

最近やっと落ち着いてきましたが、UnityのUnity Runtime Feeの件でこのままUnityを使い続けて大丈夫なのかという感じになった開発会社さんは多いかと思います。
一応、紆余曲折あり無難なところに落ち着いた感じはしますが、またUnity側でどういった変更が行われるか分からないのもあり、他のゲームエンジンに移行しようかと検討している方も居るかと思われます。

代替えとして、UnrealEngine(以降、UE)・GodotEngine・GameMaker・Cocosなどあったりしますが、今回個人的な理由でGo言語で作られた2D用ゲームエンジンebitengineを使って簡単なゲームを作るために諸々確認をしていきます。

ただし、このebitengine、UnityやUEのような専用のエディターは存在しないので、昔ながらのDirectXAPIを叩いて使う形になるので、その点注意が必要です。

インストール

今回はMacOS(M1Mac)の環境で、ebitengineをインストール・実行していきます。
ほぼebitengineのインストールページに沿った内容で確認可能ですが、少し補足を載せておきます。

続きを読む

DFrameを試してみる2

こんにちわ。 システム開発部のK.Mです。

今回は前回触ったDFrameに関してもう少し深掘りして行きます。
深掘りの前に、前回の実装で良くない実装をしていた部分を修正していきます。

HttpClientは使い回す実装にしよう

前回の記事APIにアクセスする処理を入れていきます。」で説明している箇所にて、指定された回数分ExecuteAsync()のみが動くものかと考えており、HttpClientをSetupAsync()内でnewをして、TeardownAsync()でDisposeしていました。

しかし、今回の調査時に判明したのですが、テスト実施の1セット内でSetupAsync()->ExecuteAsync()->TeardownAsync()という流れになっており、次の2セット目に入った場合に、再度SetupAsync()->ExecuteAsync()->TeardownAsync()を同じように実行する形になっていたため、HttpClientを毎回newしてDisposeする形になっていました。

HttpClientは本来再利用することを推奨されているのですが出来ていなかったので、まずはこちらを修正していきます。

修正内容としては、Workloadのコンストラクタでnewして、デストラクタで一応Disposeするようにしたうえで、SetupAsync()のnew関連の処理と、TeardownAsync()のDispose処理を削除しておきます。

続きを読む