func animateDeadGopher(a *f32.Affine, t clock.Time) { dt := float32(t) a.Scale(a, 1+dt/20, 1+dt/20) a.Translate(a, 0.5, 0.5) a.Rotate(a, dt/math.Pi/-8) a.Translate(a, -0.5, -0.5) }
func (a *arrangerFunc) Arrange(e s.Engine, n *s.Node, t clock.Time) { sprite, _ := a.eng.sprites[n] frameTime := float32(t - a.eng.lastUpdate) updatePosition(sprite, frameTime) screenWidthScaler, screenHeightScaler := a.eng.GetScreenScalers() actualScaleX := screenWidthScaler * sprite.ScaleX actualScaleY := screenHeightScaler * sprite.ScaleY actualPositionX := screenWidthScaler * sprite.X actualPositionY := screenHeightScaler * sprite.Y e.SetSubTex(n, *sprite.GetCurrentFrame().Texture) r := sprite.Rotation * math.Pi / 180 matrix := f32.Affine{ {1, 0, 0}, {0, 1, 0}, } matrix.Translate(&matrix, actualPositionX, actualPositionY) //matrix.Translate(&matrix, sprite.X, sprite.Y) matrix.Rotate(&matrix, r) matrix.Scale(&matrix, actualScaleX, actualScaleY) e.SetTransform(n, matrix) a.eng.lastUpdate = t }
func TestAffine(t *testing.T) { f, err := os.Open("../../../testdata/testpattern.png") if err != nil { t.Fatal(err) } defer f.Close() srcOrig, _, err := image.Decode(f) if err != nil { t.Fatal(err) } src := image.NewRGBA(srcOrig.Bounds()) draw.Draw(src, src.Rect, srcOrig, srcOrig.Bounds().Min, draw.Src) const ( pixW = 100 pixH = 100 ptW = geom.Pt(50) ptH = geom.Pt(50) ) cfg := event.Config{ Width: ptW, Height: ptH, PixelsPerPt: float32(pixW) / float32(ptW), } got := image.NewRGBA(image.Rect(0, 0, pixW, pixH)) blue := image.NewUniform(color.RGBA{B: 0xff, A: 0xff}) draw.Draw(got, got.Bounds(), blue, image.Point{}, draw.Src) b := src.Bounds() b.Min.X += 10 b.Max.Y /= 2 var a f32.Affine a.Identity() a.Scale(&a, cfg.PixelsPerPt, cfg.PixelsPerPt) a.Translate(&a, 0, 24) a.Rotate(&a, float32(math.Asin(12./20))) // See commentary in the render method defined in portable.go. a.Scale(&a, 40/float32(b.Dx()), 20/float32(b.Dy())) a.Inverse(&a) affine(got, src, b, nil, &a, draw.Over) ptTopLeft := geom.Point{0, 24} ptBottomRight := geom.Point{12 + 32, 16} drawCross(got, 0, 0) drawCross(got, int(ptTopLeft.X.Px(cfg.PixelsPerPt)), int(ptTopLeft.Y.Px(cfg.PixelsPerPt))) drawCross(got, int(ptBottomRight.X.Px(cfg.PixelsPerPt)), int(ptBottomRight.Y.Px(cfg.PixelsPerPt))) drawCross(got, pixW-1, pixH-1) const wantPath = "../../../testdata/testpattern-window.png" f, err = os.Open(wantPath) if err != nil { t.Fatal(err) } defer f.Close() wantSrc, _, err := image.Decode(f) if err != nil { t.Fatal(err) } want, ok := wantSrc.(*image.RGBA) if !ok { b := wantSrc.Bounds() want = image.NewRGBA(b) draw.Draw(want, b, wantSrc, b.Min, draw.Src) } if !imageEq(got, want) { gotPath, err := writeTempPNG("testpattern-window-got", got) if err != nil { t.Fatal(err) } t.Errorf("got\n%s\nwant\n%s", gotPath, wantPath) } }