概述
运动效果
首先为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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复