mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
parent
7d9bc8586e
commit
020cba22c5
@ -19,7 +19,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten"
|
"github.com/hajimehoshi/ebiten"
|
||||||
"github.com/hajimehoshi/ebiten/vector"
|
"github.com/hajimehoshi/ebiten/vector"
|
||||||
@ -84,79 +83,28 @@ func drawEbitenText(screen *ebiten.Image) {
|
|||||||
path.Draw(screen, op)
|
path.Draw(screen, op)
|
||||||
}
|
}
|
||||||
|
|
||||||
type roundingPoint struct {
|
func drawLines(screen *ebiten.Image) {
|
||||||
cx float32
|
|
||||||
cy float32
|
|
||||||
r float32
|
|
||||||
degree int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *roundingPoint) Update() {
|
|
||||||
r.degree++
|
|
||||||
r.degree %= 360
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *roundingPoint) Position() (float32, float32) {
|
|
||||||
s, c := math.Sincos(float64(r.degree) / 360 * 2 * math.Pi)
|
|
||||||
return r.cx + r.r*float32(c), r.cy + r.r*float32(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func drawLinesByRoundingPoints(screen *ebiten.Image, points []*roundingPoint) {
|
|
||||||
if len(points) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var path vector.Path
|
var path vector.Path
|
||||||
|
path.MoveTo(20, 80+float32(counter%320)/4)
|
||||||
path.MoveTo(points[0].Position())
|
path.LineTo(60, 120)
|
||||||
for i := 1; i < len(points); i++ {
|
path.LineTo(20, 160-float32(counter%320)/4)
|
||||||
path.LineTo(points[i].Position())
|
|
||||||
}
|
|
||||||
|
|
||||||
op := &vector.DrawPathOptions{}
|
op := &vector.DrawPathOptions{}
|
||||||
op.LineWidth = 4
|
op.LineWidth = 16
|
||||||
op.StrokeColor = color.White
|
op.StrokeColor = color.White
|
||||||
path.Draw(screen, op)
|
path.Draw(screen, op)
|
||||||
}
|
}
|
||||||
|
|
||||||
var points = []*roundingPoint{
|
var counter = 0
|
||||||
{
|
|
||||||
cx: 100,
|
|
||||||
cy: 120,
|
|
||||||
r: 10,
|
|
||||||
degree: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cx: 120,
|
|
||||||
cy: 120,
|
|
||||||
r: 10,
|
|
||||||
degree: 90,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cx: 100,
|
|
||||||
cy: 140,
|
|
||||||
r: 10,
|
|
||||||
degree: 180,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
cx: 120,
|
|
||||||
cy: 140,
|
|
||||||
r: 10,
|
|
||||||
degree: 270,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func update(screen *ebiten.Image) error {
|
func update(screen *ebiten.Image) error {
|
||||||
for _, p := range points {
|
counter++
|
||||||
p.Update()
|
|
||||||
}
|
|
||||||
|
|
||||||
if ebiten.IsDrawingSkipped() {
|
if ebiten.IsDrawingSkipped() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
drawEbitenText(screen)
|
drawEbitenText(screen)
|
||||||
drawLinesByRoundingPoints(screen, points)
|
drawLines(screen)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +63,8 @@ func (p *Path) LineTo(x, y float32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *Path) strokeVertices(lineWidth float32, clr color.Color) (vertices []ebiten.Vertex, indices []uint16) {
|
func (p *Path) strokeVertices(lineWidth float32, clr color.Color) (vertices []ebiten.Vertex, indices []uint16) {
|
||||||
|
const miterLimit = 10
|
||||||
|
|
||||||
if len(p.segs) == 0 {
|
if len(p.segs) == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
@ -103,11 +105,69 @@ func (p *Path) strokeVertices(lineWidth float32, clr color.Color) (vertices []eb
|
|||||||
|
|
||||||
v2 := s0.P1
|
v2 := s0.P1
|
||||||
v3 := s1.P1
|
v3 := s1.P1
|
||||||
|
cut := false
|
||||||
if i != len(ss)-1 {
|
if i != len(ss)-1 {
|
||||||
ns := ss[i+1]
|
ns := ss[i+1]
|
||||||
v2 = ns.Translate(-lineWidth / 2).IntersectionAsLines(s0)
|
nv2 := ns.Translate(-lineWidth / 2).IntersectionAsLines(s0)
|
||||||
v3 = ns.Translate(lineWidth / 2).IntersectionAsLines(s1)
|
nv3 := ns.Translate(lineWidth / 2).IntersectionAsLines(s1)
|
||||||
|
l := lineWidth / 2 * miterLimit
|
||||||
|
if (nv2.X-nv3.X)*(nv2.X-nv3.X)+(nv2.Y-nv3.Y)*(nv2.Y-nv3.Y) < l*l {
|
||||||
|
v2 = nv2
|
||||||
|
v3 = nv3
|
||||||
|
} else {
|
||||||
|
cut = true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cut {
|
||||||
|
ns := ss[i+1]
|
||||||
|
s2 := ns.Translate(-lineWidth / 2)
|
||||||
|
s3 := ns.Translate(lineWidth / 2)
|
||||||
|
vertices = append(vertices,
|
||||||
|
ebiten.Vertex{
|
||||||
|
DstX: s0.P1.X,
|
||||||
|
DstY: s0.P1.Y,
|
||||||
|
SrcX: s0.P1.X,
|
||||||
|
SrcY: s0.P1.Y,
|
||||||
|
ColorR: rf,
|
||||||
|
ColorG: gf,
|
||||||
|
ColorB: bf,
|
||||||
|
ColorA: af,
|
||||||
|
},
|
||||||
|
ebiten.Vertex{
|
||||||
|
DstX: s1.P1.X,
|
||||||
|
DstY: s1.P1.Y,
|
||||||
|
SrcX: s1.P1.X,
|
||||||
|
SrcY: s1.P1.Y,
|
||||||
|
ColorR: rf,
|
||||||
|
ColorG: gf,
|
||||||
|
ColorB: bf,
|
||||||
|
ColorA: af,
|
||||||
|
},
|
||||||
|
ebiten.Vertex{
|
||||||
|
DstX: s2.P0.X,
|
||||||
|
DstY: s2.P0.Y,
|
||||||
|
SrcX: s2.P0.X,
|
||||||
|
SrcY: s2.P0.Y,
|
||||||
|
ColorR: rf,
|
||||||
|
ColorG: gf,
|
||||||
|
ColorB: bf,
|
||||||
|
ColorA: af,
|
||||||
|
},
|
||||||
|
ebiten.Vertex{
|
||||||
|
DstX: s3.P0.X,
|
||||||
|
DstY: s3.P0.Y,
|
||||||
|
SrcX: s3.P0.X,
|
||||||
|
SrcY: s3.P0.Y,
|
||||||
|
ColorR: rf,
|
||||||
|
ColorG: gf,
|
||||||
|
ColorB: bf,
|
||||||
|
ColorA: af,
|
||||||
|
})
|
||||||
|
indices = append(indices, idx, idx+1, idx+2, idx+1, idx+2, idx+3,
|
||||||
|
idx+2, idx+3, idx+4, idx+3, idx+4, idx+5)
|
||||||
|
idx += 4
|
||||||
|
} else {
|
||||||
vertices = append(vertices,
|
vertices = append(vertices,
|
||||||
ebiten.Vertex{
|
ebiten.Vertex{
|
||||||
DstX: v2.X,
|
DstX: v2.X,
|
||||||
@ -129,11 +189,11 @@ func (p *Path) strokeVertices(lineWidth float32, clr color.Color) (vertices []eb
|
|||||||
ColorB: bf,
|
ColorB: bf,
|
||||||
ColorA: af,
|
ColorA: af,
|
||||||
})
|
})
|
||||||
|
|
||||||
indices = append(indices, idx, idx+1, idx+2, idx+1, idx+2, idx+3)
|
indices = append(indices, idx, idx+1, idx+2, idx+1, idx+2, idx+3)
|
||||||
idx += 2
|
idx += 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user