前回の記事では、Go言語とEbitenを使ってシンプルなPongゲームの作成について記載しました。
今回はそのコードにゴール判定と得点表示を追加したので記載します。
使用するバージョン
- Go言語: 1.16
- Ebiten: v2
変更したコードの解説
以下に、変更を加えたコードを示します。各部分の詳細は後ほど説明します。
Game構造体の定義
Game構造体にプレイヤーのスコアを保持する新しいフィールドを追加しました。
type Game struct {
ballPositionX, ballPositionY float64 // ボールの位置
ballDX, ballDY float64 // ボールの移動速度
paddle1Y, paddle2Y float64 // パドルの位置
player1Score, player2Score int // プレイヤーのスコア
}
Updateメソッド
ゴール判定を追加し、ボールが左右の壁に当たったときにスコアを更新します。また、ゴール後はボールの位置を初期化してゲームを再開します。
func (g *Game) Update() error {
g.ballPositionX += g.ballDX // ボールのx座標を更新
g.ballPositionY += g.ballDY // ボールのy座標を更新
if g.ballPositionX < 0 { // ボールが左の壁に当たった時
g.ballDX = -g.ballDX // ボールの向きを反転
g.ballPositionX = 0 // ボールのx座標を0に設定
g.player2Score++ // プレイヤー2のスコアを加算
// ボールを中央に戻す
g.ballPositionX = screenWidth / 2
g.ballPositionY = screenHeight / 2
} else if g.ballPositionX > screenWidth-ballSize { // ボールが右の壁に当たった時
g.ballDX = -g.ballDX // ボールの向きを反転
g.ballPositionX = screenWidth - ballSize // ボールのx座標を右端に設定
g.player1Score++ // プレイヤー1のスコアを加算
// ボールを中央に戻す
g.ballPositionX = screenWidth / 2
g.ballPositionY = screenHeight / 2
}
// 以下、前回のコードと同じ
// 省略
}
Drawメソッド
プレイヤーのスコアを画面に表示します。
func (g *Game) Draw(screen *ebiten.Image) {
// パドルとボールの描画
ebitenutil.DrawRect(screen, 10, g.paddle1Y, paddleWidth, paddleHeight, color.White)
ebitenutil.DrawRect(screen, screenWidth-30, g.paddle2Y, paddleWidth, paddleHeight, color.White)
ebitenutil.DrawRect(screen, g.ballPositionX, g.ballPositionY, ballSize, ballSize, color.White)
// スコアの描画
score := fmt.Sprintf("Player 1: %d - Player 2: %d", g.player1Score, g.player2Score)
text.Draw(screen, score, basicfont.Face7x13, screenWidth/2-50, 30, color.White)
}
これで、Pongゲームにゴール判定と得点表示が追加されました。
これらの機能を活用して、友人と一緒に楽しくプレイすることができます。