我是靠谱客的博主 欢喜嚓茶,最近开发中收集的这篇文章主要介绍Golang游戏 图像旋转模拟运动 (ebiten),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

运动效果
在这里插入图片描述
首先为Ebiten GeoM结构体(github.comhajimehoshiebitenv2@v2.0.7geom.go)添加了一个可以旋转旋转中心的方法

//(x,y)为旋转中心坐标 
// theta 为旋转角度,弧度制
func (g *GeoM) RotateByPoint(x, y, theta float64) {
	if theta == 0 {
		return
	}
	sin, cos := math.Sincos(theta)
	_tx, _ty := g.tx-x, g.ty-y

	a := cos*(g.a_1+1) - sin*g.c
	b := cos*g.b - sin*(g.d_1+1)
	tx := cos*_tx - sin*_ty
	c := sin*(g.a_1+1) + cos*g.c
	d := sin*g.b + cos*(g.d_1+1)
	ty := sin*_tx + cos*_ty

	g.a_1 = a - 1
	g.b = b
	g.c = c
	g.d_1 = d - 1
	g.tx = tx + x
	g.ty = ty + y
}

创建Hamster结构体

package component

import (
	"github.com/hajimehoshi/ebiten/v2"
	"github.com/hajimehoshi/ebiten/v2/ebitenutil"
	_ "image/png"
	"math"
	"time"
)

type Hamster struct {
	Image *ebiten.Image
	Opts  *ebiten.DrawImageOptions
	x     float64
	y     float64
	w     float64
	h     float64
}

func NewHamster(x, y float64) *Hamster {
	image, _, err := ebitenutil.NewImageFromFile("example2/static/image/go.png")
	if err != nil {
		panic(err)
	}
	opts := &ebiten.DrawImageOptions{}
	opts.GeoM.Translate(x, y)
	w, h := image.Size()
	return &Hamster{
		Image: image,
		Opts:  opts,
		x:     x,
		y:     y,
		w:     float64(w),
		h:     float64(h),
	}
}
// Walk方法以下边线中点为旋转中心,循环左右旋转
// 在main中开启协程执行
func (h *Hamster) Walk() {
	for {
		x, y := h.x+h.w/2, h.y+h.h
		h.Opts.GeoM.RotateByPoint(x, y, math.Pi/24)
		time.Sleep(200 * time.Millisecond)
		h.Opts.GeoM.RotateByPoint(x, y, -math.Pi/24)
		time.Sleep(200 * time.Millisecond)
		h.Opts.GeoM.RotateByPoint(x, y, -math.Pi/24)
		time.Sleep(200 * time.Millisecond)
		h.Opts.GeoM.RotateByPoint(x, y, math.Pi/24)
		time.Sleep(200 * time.Millisecond)
	}
}

main.go

package main

import (
	"github.com/hajimehoshi/ebiten/v2"
	"github.com/vua/vGame/example2/component"
	"image/color"
	"log"
)

type Game struct {
	bgc color.Color
	w   int
	h   int
	hamster *component.Hamster
}

func (g *Game) Update() error {
	// Write your game's logical update.
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	screen.Fill(g.bgc)
	screen.DrawImage(g.hamster.Image, g.hamster.Opts)
}

func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
	return g.w, g.h
}

func (g *Game) walk(){
	g.hamster.Walk()
}

func main() {
	game := &Game{
		bgc: color.RGBA{0xff, 0xff, 0xff, 0xff},
		w:   320,
		h:   240,
		hamster: component.NewHamster(149,120),
	}
	go game.walk()

	ebiten.SetWindowSize(640, 480)
	ebiten.SetWindowTitle("vGame")

	if err := ebiten.RunGame(game); err != nil {
		log.Fatal(err)
	}
}

最后

以上就是欢喜嚓茶为你收集整理的Golang游戏 图像旋转模拟运动 (ebiten)的全部内容,希望文章能够帮你解决Golang游戏 图像旋转模拟运动 (ebiten)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部