Skip to content

Commit 82f3e92

Browse files
committed
Add ground.
1 parent 8728fb7 commit 82f3e92

File tree

8 files changed

+192
-47
lines changed

8 files changed

+192
-47
lines changed

cmd/main.go

+38-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package main
22

33
import (
4-
"github.com/gdamore/tcell"
54
"fmt"
6-
"os"
7-
"github.com/gdamore/tcell/encoding"
85
"github.com/demouth/mario-go"
6+
"github.com/gdamore/tcell"
7+
"github.com/gdamore/tcell/encoding"
8+
"os"
99
"time"
1010
)
1111

@@ -35,9 +35,31 @@ func main() {
3535
world := mario_go.NewWorld(s)
3636
world.Width = w
3737
world.Height = h
38-
world.Draw()
3938
sp := mario_go.NewMario()
40-
world.AddChild(sp)
39+
sp.SetX(10)
40+
sp.SetY(50)
41+
world.SetMario(sp)
42+
ground := mario_go.NewGround()
43+
ground.SetX(0)
44+
ground.SetY(0)
45+
ground2 := mario_go.NewGround()
46+
ground2.SetX(16)
47+
ground2.SetY(0)
48+
ground3 := mario_go.NewGround()
49+
ground3.SetX(32)
50+
ground3.SetY(0)
51+
ground4 := mario_go.NewGround()
52+
ground4.SetX(60)
53+
ground4.SetY(10)
54+
ground5 := mario_go.NewGround()
55+
ground5.SetX(100)
56+
ground5.SetY(24)
57+
world.AddObject(ground)
58+
world.AddObject(ground2)
59+
world.AddObject(ground3)
60+
world.AddObject(ground4)
61+
world.AddObject(ground5)
62+
world.Draw()
4163

4264
quit := make(chan struct{})
4365

@@ -57,7 +79,7 @@ func main() {
5779
} else if ev.Key() == tcell.KeyUp {
5880
sp.Jump()
5981
} else if ev.Key() == tcell.KeyDown {
60-
sp.SetY(sp.Y()-1)
82+
sp.SetY(sp.Y() - 1)
6183
}
6284
case *tcell.EventResize:
6385
w, h = s.Size()
@@ -69,17 +91,24 @@ func main() {
6991
}
7092
}()
7193

72-
loop:
94+
loop:
7395
for {
7496
select {
7597
case <-quit:
7698
break loop
77-
case <-time.After(time.Millisecond * 20):
99+
case <-time.After(time.Millisecond * 25):
78100
}
101+
st := tcell.StyleDefault.Background(tcell.NewHexColor(0x6AADFD))
102+
s.Fill(' ', st)
103+
//s.Clear()
79104
sp.Move()
105+
world.HitTest()
106+
world.CameraX = -sp.X() + 30
107+
if world.CameraX > 0 {
108+
world.CameraX = 0
109+
}
80110
world.Draw()
81111
s.Show()
82-
s.Clear()
83112
}
84113

85114
s.Fini()

docs/static/screen_capture.gif

583 KB
Loading

dot.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package mario_go
22

33
type Dot struct {
4-
X int
5-
Y int
4+
X int
5+
Y int
66
Color int32
77
}
88

99
type Dots []Dot
1010

