Update tileset and game log for improved asset management and debugging
- Modified tileset configuration to include multiple tile images with updated dimensions. - Enhanced game log to provide detailed startup information and entity loading for room1. - Updated binary file for the game executable. added climebol laders
This commit is contained in:
@@ -8,6 +8,7 @@ Pos() mgl64.Vec3
|
||||
SetPos(pos mgl64.Vec3)
|
||||
IsBlocking() bool
|
||||
IsMovable() bool
|
||||
IsClimbable() bool
|
||||
Move(dx, dy, dz float64)
|
||||
Damage(amount int)
|
||||
Pickup() bool
|
||||
|
||||
@@ -8,13 +8,15 @@ import (
|
||||
type Tile struct {
|
||||
pos mgl64.Vec3
|
||||
health int
|
||||
Climbable bool
|
||||
SideImg *ebiten.Image
|
||||
TopImg *ebiten.Image
|
||||
}
|
||||
|
||||
func (t *Tile) Pos() mgl64.Vec3 { return t.pos }
|
||||
func (t *Tile) SetPos(pos mgl64.Vec3) { t.pos = pos }
|
||||
func (t *Tile) IsBlocking() bool { return true }
|
||||
func (t *Tile) IsBlocking() bool { return !t.Climbable }
|
||||
func (t *Tile) IsClimbable() bool { return t.Climbable }
|
||||
func (t *Tile) IsMovable() bool { return false }
|
||||
func (t *Tile) Move(dx, dy, dz float64) {
|
||||
// Not feasible for soil etc.
|
||||
|
||||
@@ -71,25 +71,47 @@ type TiledMap struct {
|
||||
type Portal struct {
|
||||
pos mgl64.Vec3
|
||||
TargetMap string
|
||||
SideImg *ebiten.Image
|
||||
TopImg *ebiten.Image
|
||||
}
|
||||
|
||||
func (p *Portal) Pos() mgl64.Vec3 { return p.pos }
|
||||
func (p *Portal) SetPos(pos mgl64.Vec3) { p.pos = pos }
|
||||
func (p *Portal) IsBlocking() bool { return false }
|
||||
func (p *Portal) IsMovable() bool { return false }
|
||||
func (p *Portal) Move(dx, dy, dz float64) {}
|
||||
func (p *Portal) Damage(amount int) {}
|
||||
func (p *Portal) Pickup() bool { return false }
|
||||
func (p *Portal) GetHealth() int { return 100 }
|
||||
func (p *Portal) DrawSide(screen interface{}, x, y float64, tint, alpha float32) {}
|
||||
func (p *Portal) DrawTop(screen interface{}, x, y float64, tint, alpha float32) {}
|
||||
func (p *Portal) Pos() mgl64.Vec3 { return p.pos }
|
||||
func (p *Portal) SetPos(pos mgl64.Vec3) { p.pos = pos }
|
||||
func (p *Portal) IsBlocking() bool { return false }
|
||||
func (p *Portal) IsMovable() bool { return false }
|
||||
func (p *Portal) IsClimbable() bool { return false }
|
||||
func (p *Portal) Move(dx, dy, dz float64) {}
|
||||
func (p *Portal) Damage(amount int) {}
|
||||
func (p *Portal) Pickup() bool { return false }
|
||||
func (p *Portal) GetHealth() int { return 100 }
|
||||
func (p *Portal) DrawSide(screen interface{}, x, y float64, tint, alpha float32) {
|
||||
scr := screen.(*ebiten.Image)
|
||||
if p.SideImg != nil {
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
op.GeoM.Translate(x, y)
|
||||
op.ColorScale.Scale(tint, tint, tint, alpha)
|
||||
scr.DrawImage(p.SideImg, op)
|
||||
}
|
||||
}
|
||||
func (p *Portal) DrawTop(screen interface{}, x, y float64, tint, alpha float32) {
|
||||
scr := screen.(*ebiten.Image)
|
||||
if p.TopImg != nil {
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
op.GeoM.Translate(x, y)
|
||||
op.ColorScale.Scale(tint, tint, tint, alpha)
|
||||
scr.DrawImage(p.TopImg, op)
|
||||
}
|
||||
}
|
||||
|
||||
// EntityDef definierar egenskaperna för ett tile-id
|
||||
type EntityDef struct {
|
||||
ID int `json:"id"`
|
||||
TiledID int `json:"tiled_id"`
|
||||
Solid bool `json:"solid"`
|
||||
TargetMap string `json:"target_map,omitempty"`
|
||||
ID int `json:"id"`
|
||||
TiledID int `json:"tiled_id"`
|
||||
Solid bool `json:"solid"`
|
||||
Climbable bool `json:"climbable,omitempty"`
|
||||
TargetMap string
|
||||
SideImg *ebiten.Image
|
||||
TopImg *ebiten.Image `json:"target_map,omitempty"`
|
||||
Sprites struct {
|
||||
Top string `json:"top"`
|
||||
Side string `json:"side"`
|
||||
@@ -142,9 +164,14 @@ func LoadWorldFromTiled(tmjPath string) (*World, error) {
|
||||
if img, ok := loadedImages[name]; ok {
|
||||
return img
|
||||
}
|
||||
img, _, err := ebitenutil.NewImageFromFile("assets/images/1 Tiles/" + name + ".png")
|
||||
imgPath := "assets/images/1 Tiles/" + name + ".png"
|
||||
if len(name) > 3 && name[:3] == "../" {
|
||||
imgPath = "assets/images/" + name[3:] + ".png"
|
||||
}
|
||||
|
||||
img, _, err := ebitenutil.NewImageFromFile(imgPath)
|
||||
if err != nil {
|
||||
fmt.Println("Warning, missing image:", name)
|
||||
fmt.Println("Warning, missing image:", imgPath, err)
|
||||
}
|
||||
loadedImages[name] = img
|
||||
return img
|
||||
@@ -190,9 +217,9 @@ func LoadWorldFromTiled(tmjPath string) (*World, error) {
|
||||
sideImg := loadImage(def.Sprites.Side)
|
||||
|
||||
if def.TargetMap != "" {
|
||||
ent = &Portal{TargetMap: def.TargetMap}
|
||||
ent = &Portal{TargetMap: def.TargetMap, SideImg: sideImg, TopImg: topImg}
|
||||
} else {
|
||||
ent = &Tile{SideImg: sideImg, TopImg: topImg}
|
||||
ent = &Tile{SideImg: sideImg, TopImg: topImg, Climbable: def.Climbable}
|
||||
}
|
||||
} else {
|
||||
// Fallback om def saknas
|
||||
|
||||
@@ -30,6 +30,7 @@ type Player struct {
|
||||
|
||||
// Sprites
|
||||
SpriteRun *ebiten.Image
|
||||
SpriteJump *ebiten.Image
|
||||
SpriteIdle *ebiten.Image
|
||||
SpriteTop *ebiten.Image
|
||||
AnimationFrame int
|
||||
@@ -61,16 +62,21 @@ func NewPlayScene() *PlayScene {
|
||||
if pIdle == nil {
|
||||
pIdle = pRun
|
||||
}
|
||||
pJump, _, _ := ebitenutil.NewImageFromFile("assets/images/Warrior_1/Jump.png")
|
||||
if pJump == nil {
|
||||
pJump = pRun
|
||||
}
|
||||
|
||||
pTop := ebiten.NewImage(96, 96)
|
||||
pTop.Fill(color.RGBA{255, 255, 0, 255})
|
||||
|
||||
player := &Player{
|
||||
Pos: mgl64.Vec3{50.0 * entities.TileSize, 6.0 * entities.TileSize, 50.0 * entities.TileSize},
|
||||
Width: 96,
|
||||
Height: 96,
|
||||
Width: 32,
|
||||
Height: 32,
|
||||
SpriteRun: pRun,
|
||||
SpriteIdle: pIdle,
|
||||
SpriteJump: pJump,
|
||||
SpriteTop: pTop,
|
||||
FacingRight: true,
|
||||
}
|
||||
@@ -86,36 +92,85 @@ func NewPlayScene() *PlayScene {
|
||||
func (s *PlayScene) Update() error {
|
||||
p := s.player
|
||||
|
||||
currentMoveSpeed := MoveSpeed
|
||||
if ebiten.IsKeyPressed(ebiten.KeyControl) {
|
||||
currentMoveSpeed = MoveSpeed * 1.8 // Lite snabbare när man springer
|
||||
}
|
||||
|
||||
p.Vel[0] = 0
|
||||
p.Vel[2] = 0
|
||||
isMoving := false
|
||||
|
||||
if ebiten.IsKeyPressed(ebiten.KeyLeft) || ebiten.IsKeyPressed(ebiten.KeyA) {
|
||||
p.Vel[0] = -MoveSpeed
|
||||
p.FacingRight = false
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyRight) || ebiten.IsKeyPressed(ebiten.KeyD) {
|
||||
p.Vel[0] = MoveSpeed
|
||||
p.FacingRight = true
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyUp) || ebiten.IsKeyPressed(ebiten.KeyW) {
|
||||
p.Vel[2] = -MoveSpeed
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyDown) || ebiten.IsKeyPressed(ebiten.KeyS) {
|
||||
p.Vel[2] = MoveSpeed
|
||||
isMoving = true
|
||||
// Kolla om spelaren är i ett klättringsbart objekt
|
||||
currentGridX := int((p.Pos[0] + p.Width/2) / entities.TileSize)
|
||||
currentGridY := int((p.Pos[1] + p.Height/2) / entities.TileSize)
|
||||
currentGridZ := int((p.Pos[2] + p.Width/2) / entities.TileSize)
|
||||
entIn := s.world.GetEntityAt(currentGridX, currentGridY, currentGridZ)
|
||||
|
||||
isClimbing := false
|
||||
if entIn != nil && entIn.IsClimbable() && ebiten.IsKeyPressed(ebiten.KeyShift) {
|
||||
isClimbing = true
|
||||
}
|
||||
|
||||
if ebiten.IsKeyPressed(ebiten.KeySpace) && p.IsGrounded {
|
||||
p.Vel[1] = JumpForce
|
||||
p.IsGrounded = false
|
||||
}
|
||||
if isClimbing {
|
||||
p.Vel[1] = 0 // Ingen gravitation när man klättrar
|
||||
|
||||
if !p.IsGrounded {
|
||||
p.Vel[1] += Gravity
|
||||
// W, A, S, D styr X och Y axlar
|
||||
if ebiten.IsKeyPressed(ebiten.KeyA) {
|
||||
p.Vel[0] = -currentMoveSpeed
|
||||
p.FacingRight = false
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyD) {
|
||||
p.Vel[0] = currentMoveSpeed
|
||||
p.FacingRight = true
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyW) {
|
||||
p.Vel[1] = -currentMoveSpeed // Uppåt
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyS) {
|
||||
p.Vel[1] = currentMoveSpeed // Nedåt
|
||||
isMoving = true
|
||||
}
|
||||
// Upp/ner pilarna styr Z-axeln
|
||||
if ebiten.IsKeyPressed(ebiten.KeyUp) {
|
||||
p.Vel[2] = -currentMoveSpeed
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyDown) {
|
||||
p.Vel[2] = currentMoveSpeed
|
||||
isMoving = true
|
||||
}
|
||||
} else {
|
||||
if ebiten.IsKeyPressed(ebiten.KeyLeft) || ebiten.IsKeyPressed(ebiten.KeyA) {
|
||||
p.Vel[0] = -currentMoveSpeed
|
||||
p.FacingRight = false
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyRight) || ebiten.IsKeyPressed(ebiten.KeyD) {
|
||||
p.Vel[0] = currentMoveSpeed
|
||||
p.FacingRight = true
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyUp) || ebiten.IsKeyPressed(ebiten.KeyW) {
|
||||
p.Vel[2] = -currentMoveSpeed
|
||||
isMoving = true
|
||||
}
|
||||
if ebiten.IsKeyPressed(ebiten.KeyDown) || ebiten.IsKeyPressed(ebiten.KeyS) {
|
||||
p.Vel[2] = currentMoveSpeed
|
||||
isMoving = true
|
||||
}
|
||||
|
||||
if ebiten.IsKeyPressed(ebiten.KeySpace) && p.IsGrounded {
|
||||
p.Vel[1] = JumpForce
|
||||
p.IsGrounded = false
|
||||
}
|
||||
|
||||
if !p.IsGrounded {
|
||||
p.Vel[1] += Gravity
|
||||
}
|
||||
}
|
||||
|
||||
nextX := p.Pos[0] + p.Vel[0]
|
||||
@@ -295,8 +350,8 @@ func (s *PlayScene) drawPlayerSide(screen *ebiten.Image, camX, camY float64) {
|
||||
op.GeoM.Translate(96, 0)
|
||||
}
|
||||
|
||||
drawX := p.Pos[0] - camX
|
||||
drawY := p.Pos[1] - camY
|
||||
drawX := p.Pos[0] - camX - 32
|
||||
drawY := p.Pos[1] - camY - 64
|
||||
|
||||
op.GeoM.Translate(drawX, drawY)
|
||||
screen.DrawImage(subImg, op)
|
||||
@@ -306,8 +361,8 @@ func (s *PlayScene) drawPlayerTop(screen *ebiten.Image, camX, camZ float64) {
|
||||
p := s.player
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
|
||||
drawX := p.Pos[0] - camX
|
||||
drawZ := p.Pos[2] - camZ
|
||||
drawX := p.Pos[0] - camX - 32
|
||||
drawZ := p.Pos[2] - camZ - 64
|
||||
op.GeoM.Translate(drawX, drawZ)
|
||||
screen.DrawImage(p.SpriteTop, op)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user