1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-10-01 15:46:17 -04:00

removed magic numbers from d2ui/frame.go (#784)

This commit is contained in:
gravestench 2020-10-22 22:27:18 +01:00 committed by GitHub
parent 7661b81576
commit 2704a23289
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,26 +9,43 @@ import (
) )
type UIFrame struct { type UIFrame struct {
asset *d2asset.AssetManager asset *d2asset.AssetManager
uiManager *UIManager uiManager *UIManager
frame *Sprite frame *Sprite
originX int originX int
originY int originY int
frameOrientation FrameOrientation frameOrientation FrameOrientation
} }
type FrameOrientation = int type FrameOrientation = int
const(
const (
FrameLeft FrameOrientation = iota FrameLeft FrameOrientation = iota
FrameRight FrameRight
) )
func NewUIFrame ( // frame indices into dc6 images for panels
const (
leftFrameTopLeft = iota
leftFrameTopRight
leftFrameMiddleRight
leftFrameBottomLeft
leftFrameBottomRight
rightFrameTopLeft
rightFrameTopRight
rightFrameMiddleRight
rightFrameBottomRight
rightFrameBottomLeft
)
type offsetCalcFn = func(u *UIFrame) (x, y int)
func NewUIFrame(
asset *d2asset.AssetManager, asset *d2asset.AssetManager,
uiManager *UIManager, uiManager *UIManager,
frameOrientation FrameOrientation, frameOrientation FrameOrientation,
) *UIFrame { ) *UIFrame {
var originX, originY = 0,0 var originX, originY = 0, 0
switch frameOrientation { switch frameOrientation {
case FrameLeft: case FrameLeft:
@ -38,12 +55,12 @@ func NewUIFrame (
originX = 400 originX = 400
originY = 0 originY = 0
} }
frame := &UIFrame { frame := &UIFrame{
asset : asset, asset: asset,
uiManager: uiManager, uiManager: uiManager,
frameOrientation: frameOrientation, frameOrientation: frameOrientation,
originX: originX, originX: originX,
originY: originY, originY: originY,
} }
frame.Load() frame.Load()
return frame return frame
@ -68,161 +85,118 @@ func (u *UIFrame) Render(target d2interface.Surface) error {
} }
func (u *UIFrame) renderLeft(target d2interface.Surface) error { func (u *UIFrame) renderLeft(target d2interface.Surface) error {
x, y := u.originX, u.originY // the frame pieces we are interested in.
framePieces := []int{
// Frame leftFrameTopLeft,
// Top left leftFrameTopRight,
if err := u.frame.SetCurrentFrame(0); err != nil { leftFrameMiddleRight,
return err leftFrameBottomLeft,
leftFrameBottomRight,
} }
w, h := u.frame.GetCurrentFrameSize() // the frame coordinates
coord := make(map[int]*struct{ x, y int })
u.frame.SetPosition(x, y+h) startX, startY := u.originX, u.originY
currentX, currentY := startX, startY
if err := u.frame.Render(target); err != nil { // first determine the coordinates for each frame
return err // the order that we check is important
for _, piece := range framePieces {
width, height, err := u.frame.GetFrameSize(piece)
if err != nil {
return err
}
c := &struct{ x, y int }{}
switch piece {
case leftFrameTopLeft:
c.x, c.y = currentX, currentY+height
currentX, currentY = currentX+width, currentY+height
case leftFrameTopRight:
c.x, c.y = currentX, startY+height
currentX = startX
case leftFrameMiddleRight:
c.x, c.y = currentX, currentY+height
currentY += height
case leftFrameBottomLeft:
c.x, c.y = currentX, currentY+height
currentX += width
case leftFrameBottomRight:
c.x, c.y = currentX, currentY+height
}
coord[piece] = c
} }
x += w // now render the pieces with the coordinates
y += h for idx, c := range coord {
err := u.renderFramePiece(target, c.x, c.y, idx)
// Top right if err != nil {
if err := u.frame.SetCurrentFrame(1); err != nil { return err
return err }
} }
_, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x, u.originY+h)
if err := u.frame.Render(target); err != nil {
return err
}
x = u.originX
// Right
if err := u.frame.SetCurrentFrame(2); err != nil {
return err
}
_, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
y += h
// Bottom left
if err := u.frame.SetCurrentFrame(3); err != nil {
return err
}
w, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
x += w
// Bottom right
if err := u.frame.SetCurrentFrame(4); err != nil {
return err
}
_, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
return nil return nil
} }
func (u *UIFrame) renderRight(target d2interface.Surface) error { func (u *UIFrame) renderRight(target d2interface.Surface) error {
x, y := u.originX, u.originY // the frame pieces we are interested in.
framePieces := []int{
// Frame rightFrameTopLeft,
// Top left rightFrameTopRight,
if err := u.frame.SetCurrentFrame(5); err != nil { rightFrameMiddleRight,
return err rightFrameBottomRight,
rightFrameBottomLeft,
} }
w, h := u.frame.GetCurrentFrameSize() // the frame coordinates
coord := make(map[int]*struct{ x, y int })
u.frame.SetPosition(x, y+h) startX, startY := u.originX, u.originY
currentX, currentY := startX, startY
if err := u.frame.Render(target); err != nil { // first determine the coordinates for each frame
return err // the order that we check is important
for _, piece := range framePieces {
width, height, err := u.frame.GetFrameSize(piece)
if err != nil {
return err
}
c := &struct{ x, y int }{}
switch piece {
case rightFrameTopLeft:
c.x, c.y = currentX, currentY+height
currentX += width
case rightFrameTopRight:
c.x, c.y = currentX, currentY+height
currentX += width
currentY += height
case rightFrameMiddleRight:
c.x, c.y = currentX-width, currentY+height
currentY += height
case rightFrameBottomRight:
c.x, c.y = currentX-width, currentY+height
currentX -= width
case rightFrameBottomLeft:
c.x, c.y = currentX-width, currentY+height
currentX += width
}
coord[piece] = c
} }
x += w // now render the pieces with the coordinates
for idx, c := range coord {
// Top right err := u.renderFramePiece(target, c.x, c.y, idx)
if err := u.frame.SetCurrentFrame(6); err != nil { if err != nil {
return err return err
}
} }
w, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
x += w
y += h
// Right
if err := u.frame.SetCurrentFrame(7); err != nil {
return err
}
w, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x-w, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
y += h
// Bottom right
if err := u.frame.SetCurrentFrame(8); err != nil {
return err
}
w, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x-w, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
x -= w
// Bottom left
if err := u.frame.SetCurrentFrame(9); err != nil {
return err
}
w, h = u.frame.GetCurrentFrameSize()
u.frame.SetPosition(x-w, y+h)
if err := u.frame.Render(target); err != nil {
return err
}
return nil return nil
} }
@ -233,3 +207,17 @@ func (u *UIFrame) GetFrameBounds() (width, height int) {
func (u *UIFrame) GetFrameCount() int { func (u *UIFrame) GetFrameCount() int {
return u.frame.GetFrameCount() return u.frame.GetFrameCount()
} }
func (u *UIFrame) renderFramePiece(sfc d2interface.Surface, x, y, idx int) error {
if err := u.frame.SetCurrentFrame(idx); err != nil {
return err
}
u.frame.SetPosition(x, y)
if err := u.frame.Render(sfc); err != nil {
return err
}
return nil
}