用Go写一个中国象棋(五)| Ebiten界面响应
在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
感谢分享