在Ebiten中,界面响应主要用到Update函数。

drawChess

打开game.go,增加如下代码:

//drawChess 绘制棋子
func (g *Game) drawChess(x, y int, screen, img *ebiten.Image) {
	if img == nil {
		return
	}
	op := &ebiten.DrawImageOptions{}
	op.GeoM.Translate(float64(x), float64(y))
	screen.DrawImage(img, op)
}

screen就是Update函数中的screen变量。

img就是对应棋子保存在images中的图片资源。

drawBoard

//drawBoard 绘制棋盘
func (g *Game) drawBoard(screen *ebiten.Image) {
	//棋盘
	if v, ok := g.images[ImgChessBoard]; ok {
		op := &ebiten.DrawImageOptions{}
		op.GeoM.Translate(0, 0)
		screen.DrawImage(v, op)
	}

	//棋子
	for x := Left; x <= Right; x++ {
		for y := Top; y <= Bottom; y++ {
			xPos, yPos := 0, 0
			if g.bFlipped {
				xPos = BoardEdge + (xFlip(x)-Left)*SquareSize
				yPos = BoardEdge + (yFlip(y)-Top)*SquareSize
			} else {
				xPos = BoardEdge + (x-Left)*SquareSize
				yPos = BoardEdge + (y-Top)*SquareSize
			}
			sq := squareXY(x, y)
			pc := g.singlePosition.ucpcSquares[sq]
			if pc != 0 {
				g.drawChess(xPos, yPos+5, screen, g.images[pc])
			}
			if sq == g.sqSelected || sq == src(g.mvLast) || sq == dst(g.mvLast) {
				g.drawChess(xPos, yPos, screen, g.images[ImgSelect])
			}
		}
	}
}

screen就是Update函数中的screen变量。

bFlipped翻转棋盘是预留的一个功能,可以让玩家变换执子方。

sqSelected和mvLast可以标记棋子走向。

clickSquare

//clickSquare 点击格子处理
func (g *Game) clickSquare(screen *ebiten.Image, sq int) {
	pc := 0
	if g.bFlipped {
		pc = g.singlePosition.ucpcSquares[squareFlip(sq)]
	} else {
		pc = g.singlePosition.ucpcSquares[sq]
	}

	if (pc & sideTag(g.singlePosition.sdPlayer)) != 0 {
		//如果点击自己的棋子,那么直接选中
		g.sqSelected = sq
		g.playAudio(MusicSelect)
	} else if g.sqSelected != 0 {
		//如果点击的不是自己的棋子,但有棋子选中了(一定是自己的棋子),那么走这个棋子
		mv := move(g.sqSelected, sq)
		g.singlePosition.makeMove(mv)
		g.sqSelected = 0
		if pc == 0 {
			g.playAudio(MusicPut)
		} else {
			g.playAudio(MusicEat)
		}
	}
	// 如果根本就不符合走法(例如马不走日字),那么不做什么处理
}

screen就是Update函数中的screen变量。

Update

func (g *Game) Update(screen *ebiten.Image) error {
	if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) {
		x, y := ebiten.CursorPosition()
		x = Left + (x-BoardEdge)/SquareSize
		y = Top + (y-BoardEdge)/SquareSize
		g.clickSquare(screen, squareXY(x, y))
	}

	g.drawBoard(screen)
	return nil
}

IsMouseButtonJustPressed检测对应的按钮有没有触发。

MouseButtonLeft表示鼠标左键,象棋游戏只需要用到鼠标左键。

CursorPosition获取当前鼠标的屏幕坐标,通过屏幕坐标可以计算出所在的格子坐标。

运行程序之后,在界面上就可以选择棋子,移动棋子,而且还会有音效播放。

如果小伙伴们想学习更多这方面的内容,可以访问http://www.xqbase.com/computer/stepbystep1.htm

在下一节中,我们将学习如何让程序懂得象棋的基本规则?

0

本文为原创文章,转载请注明出处,欢迎访问作者网站(和而不同)

发表评论

error: Content is protected !!