Merge branch 'adding-player-object' into 'experimental'

Adding player object

See merge request zolfite/project-rpg!2
This commit is contained in:
Mollusk 2018-01-24 13:13:46 +00:00
commit b8c882a646
3 changed files with 172 additions and 63 deletions

78
gameobjects/animate.go Normal file
View File

@ -0,0 +1,78 @@
package gameobjects
import (
"github.com/faiface/pixel"
"github.com/faiface/pixel/pixelgl"
)
type Animate struct {
//PlayerVec pixel.Vec
Sprite *pixel.Sprite
Up []pixel.Rect
Down []pixel.Rect
Left []pixel.Rect
Right []pixel.Rect
Idle bool
Dir int
Frame int
Current []pixel.Rect
SprSheet pixel.Picture
Speed int64
}
func NewAnimation(spriteSheet pixel.Picture, sprFrames []pixel.Rect) Animate {
var animation Animate
for i := 0; i < 3; i++ {
animation.Up = append(animation.Up, sprFrames[i])
}
for i := 3; i < 6; i++ {
animation.Right = append(animation.Right, sprFrames[i])
}
for i := 6; i < 9; i++ {
animation.Left = append(animation.Left, sprFrames[i])
}
for i := 9; i < 12; i++ {
animation.Down = append(animation.Down, sprFrames[i])
}
animation.Current = animation.Down
animation.SprSheet = spriteSheet
animation.Sprite = pixel.NewSprite(spriteSheet, animation.Current[0])
animation.Frame = 0
animation.Idle = false
animation.Speed = 6
return animation
}
var elapsedTime int64 = 0
func (a *Animate) Update(dt int64) {
var direction int = a.Dir
switch direction {
case 0:
a.Current = a.Up
case 1:
a.Current = a.Down
case 2:
a.Current = a.Left
case 3:
a.Current = a.Right
}
elapsedTime += dt
if elapsedTime >= 1000000000/ a.Speed{
a.Frame++
elapsedTime -= 1000000000 / a.Speed
}
if a.Frame >= 3 {
a.Frame = 0
}
if a.Idle {
a.Frame = 0
}
a.Sprite.Set(a.SprSheet, a.Current[a.Frame])
}
func (a *Animate) Render(win *pixelgl.Window, pVec pixel.Vec) {
a.Sprite.Draw(win, pixel.IM.Scaled(pixel.ZV, 4).Moved(pVec))
}

86
gameobjects/player.go Normal file
View File

@ -0,0 +1,86 @@
package gameobjects
import (
"github.com/faiface/pixel"
"github.com/faiface/pixel/pixelgl"
//"fmt"
)
type Player struct {
PlayerVec pixel.Vec
sprFrame int
spriteSheet pixel.Picture
sprFrames []pixel.Rect
sprite *pixel.Sprite
speed float64
dir int
animation Animate
}
func NewPlayer(win *pixelgl.Window, spriteSheet pixel.Picture) Player {
var p Player
p.PlayerVec = pixel.Vec{
X: win.Bounds().Max.X / 2,
Y: win.Bounds().Max.Y / 2,
}
p.sprFrame = 9
p.spriteSheet = spriteSheet
p.sprFrames = createSpriteFrames(spriteSheet)
p.animation = NewAnimation(p.spriteSheet, p.sprFrames)
//p.sprite = pixel.NewSprite(spriteSheet, p.sprFrames[p.sprFrame])
p.speed = 10.0
return p
}
func (p *Player) Update(win *pixelgl.Window, dt int64) {
var vecX, vecY float64 = 0, 0
speed := p.speed
if win.Pressed(pixelgl.KeyA) { //left
p.sprFrame = 6
p.dir = 2
vecX -= speed
}
if win.Pressed(pixelgl.KeyD) { //Right
p.sprFrame = 3
p.dir = 3
vecX += speed
}
if win.Pressed(pixelgl.KeyS) { //Down
p.sprFrame = 9
p.dir = 1
vecY -= speed
}
if win.Pressed(pixelgl.KeyW) { //up
p.sprFrame = 0
p.dir = 0
vecY += speed
}
if vecY == 0 && vecX == 0 {
p.animation.Idle = true
} else {
p.animation.Idle = false
}
//p.sprite.Set(p.spriteSheet, p.sprFrames[p.sprFrame])
p.animation.Dir = p.dir
p.animation.Update(dt)
p.PlayerVec.X += vecX
p.PlayerVec.Y += vecY
}
func (p *Player) Render(win *pixelgl.Window) { //include batch later
//p.sprite.Draw(win, pixel.IM.Scaled(pixel.ZV, 4).Moved(p.PlayerVec))
p.animation.Render(win, p.PlayerVec)
}
func createSpriteFrames(spriteSheet pixel.Picture) []pixel.Rect {
var sprFrames []pixel.Rect
var frameHeight, frameWidth float64 = 96, 96
for y := spriteSheet.Bounds().Min.Y; y < frameHeight*4; y += 96 {
for x := spriteSheet.Bounds().Min.X; x < frameWidth*3; x += 96 {
sprFrames = append(sprFrames, pixel.R(x, y, x+96, y+96)) // (x, y, width, height) of frame
}
}
return sprFrames
}