11-
func NewDot(x,y int,color int32) *Dot {
12-
d := &Dot{x,y,color}
11+
func NewDot(x, y int, color int32) *Dot {
12+
d := &Dot{x, y, color}
1313
return d
1414
}
1515

16-
func MakeDots(indices []int32) Dots{
16+
func MakeDots(indices []int32) Dots {
1717
dots := Dots{}
18-
for i:=0;i<len(indices);i+=3 {
19-
dots = append(dots, *NewDot(int(indices[i]),int(indices[i+1]),indices[i+2]))
18+
for i := 0; i < len(indices); i += 3 {
19+
dots = append(dots, *NewDot(int(indices[i]), int(indices[i+1]), indices[i+2]))
2020
}
2121
return dots
22-
}
22+
}

drawable.go

+2
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ type Drawable interface {
99
Y() int
1010
SetX(v int)
1111
SetY(v int)
12+
Width() int
13+
Height() int
1214
}

ground.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package mario_go
2+
3+
type Ground struct {
4+
Sprite
5+
sx float32
6+
sy float32
7+
}
8+
9+
func NewGround() *Ground {
10+
s := &Ground{}
11+
return s
12+
}
13+
14+
func (s Ground) Dots() Dots {
15+
var m int32 = 0x9B4808
16+
var l int32 = 0xFECDC6
17+
var b int32 = 0x000000
18+
indices := []int32{
19+
0, 15, m, 1, 15, l, 2, 15, l, 3, 15, l, 4, 15, l, 5, 15, l, 6, 15, l, 7, 15, l, 8, 15, l, 9, 15, l, 10, 15, b, 11, 15, m, 12, 15, l, 13, 15, l, 14, 15, l, 15, 15, m,
20+
0, 14, l, 1, 14, m, 2, 14, m, 3, 14, m, 4, 14, m, 5, 14, m, 6, 14, m, 7, 14, m, 8, 14, m, 9, 14, m, 10, 14, b, 11, 14, l, 12, 14, m, 13, 14, m, 14, 14, m, 15, 14, b,
21+
0, 13, l, 1, 13, m, 2, 13, m, 3, 13, m, 4, 13, m, 5, 13, m, 6, 13, m, 7, 13, m, 8, 13, m, 9, 13, m, 10, 13, b, 11, 13, l, 12, 13, m, 13, 13, m, 14, 13, m, 15, 13, b,
22+
0, 12, l, 1, 12, m, 2, 12, m, 3, 12, m, 4, 12, m, 5, 12, m, 6, 12, m, 7, 12, m, 8, 12, m, 9, 12, m, 10, 12, b, 11, 12, l, 12, 12, m, 13, 12, m, 14, 12, m, 15, 12, b,
23+
0, 11, l, 1, 11, m, 2, 11, m, 3, 11, m, 4, 11, m, 5, 11, m, 6, 11, m, 7, 11, m, 8, 11, m, 9, 11, m, 10, 11, b, 11, 11, l, 12, 11, b, 13, 11, m, 14, 11, m, 15, 11, b,
24+
0, 10, l, 1, 10, m, 2, 10, m, 3, 10, m, 4, 10, m, 5, 10, m, 6, 10, m, 7, 10, m, 8, 10, m, 9, 10, m, 10, 10, b, 11, 10, m, 12, 10, b, 13, 10, b, 14, 10, b, 15, 10, m,
25+
0, 9, l, 1, 9, m, 2, 9, m, 3, 9, m, 4, 9, m, 5, 9, m, 6, 9, m, 7, 9, m, 8, 9, m, 9, 9, m, 10, 9, b, 11, 9, l, 12, 9, l, 13, 9, l, 14, 9, l, 15, 9, b,
26+
0, 8, l, 1, 8, m, 2, 8, m, 3, 8, m, 4, 8, m, 5, 8, m, 6, 8, m, 7, 8, m, 8, 8, m, 9, 8, m, 10, 8, b, 11, 8, l, 12, 8, m, 13, 8, m, 14, 8, m, 15, 8, b,
27+
0, 7, l, 1, 7, m, 2, 7, m, 3, 7, m, 4, 7, m, 5, 7, m, 6, 7, m, 7, 7, m, 8, 7, m, 9, 7, m, 10, 7, b, 11, 7, l, 12, 7, m, 13, 7, m, 14, 7, m, 15, 7, b,
28+
0, 6, l, 1, 6, m, 2, 6, m, 3, 6, m, 4, 6, m, 5, 6, m, 6, 6, m, 7, 6, m, 8, 6, m, 9, 6, m, 10, 6, b, 11, 6, l, 12, 6, m, 13, 6, m, 14, 6, m, 15, 6, b,
29+
0, 5, b, 1, 5, b, 2, 5, m, 3, 5, m, 4, 5, m, 5, 5, m, 6, 5, m, 7, 5, m, 8, 5, m, 9, 5, b, 10, 5, l, 11, 5, m, 12, 5, m, 13, 5, m, 14, 5, m, 15, 5, b,
30+
0, 4, l, 1, 4, l, 2, 4, b, 3, 4, b, 4, 4, m, 5, 4, m, 6, 4, m, 7, 4, m, 8, 4, m, 9, 4, b, 10, 4, l, 11, 4, m, 12, 4, m, 13, 4, m, 14, 4, m, 15, 4, b,
31+
0, 3, l, 1, 3, m, 2, 3, l, 3, 3, l, 4, 3, b, 5, 3, b, 6, 3, b, 7, 3, b, 8, 3, l, 9, 3, m, 10, 3, m, 11, 3, m, 12, 3, m, 13, 3, m, 14, 3, m, 15, 3, b,
32+
0, 2, l, 1, 2, m, 2, 2, m, 3, 2, m, 4, 2, l, 5, 2, l, 6, 2, l, 7, 2, b, 8, 2, l, 9, 2, m, 10, 2, m, 11, 2, m, 12, 2, m, 13, 2, m, 14, 2, m, 15, 2, b,
33+
0, 1, l, 1, 1, m, 2, 1, m, 3, 1, m, 4, 1, m, 5, 1, m, 6, 1, m, 7, 1, b, 8, 1, l, 9, 1, m, 10, 1, m, 11, 1, m, 12, 1, m, 13, 1, m, 14, 1, b, 15, 1, b,
34+
0, 0, m, 1, 0, b, 2, 0, b, 3, 0, b, 4, 0, b, 5, 0, b, 6, 0, b, 7, 0, m, 8, 0, l, 9, 0, b, 10, 0, b, 11, 0, b, 12, 0, b, 13, 0, b, 14, 0, b, 15, 0, m,
35+
}
36+
return MakeDots(indices)
37+
}
38+
39+
func (s Ground) Width() int {
40+
return 16
41+
}
42+
43+
func (s Ground) Height() int {
44+
return 16
45+
}

mario.go

+46-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type Mario struct {
77
sx float32
88
sy float32
99
reverse bool
10+
landing bool
1011
}
1112

1213
func NewMario() *Mario {
@@ -24,16 +25,37 @@ func (m *Mario) Move() {
2425
if math.Absf(m.sx) < 0.1 {
2526
m.sx = 0
2627
}
28+
if m.x < 0 {
29+
m.x = 0
30+
m.StopX()
31+
}
2732
if m.y < 0 {
2833
m.y = 0
29-
m.sy = 0
34+
m.Land()
3035
}
3136
}
3237

38+
func (m *Mario) StopX() {
39+
m.sx = 0
40+
}
41+
42+
func (m *Mario) StopY() {
43+
m.sy = 0
44+
}
45+
46+
func (m *Mario) Land() {
47+
m.sy = 0
48+
m.landing = true
49+
}
50+
51+
func (m *Mario) Fall() {
52+
m.sy = 0
53+
}
54+
3355
func (m *Mario) Left() {
3456
if math.Absf(m.sx) < 0.6 {
3557
m.sx -= 0.4
36-
}else {
58+
} else {
3759
m.sx -= 1.0
3860
}
3961
m.reverse = true
@@ -42,23 +64,31 @@ func (m *Mario) Left() {
4264
func (m *Mario) Right() {
4365
if math.Absf(m.sx) < 0.6 {
4466
m.sx += 0.4
45-
}else{
67+
} else {
4668
m.sx += 1.0
4769
}
4870
m.reverse = false
4971
}
5072

5173
func (m *Mario) Jump() {
5274
if !m.Jumping() {
53-
m.sy += 4.0
75+
m.sy += 5.0
76+
m.landing = false
5477
}
5578
}
5679

5780
func (m *Mario) Jumping() bool {
58-
if m.y == 0 {
81+
return !m.landing
82+
}
83+
84+
func (m Mario) Rising() bool {
85+
if m.landing {
5986
return false
6087
}
61-
return true
88+
if 0 < m.sy {
89+
return true
90+
}
91+
return false
6292
}
6393

6494
func (s Mario) Dots() Dots {
@@ -68,7 +98,7 @@ func (s Mario) Dots() Dots {
6898
} else if math.Absf(s.sx) > 0 {
6999
if s.sx < 0.0 && !s.reverse {
70100
dots = s.stopDots()
71-
} else if s.sx > 0.0 && s.reverse{
101+
} else if s.sx > 0.0 && s.reverse {
72102
dots = s.stopDots()
73103
} else if int(s.x)%9 < 3 {
74104
dots = s.run1Dots()
@@ -237,7 +267,15 @@ func (s Mario) jumpDots() Dots {
237267

238268
func reverseDost(dots Dots) Dots {
239269
for i, dot := range dots {
240-
dots[i].X = 13 - dot.X
270+
dots[i].X = 11 - dot.X
241271
}
242272
return dots
243273
}
274+
275+
func (s Mario) Width() int {
276+
return 12
277+
}
278+
279+
func (s Mario) Height() int {
280+
return 16
281+
}

sprite.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ func (s Sprite) Y() int {
2323
return int(s.y)
2424
}
2525

26-
func (s *Sprite)SetX(v int){
26+
func (s *Sprite) SetX(v int) {
2727
s.x = float32(v)
2828
}
2929

30-
func (s *Sprite)SetY(v int){
30+
func (s *Sprite) SetY(v int) {
3131
s.y = float32(v)
3232
}
3333

@@ -42,8 +42,8 @@ func (s *Sprite) Draw() {
4242

4343
func (s Sprite) Dots() Dots {
4444
var dots Dots
45-
d := NewDot(0,0,0x8A7301)
46-
d2 := NewDot(2,1,0xFF0000)
45+
d := NewDot(0, 0, 0x8A7301)
46+
d2 := NewDot(2, 1, 0xFF0000)
4747
dots = Dots{*d, *d2}
4848
return dots
4949
}

world.go

+49-18
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,72 @@ import (
55
)
66

77
type World struct {
8-
screen tcell.Screen
9-
children []Drawable
10-
Width int
11-
Height int
8+
screen tcell.Screen
9+
objects []Drawable
10+
Width int
11+
Height int
1212
CameraX int
1313
CameraY int
14+
Mario *Mario
1415
}
1516

16-
1717
func NewWorld(s tcell.Screen) *World {
1818
w := &World{}
1919
w.screen = s
20-
w.children = []Drawable{}
21-
w.CameraX=0
22-
w.CameraY=0
20+
w.objects = []Drawable{}
21+
w.CameraX = 0
22+
w.CameraY = 0
2323
return w
2424
}
2525

26-
func (world *World) AddChild(child Drawable) {
27-
child.SetScreen(world.screen)
28-
world.children = append(world.children,child)
26+
func (world *World) SetMario(mario *Mario) {
27+
mario.SetScreen(world.screen)
28+
world.Mario = mario
2929
}
3030

31-
func (w *World) Draw() {
32-
for _, child := range w.children {
33-
w.DrawDots(child)
31+
func (world *World) AddObject(object Drawable) {
32+
object.SetScreen(world.screen)
33+
world.objects = append(world.objects, object)
34+
}
35+
36+
func (w *World) HitTest() {
37+
for _, child := range w.objects {
38+
if child.X() < w.Mario.X()+w.Mario.Width() && w.Mario.X() < child.X()+child.Width() && child.Y() < w.Mario.Y()+w.Mario.Height() && w.Mario.Y() < child.Y()+child.Height() {
39+
leftOverlap := w.Mario.X() - (child.X() + child.Width())
40+
rightOverlap := child.X() - (w.Mario.X() + w.Mario.Width())
41+
topOverlap := w.Mario.Y() - (child.Y() + child.Height())
42+
bottomOverlap := child.Y() - (w.Mario.Y() + w.Mario.Height())
43+
if rightOverlap < leftOverlap && topOverlap < leftOverlap && bottomOverlap < leftOverlap {
44+
w.Mario.SetX(child.X() + child.Width())
45+
w.Mario.StopX()
46+
} else if leftOverlap < rightOverlap && topOverlap < rightOverlap && bottomOverlap < rightOverlap {
47+
w.Mario.SetX(child.X() - w.Mario.Width())
48+
w.Mario.StopX()
49+
} else if leftOverlap < topOverlap && rightOverlap < topOverlap && bottomOverlap < topOverlap {
50+
w.Mario.SetY(child.Y() + child.Height())
51+
if !w.Mario.Rising() {
52+
w.Mario.Land()
53+
}
54+
} else if leftOverlap < bottomOverlap && rightOverlap < bottomOverlap && topOverlap < bottomOverlap {
55+
w.Mario.SetY(child.Y() - w.Mario.Height())
56+
w.Mario.Fall()
57+
}
58+
}
3459
}
3560
}
3661

62+
func (w *World) Draw() {
63+
for _, object := range w.objects {
64+
w.DrawDots(object)
65+
}
66+
w.DrawDots(w.Mario)
67+
}
3768

3869
func (w World) DrawDots(child Drawable) {
3970
dots := child.Dots()
40-
for _,dot := range dots {
71+
for _, dot := range dots {
4172
st := tcell.StyleDefault.Background(tcell.NewHexColor(dot.Color))
42-
w.screen.SetContent(w.CameraX+child.X()*2+dot.X*2, w.Height-w.CameraY-child.Y()-dot.Y-1,' ',nil,st)
43-
w.screen.SetContent(w.CameraX+child.X()*2+dot.X*2+1,w.Height-w.CameraY-child.Y()-dot.Y-1,' ',nil,st)
73+
w.screen.SetContent(w.CameraX*2+child.X()*2+dot.X*2, w.Height-w.CameraY-child.Y()-dot.Y-1, ' ', nil, st)
74+
w.screen.SetContent(w.CameraX*2+child.X()*2+dot.X*2+1, w.Height-w.CameraY-child.Y()-dot.Y-1, ' ', nil, st)
4475
}
45-
}
76+
}

0 commit comments

Comments
 (0)