LoginSignup
0
0

Go言語で昔懐かしのPongを作ってみた話 - ゴール判定と得点表示の追加

Posted at

前回の記事では、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ゲームにゴール判定と得点表示が追加されました。
これらの機能を活用して、友人と一緒に楽しくプレイすることができます。

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