71
main.go
View File

@ -9,6 +9,7 @@ import (
_ "image/png"
"gitbutter.pw/zolfite/project-rpg/gameobjects"
"github.com/faiface/pixel"
"github.com/faiface/pixel/pixelgl"
"golang.org/x/image/colornames"
@ -52,26 +53,8 @@ func run() {
bg := pixel.NewSprite(background, background.Bounds())
//batch := pixel.NewBatch(&pixel.TrianglesData{}, spritesheet)
/* setting-character-sprite
basically changed it around so the 12 frames of the character with yellow hair
are added to spritesFrames.
*/
var spritesFrames []pixel.Rect
var frameWidth, frameHeight float64 = 96, 96
for y := spritesheet.Bounds().Min.Y; y < frameHeight*4; y += 96 {
for x := spritesheet.Bounds().Min.X; x < frameWidth*3; x += 96 {
spritesFrames = append(spritesFrames, pixel.R(x, y, x+96, y+96)) // (x, y, width, height) of frame
}
}
Sprite := pixel.NewSprite(spritesheet, spritesFrames[9])
var (
camPos = pixel.ZV
//camSpeed = 500.0
camPos = pixel.ZV
camZoom = 0.3
camZoomSpeed = 1.2
)
@ -80,15 +63,7 @@ func run() {
frames = 0
second = time.Tick(time.Second)
)
playerX := win.Bounds().Max.X / 2
playerY := win.Bounds().Max.Y / 2
var (
playerXY = pixel.Vec{
playerX,
playerY,
}
)
player := gameobjects.NewPlayer(win, spritesheet)
var fps int64 = 60
timePerFrame := 1000000000 / fps
@ -107,44 +82,14 @@ func run() {
// *** Update begins *** //
playerXY = pixel.Vec{
playerX,
playerY,
}
cam := pixel.IM.Scaled(camPos, camZoom).Moved(win.Bounds().Center().Sub(camPos))
win.SetMatrix(cam)
/*
This is where Sprite and bg was originally. Creating them over and over inside
the main loop is not very good resource management. When i added my own dt, the game was
only going about 22 fps, when it should've been going 60. I moved them
out of the loop and created them up top. It fixed it and now runs faster.
the tutorial only has it in the loop with the exception that it creates it only
if you click the button to make a tree. It only created it once and added it.
*/
player.Update(win, dt)
//mouse := cam.Unproject(win.MousePosition())
speed := 10.0
if win.Pressed(pixelgl.KeyA) { //left
playerX -= speed
Sprite.Set(spritesheet, spritesFrames[6])
}
if win.Pressed(pixelgl.KeyD) { //Right
playerX += speed
Sprite.Set(spritesheet, spritesFrames[3])
}
if win.Pressed(pixelgl.KeyS) { //Down
playerY -= speed
Sprite.Set(spritesheet, spritesFrames[9])
}
if win.Pressed(pixelgl.KeyW) { //up
playerY += speed
Sprite.Set(spritesheet, spritesFrames[0])
}
camPos.X = playerX
camPos.Y = playerY
camPos.X = player.PlayerVec.X
camPos.Y = player.PlayerVec.Y
camZoom *= math.Pow(camZoomSpeed, win.MouseScroll().Y)
// *** Update Ends *** //
@ -152,13 +97,13 @@ func run() {
// *** Render begin *** //
win.Clear(colornames.Forestgreen)
bg.Draw(win, pixel.IM.Moved(win.Bounds().Center()))
Sprite.Draw(win, pixel.IM.Scaled(pixel.ZV, 4).Moved(playerXY))
player.Render(win)
//batch.Draw(win)
win.Update()
// *** Render End *** //
dt = 0
frames++
select {
case <-second: