0
0

More than 1 year has passed since last update.

Ebitenを使ってボールをランダムに動かすゲームを作成する

Last updated at Posted at 2023-08-01

EbitenというGo言語で開発された2Dゲームエンジンを使って、ボールがランダムに動き回るシンプルなゲームを作成する方法を記載します。

package main

import (
	"image/color" // 色を操作するためのパッケージ
	"log"         // ログ出力を扱うためのパッケージ
	"math/rand"   // 乱数を生成するためのパッケージ
	"time"        // 時間に関する操作を扱うためのパッケージ

	"github.com/hajimehoshi/ebiten/v2"            // Ebitenのゲームエンジンのパッケージ
	"github.com/hajimehoshi/ebiten/v2/ebitenutil" // Ebitenのユーティリティパッケージ
)

次に、ゲーム画面のサイズとボールの大きさを定数で定義します。

// 画面のサイズとボールの大きさを定義
const (
	screenWidth  = 640
	screenHeight = 480
	ballSize     = 10
)

そして、ゲームの状態を表す構造体を定義します。ここではボールの位置(x, y)と速度(vx, vy)を保持します。

// Game はゲームの状態を表します。ボールの位置と速度を保持します。
type Game struct {
	x, y   float64
	vx, vy float64
}

次に、新しいゲーム状態を作成する関数を定義します。ボールの初速度はランダムに設定されます。

// NewGame は新しいゲーム状態を作成します。ボールの初期速度はランダムです。
func NewGame() *Game {
	rand.Seed(time.Now().UnixNano())                 // 乱数のシードを現在の時間(ナノ秒)に設定
	vx, vy := rand.Float64()*4-2, rand.Float64()*4-2 // ランダムな速度を生成
	return &Game{vx: vx, vy: vy}                     // 新しいゲーム状態を返す
}

ゲームのロジックを更新する関数を定義します。ボールの位置を更新し、壁への衝突を検出します。壁と衝突した際には、ボールの速度をランダムに変更します。

// Update はゲームのロジックを更新します。ボールの位置を更新し、壁への衝突を検出します。
// 壁と衝突した際には、ボールの速度をランダムに変更します。
func (g *Game) Update() error {
	g.x += g.vx // X軸方向に速度分動かします。
	g.y += g.vy // Y軸方向に速度分動かします。

	// ボールが壁に衝突したら、反射させるだけでなくランダムな方向に速度を変更
	if g.x <= 0 || g.x+ballSize >= screenWidth {
		g.vx = rand.Float64()*4 - 2 // X軸の速度をランダムに設定
	}
	if g.y <= 0 || g.y+ballSize >= screenHeight {
		g.vy = rand.Float64()*4 - 2 // Y軸の速度をランダムに設定
	}

	return nil // エラーはないのでnilを返す
}

そして、ゲームの状態を描画する関数を定義します。背景を黒で塗りつぶし、ボールを白で描画します。

// Draw はゲームの状態を描画します。背景を黒で塗りつぶし、ボールを白で描画します。
func (g *Game) Draw(screen *ebiten.Image) {
	screen.Fill(color.RGBA{0, 0, 0, 255}) // 画面を黒で塗りつぶします。

	// 矩形(ボール)を描画します。
	ebitenutil.DrawRect(screen, g.x, g.y, ballSize, ballSize, color.RGBA{255, 255, 255, 255})
}

次に、画面の解像度を制御する関数を定義します。ここでは固定の画面解像度を返しています。

// Layout は画面の解像度を制御します。ここでは固定の画面解像度を返しています。
func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
	return screenWidth, screenHeight // 定義した画面解像度を返す
}

最後に、ゲームの開始地点となるmain関数を定義します。ウィンドウサイズとタイトルを設定し、ゲームを開始します。

// main関数はゲームの開始地点です。ウィンドウサイズとタイトルを設定し、ゲームを開始します。
func main() {
	ebiten.SetWindowSize(screenWidth, screenHeight) // ウィンドウのサイズを設定
	ebiten.SetWindowTitle("ボールランダム移動")              // ウィンドウのタイトルを設定

	if err := ebiten.RunGame(NewGame()); err != nil {
		log.Fatal(err) // ゲームの実行中にエラーが発生した場合、ログを出力してプログラムを終了
	}
}

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0