Improved player movement on ropes
This commit is contained in:
parent
b360d93333
commit
6119e288f8
26
main.go
26
main.go
|
@ -5,26 +5,18 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
var smiley = [8]byte{
|
|
||||||
0b11000011,
|
|
||||||
0b10000001,
|
|
||||||
0b00100100,
|
|
||||||
0b00100100,
|
|
||||||
0b00000000,
|
|
||||||
0b00100100,
|
|
||||||
0b10011001,
|
|
||||||
0b11000011,
|
|
||||||
}
|
|
||||||
|
|
||||||
var gravity = 0.2
|
var gravity = 0.2
|
||||||
var points []*Point = []*Point{}
|
var points []*Point = []*Point{}
|
||||||
var sticks []*Stick = []*Stick{}
|
var sticks []*Stick = []*Stick{}
|
||||||
var player *Player
|
var player *Player
|
||||||
var frame uint64 = 0
|
var frame uint64 = 0
|
||||||
var lightIndex uint64 = 0
|
var lightIndex uint64 = 0
|
||||||
|
var camX = 0
|
||||||
|
var camY = 0
|
||||||
|
|
||||||
//go:export start
|
//go:export start
|
||||||
func start() {
|
func start() {
|
||||||
|
|
||||||
rand.Seed(654654321348654)
|
rand.Seed(654654321348654)
|
||||||
points = []*Point{}
|
points = []*Point{}
|
||||||
sticks = []*Stick{}
|
sticks = []*Stick{}
|
||||||
|
@ -34,13 +26,23 @@ func start() {
|
||||||
w4.PALETTE[3] = 0xff4d6d
|
w4.PALETTE[3] = 0xff4d6d
|
||||||
for i := 0; i < 4; i++ {
|
for i := 0; i < 4; i++ {
|
||||||
p, s := CreateRope(
|
p, s := CreateRope(
|
||||||
Vector{0, rand.Float64()*40 + float64(i*40)},
|
|
||||||
Vector{160, rand.Float64()*40 + float64(i*40)},
|
Vector{160, rand.Float64()*40 + float64(i*40)},
|
||||||
|
Vector{0, rand.Float64()*40 + float64(i*40)},
|
||||||
10,
|
10,
|
||||||
)
|
)
|
||||||
points = append(points, p...)
|
points = append(points, p...)
|
||||||
sticks = append(sticks, s...)
|
sticks = append(sticks, s...)
|
||||||
}
|
}
|
||||||
|
for i := 0; i < 3; i++ {
|
||||||
|
p, s := CreateRope(
|
||||||
|
Vector{float64(i*30 + 30), 0},
|
||||||
|
Vector{float64(i*30 + 40), 100},
|
||||||
|
10,
|
||||||
|
)
|
||||||
|
p[len(p)-1].IsLocked = false
|
||||||
|
points = append(points, p...)
|
||||||
|
sticks = append(sticks, s...)
|
||||||
|
}
|
||||||
player = &Player{
|
player = &Player{
|
||||||
Position: Vector{80, 80},
|
Position: Vector{80, 80},
|
||||||
Speed: Vector{},
|
Speed: Vector{},
|
||||||
|
|
39
player.go
39
player.go
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"cart/w4"
|
"cart/w4"
|
||||||
"math"
|
"math"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Player struct {
|
type Player struct {
|
||||||
|
@ -13,30 +14,34 @@ type Player struct {
|
||||||
StickOffset float64
|
StickOffset float64
|
||||||
GrabTimeout uint
|
GrabTimeout uint
|
||||||
Gamepad *uint8
|
Gamepad *uint8
|
||||||
|
GamepadLast uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Player) Update() {
|
func (p *Player) Update() {
|
||||||
p.Speed.X = 0
|
lastGamepad := *p.Gamepad & (*p.Gamepad ^ p.GamepadLast)
|
||||||
|
p.GamepadLast = *p.Gamepad
|
||||||
if p.GrabTimeout > 0 {
|
if p.GrabTimeout > 0 {
|
||||||
p.GrabTimeout--
|
p.GrabTimeout--
|
||||||
}
|
}
|
||||||
if *p.Gamepad&w4.BUTTON_LEFT != 0 {
|
|
||||||
p.Speed.X -= 1
|
|
||||||
}
|
|
||||||
if *p.Gamepad&w4.BUTTON_RIGHT != 0 {
|
|
||||||
p.Speed.X += 1
|
|
||||||
}
|
|
||||||
isJumping := *p.Gamepad&w4.BUTTON_DOWN == 0
|
isJumping := *p.Gamepad&w4.BUTTON_DOWN == 0
|
||||||
p.Speed.Y = math.Min(4, p.Speed.Y+gravity)
|
p.Speed.Y = math.Min(4, p.Speed.Y+gravity)
|
||||||
if p.StickGrabbed != nil {
|
if p.StickGrabbed != nil {
|
||||||
p.Speed.Y = 0
|
p.Speed.Y = 0
|
||||||
|
p.Speed.X = 0
|
||||||
// p.Position = p.PointGrabbed.Position
|
// p.Position = p.PointGrabbed.Position
|
||||||
if *p.Gamepad&w4.BUTTON_LEFT != 0 {
|
if *p.Gamepad&w4.BUTTON_LEFT != 0 {
|
||||||
p.StickOffset -= 0.1
|
p.Speed.X -= 1
|
||||||
}
|
}
|
||||||
if *p.Gamepad&w4.BUTTON_RIGHT != 0 {
|
if *p.Gamepad&w4.BUTTON_RIGHT != 0 {
|
||||||
p.StickOffset += 0.1
|
p.Speed.X += 1
|
||||||
}
|
}
|
||||||
|
if *p.Gamepad&w4.BUTTON_UP != 0 {
|
||||||
|
p.Speed.Y -= 1
|
||||||
|
}
|
||||||
|
if *p.Gamepad&w4.BUTTON_DOWN != 0 {
|
||||||
|
p.Speed.Y += 1
|
||||||
|
}
|
||||||
|
p.MoveOnRope(p.Speed)
|
||||||
if p.StickOffset < 0 {
|
if p.StickOffset < 0 {
|
||||||
point := p.StickGrabbed.PointA
|
point := p.StickGrabbed.PointA
|
||||||
if len(point.Sticks) == 1 {
|
if len(point.Sticks) == 1 {
|
||||||
|
@ -56,11 +61,14 @@ func (p *Player) Update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p.Position = p.StickGrabbed.GetPosition(p.StickOffset)
|
p.Position = p.StickGrabbed.GetPosition(p.StickOffset)
|
||||||
if *p.Gamepad&w4.BUTTON_2 != 0 {
|
if lastGamepad&w4.BUTTON_2 != 0 {
|
||||||
p.GrabTimeout = 10
|
p.GrabTimeout = 10
|
||||||
if isJumping {
|
if isJumping {
|
||||||
p.GrabTimeout = 5
|
p.GrabTimeout = 10
|
||||||
p.Speed.Y = -4.5
|
p.Speed = p.Speed.MulScalar(2)
|
||||||
|
if p.Speed.Y <= 0 {
|
||||||
|
p.Speed.Y -= 1 * 2
|
||||||
|
}
|
||||||
impulse := p.Speed.MulScalar(-1)
|
impulse := p.Speed.MulScalar(-1)
|
||||||
p.StickGrabbed.PointA.Position.MoveVec(impulse)
|
p.StickGrabbed.PointA.Position.MoveVec(impulse)
|
||||||
p.StickGrabbed.PointB.Position.MoveVec(impulse)
|
p.StickGrabbed.PointB.Position.MoveVec(impulse)
|
||||||
|
@ -90,6 +98,7 @@ func (p *Player) Update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if stickDistance < 4 {
|
if stickDistance < 4 {
|
||||||
|
w4.Trace(strconv.FormatFloat(stickDistance, 'f', 3, 64))
|
||||||
p.StickGrabbed = selectedStick
|
p.StickGrabbed = selectedStick
|
||||||
p.StickOffset = selectedStick.GetOffset(p.Position)
|
p.StickOffset = selectedStick.GetOffset(p.Position)
|
||||||
p.StickGrabbed.PointA.Position.MoveVec(p.Speed)
|
p.StickGrabbed.PointA.Position.MoveVec(p.Speed)
|
||||||
|
@ -99,6 +108,12 @@ func (p *Player) Update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Player) MoveOnRope(motion Vector) {
|
||||||
|
newPos := p.Position.Sum(motion)
|
||||||
|
offset := p.StickGrabbed.GetOffset(newPos)
|
||||||
|
p.StickOffset = offset
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Player) Draw() {
|
func (p *Player) Draw() {
|
||||||
*w4.DRAW_COLORS = 0x34
|
*w4.DRAW_COLORS = 0x34
|
||||||
w4.Rect(int(p.Position.X)-4, int(p.Position.Y)-4, 8, 8)
|
w4.Rect(int(p.Position.X)-4, int(p.Position.Y)-4, 8, 8)
|
||||||
|
|
9
ropes.go
9
ropes.go
|
@ -58,7 +58,7 @@ func (s *Stick) GetDistance(point Vector) float64 {
|
||||||
return ap.Len()
|
return ap.Len()
|
||||||
}
|
}
|
||||||
mod := ab.Len()
|
mod := ab.Len()
|
||||||
return math.Abs(ab.X*ap.Y-ab.Y*ab.X) / mod
|
return math.Abs(ab.X*ap.Y-ab.Y*ap.X) / mod
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Stick) GetPosition(offset float64) Vector {
|
func (s *Stick) GetPosition(offset float64) Vector {
|
||||||
|
@ -70,7 +70,12 @@ func (s *Stick) GetOffset(p Vector) float64 {
|
||||||
ab := s.GetVector()
|
ab := s.GetVector()
|
||||||
ap := p.Sub(s.PointA.Position)
|
ap := p.Sub(s.PointA.Position)
|
||||||
projection := ap.ProjectTo(ab)
|
projection := ap.ProjectTo(ab)
|
||||||
return projection.Len() / ab.Len()
|
dot := ab.Dot(ap)
|
||||||
|
result := projection.Len() / ab.Len()
|
||||||
|
if dot < 0 {
|
||||||
|
result *= -1
|
||||||
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Stick) Draw() {
|
func (s *Stick) Draw() {
|
||||||
|
|
Loading…
Reference in New Issue