Object-based land engine

This commit is contained in:
LittleSheep 2024-07-18 13:59:06 +08:00
parent 4b7358a1d0
commit cd01069c89
7 changed files with 87 additions and 26 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/dist

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,7 +1,7 @@
package entities
import (
"git.solsynth.dev/highland/codingland/pkg/internal/common"
"git.solsynth.dev/highland/codingland/pkg/internal/land"
"github.com/veandco/go-sdl2/sdl"
)
@ -11,9 +11,30 @@ const (
)
type Player struct {
Position common.Vector2D
Size common.Vector2D
Velocity common.Vector2D
land.BaseObject
Position land.Vector2D
Size land.Vector2D
Velocity land.Vector2D
}
func (p *Player) Update() {
keys := sdl.GetKeyboardState()
if keys[sdl.SCANCODE_UP] == 1 || keys[sdl.SCANCODE_W] == 1 {
p.Move(0, -1)
}
if keys[sdl.SCANCODE_DOWN] == 1 || keys[sdl.SCANCODE_S] == 1 {
p.Move(0, 1)
}
if keys[sdl.SCANCODE_LEFT] == 1 || keys[sdl.SCANCODE_A] == 1 {
p.Move(-1, 0)
}
if keys[sdl.SCANCODE_RIGHT] == 1 || keys[sdl.SCANCODE_D] == 1 {
p.Move(1, 0)
}
p.Move(0, 0)
p.BaseObject.Update()
}
func (p *Player) Move(deltaX, deltaY float64) {

View File

@ -0,0 +1,29 @@
package land
import "github.com/veandco/go-sdl2/sdl"
type Object interface {
Create()
Update()
}
type DrawableObject interface {
Draw(*sdl.Renderer)
}
type BaseObject struct {
Children []Object
}
func (p *BaseObject) Create() {}
func (p *BaseObject) Update() {
// Update each child
for _, child := range p.Children {
child.Update()
}
}
func (p *BaseObject) AddChild(child Object) {
p.Children = append(p.Children, child)
}

17
pkg/internal/land/root.go Normal file
View File

@ -0,0 +1,17 @@
package land
import (
"github.com/veandco/go-sdl2/sdl"
)
type RootObject struct {
BaseObject
}
func (p *RootObject) Draw(pen *sdl.Renderer) {
for _, child := range p.Children {
if drawableChild, ok := child.(DrawableObject); ok {
drawableChild.Draw(pen)
}
}
}

View File

@ -1,4 +1,4 @@
package common
package land
type Vector2D struct {
X, Y float64

View File

@ -1,8 +1,8 @@
package main
import (
"git.solsynth.dev/highland/codingland/pkg/internal/common"
"git.solsynth.dev/highland/codingland/pkg/internal/entities"
"git.solsynth.dev/highland/codingland/pkg/internal/land"
"log"
"runtime"
@ -37,10 +37,11 @@ func main() {
}
defer renderer.Destroy()
player := &entities.Player{
Position: common.Vector2D{X: windowWidth / 2, Y: windowHeight / 2},
Size: common.Vector2D{X: playerSize, Y: playerSize},
}
root := &land.RootObject{}
root.AddChild(&entities.Player{
Position: land.Vector2D{X: windowWidth / 2, Y: windowHeight / 2},
Size: land.Vector2D{X: playerSize, Y: playerSize},
})
running := true
for running {
@ -51,26 +52,12 @@ func main() {
}
}
keys := sdl.GetKeyboardState()
if keys[sdl.SCANCODE_UP] == 1 || keys[sdl.SCANCODE_W] == 1 {
player.Move(0, -1)
}
if keys[sdl.SCANCODE_DOWN] == 1 || keys[sdl.SCANCODE_S] == 1 {
player.Move(0, 1)
}
if keys[sdl.SCANCODE_LEFT] == 1 || keys[sdl.SCANCODE_A] == 1 {
player.Move(-1, 0)
}
if keys[sdl.SCANCODE_RIGHT] == 1 || keys[sdl.SCANCODE_D] == 1 {
player.Move(1, 0)
}
player.Move(0, 0)
root.Update()
renderer.SetDrawColor(0, 0, 0, 255)
renderer.Clear()
player.Draw(renderer)
root.Draw(renderer)
renderer.Present()
}