ebiten实现小方块移动(暑假游戏开发)

ebiten小方块移动


视频演示


构思

  • 1.定义一个方块的结构体
  • 2.绘制一个方块
  • 3.写出方块移动的逻辑代码

1.定义一个方块的结构体

  • 一个方块具有起点(x,y)和宽度,高度,因为需要移动所以少不了移动速度
type Block struct{
    
    
    x float64  //方块绘制横坐标起点
    y float64  //方块绘制纵坐标起点
    width float64 //方块的宽度
    height float64 //方块的高度
    speed float64 //方块的行走速度
}
//将方块结构体假如Game结构体当中,方便调用
type Game struct{
    
    
    block *Block
}

2.绘制一个方块

  • 利用ebitenuitl的内置函数绘制方块
//绘制方块函数
func (block *Block)BlockDraw(screen *ebiten.Image){
    
    
    //调用ebitenutil中的DrawRect函数
    //color.NRGBA{R:0,G:255,B:0,A:255}表示颜色
    ebitenutil.DrawRect(screen,block.x,block.y,block.width,block.height,color.NRGBA{
    
    R:0,G:255,B:0,A:255})
}

3.方块移动逻辑代码

  • 实现上下左右移动,在按下方向键的时候,通过修改block的坐标实现方块移动
func (block *Block)BlockUpdate(){
    
    
    //逻辑实现实现上下左右,斜角
    //一定要分开写,可以直接实现斜方向
    //按键检测(该控制的是键盘上的箭头键)
    if ebiten.IsKeyPressed(ebiten.KeyLeft) {
    
    
        block.x-=block.speed
    } else if ebiten.IsKeyPressed(ebiten.KeyRight) {
    
    
        block.x+=block.speed
    } else {
    
    
        block.x+=0
    }
    if ebiten.IsKeyPressed(ebiten.KeyUp) {
    
    
        //由于屏幕左边左上角是(0,0)
        //所以往上走应该是减少的
        block.y-=block.speed
    } else if ebiten.IsKeyPressed(ebiten.KeyDown) {
    
    
        block.y+=block.speed
    } else {
    
    
        block.x+=0
    }
}

初始化数据(在Game结构体中的数据在调用前需要被初始化)

  • 对定义的数据进行初始化
func NewGame()*Game{
    
    
    return &Game{
    
    
        &Block{
    
    100, 100, 5, 5, 1},    
    }
}

完整代码

type Block struct {
    
    
	x      float64 //方块绘制横坐标起点
	y      float64 //方块绘制纵坐标起点
	width  float64 //方块的宽度
	height float64 //方块的高度
	speed  float64 //方块的行走速度
}

// Game 将方块结构体假如Game结构体当中,方便调用
type Game struct {
    
    
	block *Block
}

// BlockDraw 绘制方块函数
func (block *Block) BlockDraw(screen *ebiten.Image) {
    
    
	//调用ebitenutil中的DrawRect函数
	//color.NRGBA{R:0,G:255,B:0,A:255}表示颜色
	ebitenutil.DrawRect(screen, block.x, block.y, block.width, block.height, color.NRGBA{
    
    R: 0, G: 255, B: 0, A: 255})
}
func (block *Block) BlockUpdate() {
    
    
	//逻辑实现实现上下左右,斜角
	//一定要分开写,可以直接实现斜方向
	//按键检测(该控制的是键盘上的箭头键)
	if ebiten.IsKeyPressed(ebiten.KeyLeft) {
    
    
		block.x -= block.speed
	} else if ebiten.IsKeyPressed(ebiten.KeyRight) {
    
    
		block.x += block.speed
	} else {
    
    
		block.x += 0
	}
	if ebiten.IsKeyPressed(ebiten.KeyUp) {
    
    
		block.y -= block.speed
	} else if ebiten.IsKeyPressed(ebiten.KeyDown) {
    
    
		block.y += block.speed
	} else {
    
    
		block.x += 0
	}
}

func (g *Game) Update() error {
    
    
	g.block.BlockUpdate()
	return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
    
    
	g.block.BlockDraw(screen)
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
    
    
	//如果和设置窗口的数据一致,则不缩放
	//如果各个数据比设置窗口时小,则游戏内容放大
	//如果各个数据比设置窗口时大,则游戏内容缩小
	//一般设置为窗口数据的一半
	return 480, 320
}

func NewGame() *Game {
    
    
	return &Game{
    
    
		&Block{
    
    100, 100, 5, 5, 1},
	}
}
func main() {
    
    
	ebiten.SetWindowTitle("边界限制")  //窗口标题
	ebiten.SetWindowSize(960, 640) //窗口大小
	game := NewGame()
	if err := ebiten.RunGame(game); err != nil {
    
    
		log.Fatal("启动失败:", err)
	}
}

猜你喜欢

转载自blog.csdn.net/JUIU9527/article/details/131262967
今日推荐