THE GAME WORKS
This commit is contained in:
parent
146573f56c
commit
f3b7713a87
115
screen_main.go
115
screen_main.go
@ -49,8 +49,8 @@ func (screen *mainScreen) handleKeyPress(event termbox.Event) int {
|
|||||||
} else if selOpt.GetText() == "Resume" {
|
} else if selOpt.GetText() == "Resume" {
|
||||||
screen.GameMode = modeRun
|
screen.GameMode = modeRun
|
||||||
} else if selOpt.GetText() == "Restart" {
|
} else if selOpt.GetText() == "Restart" {
|
||||||
//screen.GameMode = modeInit
|
screen.GameMode = modeInit
|
||||||
//return titleScreenIndex
|
return titleScreenIndex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,13 +64,9 @@ func (screen *mainScreen) handleKeyPress(event termbox.Event) int {
|
|||||||
screen.animating = true
|
screen.animating = true
|
||||||
screen.GameMode = modeRun
|
screen.GameMode = modeRun
|
||||||
} else if event.Key == termbox.KeyArrowLeft || event.Ch == 'a' {
|
} else if event.Key == termbox.KeyArrowLeft || event.Ch == 'a' {
|
||||||
if p.projAngle < 180 {
|
p.projAngle--
|
||||||
p.projAngle++
|
|
||||||
}
|
|
||||||
} else if event.Key == termbox.KeyArrowRight || event.Ch == 'd' {
|
} else if event.Key == termbox.KeyArrowRight || event.Ch == 'd' {
|
||||||
if p.projAngle > 0 {
|
p.projAngle++
|
||||||
p.projAngle--
|
|
||||||
}
|
|
||||||
} else if event.Key == termbox.KeyArrowUp || event.Ch == 'w' {
|
} else if event.Key == termbox.KeyArrowUp || event.Ch == 'w' {
|
||||||
p.projSpeed++
|
p.projSpeed++
|
||||||
} else if event.Key == termbox.KeyArrowDown || event.Ch == 's' {
|
} else if event.Key == termbox.KeyArrowDown || event.Ch == 's' {
|
||||||
@ -88,11 +84,11 @@ func (screen *mainScreen) performLayout(style style) {
|
|||||||
b := projectile{gravity: screen.gravity}
|
b := projectile{gravity: screen.gravity}
|
||||||
screen.Bullet = &b
|
screen.Bullet = &b
|
||||||
// TODO: Reset Buildings
|
// TODO: Reset Buildings
|
||||||
//screen.Buildings = []building{}
|
screen.Buildings = []building{}
|
||||||
// Create a random seed (from time)
|
// Create a random seed (from time)
|
||||||
seed := fmt.Sprintf("%d", time.Now().UnixNano())
|
seed := fmt.Sprintf("%d", time.Now().UnixNano())
|
||||||
screen.r = rand.New(rand.NewSource(getSeedFromString(seed + "-world")))
|
screen.r = rand.New(rand.NewSource(getSeedFromString(seed + "-world")))
|
||||||
screen.PlayerTurn = screen.r.Intn(1) + 1
|
screen.PlayerTurn = (screen.r.Int() % 2) + 1
|
||||||
for bldCity < ScreenWidth {
|
for bldCity < ScreenWidth {
|
||||||
w := screen.r.Intn(8) + 6
|
w := screen.r.Intn(8) + 6
|
||||||
h := screen.r.Intn(ScreenHeight-10) + 2
|
h := screen.r.Intn(ScreenHeight-10) + 2
|
||||||
@ -116,6 +112,7 @@ func (screen *mainScreen) performLayout(style style) {
|
|||||||
bld := screen.r.Intn(len(screen.Buildings) / 3)
|
bld := screen.r.Intn(len(screen.Buildings) / 3)
|
||||||
p1x, p1y := screen.getRndPosForBuilding(bld)
|
p1x, p1y := screen.getRndPosForBuilding(bld)
|
||||||
screen.Player1 = createPlayer(p1x, p1y)
|
screen.Player1 = createPlayer(p1x, p1y)
|
||||||
|
screen.Player1.gravity = screen.gravity
|
||||||
|
|
||||||
// Player 2 should be on the third 1/3 of the buildings
|
// Player 2 should be on the third 1/3 of the buildings
|
||||||
bld = screen.r.Intn(len(screen.Buildings)/3) + ((len(screen.Buildings) * 2) / 3)
|
bld = screen.r.Intn(len(screen.Buildings)/3) + ((len(screen.Buildings) * 2) / 3)
|
||||||
@ -124,7 +121,8 @@ func (screen *mainScreen) performLayout(style style) {
|
|||||||
p2x, p2y = screen.getRndPosForBuilding(bld - 1)
|
p2x, p2y = screen.getRndPosForBuilding(bld - 1)
|
||||||
}
|
}
|
||||||
screen.Player2 = createPlayer(p2x, p2y)
|
screen.Player2 = createPlayer(p2x, p2y)
|
||||||
screen.Player2.projAngle = 135
|
screen.Player2.projAngle = 225
|
||||||
|
screen.Player2.gravity = screen.gravity
|
||||||
|
|
||||||
screen.PauseMenu = termboxUtil.CreateMenu("** GOPHER BATTLE **",
|
screen.PauseMenu = termboxUtil.CreateMenu("** GOPHER BATTLE **",
|
||||||
[]string{"Resume", "Restart", "Exit"},
|
[]string{"Resume", "Restart", "Exit"},
|
||||||
@ -136,7 +134,13 @@ func (screen *mainScreen) performLayout(style style) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createPlayer(px, py int) *player {
|
func createPlayer(px, py int) *player {
|
||||||
p := player{x: px, y: py, projSpeed: 10, projAngle: 45, baseColor: termbox.ColorCyan}
|
p := player{
|
||||||
|
x: px,
|
||||||
|
y: py,
|
||||||
|
projSpeed: 10,
|
||||||
|
projAngle: 315,
|
||||||
|
baseColor: termbox.ColorCyan,
|
||||||
|
}
|
||||||
return &p
|
return &p
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,8 +150,12 @@ func (screen *mainScreen) update() {
|
|||||||
if !screen.animating {
|
if !screen.animating {
|
||||||
if screen.PlayerTurn == 1 {
|
if screen.PlayerTurn == 1 {
|
||||||
screen.PlayerTurn = 2
|
screen.PlayerTurn = 2
|
||||||
|
screen.Player1.turn = false
|
||||||
|
screen.Player2.turn = true
|
||||||
} else {
|
} else {
|
||||||
screen.PlayerTurn = 1
|
screen.PlayerTurn = 1
|
||||||
|
screen.Player1.turn = true
|
||||||
|
screen.Player2.turn = false
|
||||||
}
|
}
|
||||||
screen.GameMode = modeRunInput
|
screen.GameMode = modeRunInput
|
||||||
} else {
|
} else {
|
||||||
@ -155,6 +163,7 @@ func (screen *mainScreen) update() {
|
|||||||
screen.Bullet.update()
|
screen.Bullet.update()
|
||||||
// Check for collisions
|
// Check for collisions
|
||||||
if screen.Player1.didCollide(screen.Bullet) {
|
if screen.Player1.didCollide(screen.Bullet) {
|
||||||
|
screen.Player1.dead = true
|
||||||
screen.PauseMenu.SetOptionDisabled(0)
|
screen.PauseMenu.SetOptionDisabled(0)
|
||||||
if screen.PlayerTurn == 1 {
|
if screen.PlayerTurn == 1 {
|
||||||
// Self kill
|
// Self kill
|
||||||
@ -166,6 +175,7 @@ func (screen *mainScreen) update() {
|
|||||||
screen.GameMode = modePause
|
screen.GameMode = modePause
|
||||||
}
|
}
|
||||||
if screen.Player2.didCollide(screen.Bullet) {
|
if screen.Player2.didCollide(screen.Bullet) {
|
||||||
|
screen.Player2.dead = true
|
||||||
screen.PauseMenu.SetOptionDisabled(0)
|
screen.PauseMenu.SetOptionDisabled(0)
|
||||||
if screen.PlayerTurn == 2 {
|
if screen.PlayerTurn == 2 {
|
||||||
// Self kill
|
// Self kill
|
||||||
@ -276,7 +286,7 @@ func (p *projectile) update() {
|
|||||||
tm := time.Since(p.launchTime).Seconds()
|
tm := time.Since(p.launchTime).Seconds()
|
||||||
useSpeed := float64(p.speed)
|
useSpeed := float64(p.speed)
|
||||||
useX, useY := float64(p.startX), float64(p.startY)
|
useX, useY := float64(p.startX), float64(p.startY)
|
||||||
useA := float64(p.angle)
|
useA := degToRad(p.angle)
|
||||||
p.x = int(useX + (useSpeed * math.Cos(useA) * tm))
|
p.x = int(useX + (useSpeed * math.Cos(useA) * tm))
|
||||||
p.y = int(useY + (useSpeed*math.Sin(useA)*tm - p.gravity*tm*tm/2))
|
p.y = int(useY + (useSpeed*math.Sin(useA)*tm - p.gravity*tm*tm/2))
|
||||||
WriteToLog(fmt.Sprintf("%f - S:%d; (%d,%d)=>(%d,%d)\n", useA, p.speed, p.startX, p.startY, p.x, p.y))
|
WriteToLog(fmt.Sprintf("%f - S:%d; (%d,%d)=>(%d,%d)\n", useA, p.speed, p.startX, p.startY, p.x, p.y))
|
||||||
@ -290,7 +300,10 @@ type player struct {
|
|||||||
x, y int
|
x, y int
|
||||||
projSpeed int
|
projSpeed int
|
||||||
projAngle int
|
projAngle int
|
||||||
|
gravity float64
|
||||||
baseColor termbox.Attribute
|
baseColor termbox.Attribute
|
||||||
|
turn bool
|
||||||
|
dead bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *player) draw() {
|
func (p *player) draw() {
|
||||||
@ -301,10 +314,15 @@ func (p *player) draw() {
|
|||||||
termbox.SetCell(p.x+4, p.y-4, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x+4, p.y-4, ' ', p.baseColor, p.baseColor)
|
||||||
|
|
||||||
termbox.SetCell(p.x, p.y-3, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x, p.y-3, ' ', p.baseColor, p.baseColor)
|
||||||
termbox.SetCell(p.x+1, p.y-3, '@', termbox.ColorBlack, termbox.ColorWhite)
|
|
||||||
termbox.SetCell(p.x+2, p.y-3, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x+2, p.y-3, ' ', p.baseColor, p.baseColor)
|
||||||
termbox.SetCell(p.x+3, p.y-3, '@', termbox.ColorBlack, termbox.ColorWhite)
|
|
||||||
termbox.SetCell(p.x+4, p.y-3, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x+4, p.y-3, ' ', p.baseColor, p.baseColor)
|
||||||
|
if p.dead {
|
||||||
|
termbox.SetCell(p.x+1, p.y-3, 'X', termbox.ColorRed, termbox.ColorBlack)
|
||||||
|
termbox.SetCell(p.x+3, p.y-3, 'X', termbox.ColorRed, termbox.ColorBlack)
|
||||||
|
} else {
|
||||||
|
termbox.SetCell(p.x+1, p.y-3, '@', termbox.ColorBlack, termbox.ColorWhite)
|
||||||
|
termbox.SetCell(p.x+3, p.y-3, '@', termbox.ColorBlack, termbox.ColorWhite)
|
||||||
|
}
|
||||||
|
|
||||||
termbox.SetCell(p.x, p.y-2, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x, p.y-2, ' ', p.baseColor, p.baseColor)
|
||||||
termbox.SetCell(p.x+1, p.y-2, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x+1, p.y-2, ' ', p.baseColor, p.baseColor)
|
||||||
@ -325,8 +343,10 @@ func (p *player) draw() {
|
|||||||
termbox.SetCell(p.x+4, p.y, ' ', p.baseColor, p.baseColor)
|
termbox.SetCell(p.x+4, p.y, ' ', p.baseColor, p.baseColor)
|
||||||
|
|
||||||
// Now draw the arms
|
// Now draw the arms
|
||||||
bulletHandX, bulletHandY := p.GetBulletHandPos()
|
if p.turn {
|
||||||
termbox.SetCell(bulletHandX, bulletHandY, 'O', termbox.ColorBlack, p.baseColor)
|
bulletHandX, bulletHandY := p.GetBulletHandPos()
|
||||||
|
termbox.SetCell(bulletHandX, bulletHandY, '+', termbox.ColorBlack, p.baseColor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *player) didCollide(pr *projectile) bool {
|
func (p *player) didCollide(pr *projectile) bool {
|
||||||
@ -339,32 +359,41 @@ func (p *player) didCollide(pr *projectile) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *player) GetBulletHandPos() (int, int) {
|
func (p *player) GetBulletHandPos() (int, int) {
|
||||||
if p.projAngle <= 11 {
|
tm := 0.5
|
||||||
return p.x + 5, p.y - 2
|
useSpeed := float64(p.projSpeed)
|
||||||
} else if p.projAngle <= 22 {
|
useX, useY := float64(p.x+2), float64(p.y-2)
|
||||||
return p.x + 5, p.y - 3
|
useA := degToRad(p.projAngle)
|
||||||
} else if p.projAngle <= 41 {
|
retX := int(useX + (useSpeed * math.Cos(useA) * tm))
|
||||||
return p.x + 5, p.y - 4
|
retY := int(useY + (useSpeed*math.Sin(useA)*tm - p.gravity*tm*tm/2))
|
||||||
} else if p.projAngle <= 50 {
|
return retX, retY
|
||||||
return p.x + 5, p.y - 5
|
/*
|
||||||
} else if p.projAngle <= 77 {
|
if p.projAngle <= 11 {
|
||||||
return p.x + 4, p.y - 5
|
return p.x + 5, p.y - 2
|
||||||
} else if p.projAngle <= 86 {
|
} else if p.projAngle <= 22 {
|
||||||
return p.x + 3, p.y - 5
|
return p.x + 5, p.y - 3
|
||||||
} else if p.projAngle <= 95 {
|
} else if p.projAngle <= 41 {
|
||||||
return p.x + 2, p.y - 5
|
return p.x + 5, p.y - 4
|
||||||
} else if p.projAngle <= 119 {
|
} else if p.projAngle <= 50 {
|
||||||
return p.x + 1, p.y - 5
|
return p.x + 5, p.y - 5
|
||||||
} else if p.projAngle <= 130 {
|
} else if p.projAngle <= 77 {
|
||||||
return p.x, p.y - 5
|
return p.x + 4, p.y - 5
|
||||||
} else if p.projAngle <= 141 {
|
} else if p.projAngle <= 86 {
|
||||||
return p.x - 1, p.y - 5
|
return p.x + 3, p.y - 5
|
||||||
} else if p.projAngle <= 152 {
|
} else if p.projAngle <= 95 {
|
||||||
return p.x - 1, p.y - 4
|
return p.x + 2, p.y - 5
|
||||||
} else if p.projAngle <= 165 {
|
} else if p.projAngle <= 119 {
|
||||||
return p.x - 1, p.y - 3
|
return p.x + 1, p.y - 5
|
||||||
}
|
} else if p.projAngle <= 130 {
|
||||||
return p.x - 1, p.y - 2
|
return p.x, p.y - 5
|
||||||
|
} else if p.projAngle <= 141 {
|
||||||
|
return p.x - 1, p.y - 5
|
||||||
|
} else if p.projAngle <= 152 {
|
||||||
|
return p.x - 1, p.y - 4
|
||||||
|
} else if p.projAngle <= 165 {
|
||||||
|
return p.x - 1, p.y - 3
|
||||||
|
}
|
||||||
|
return p.x - 1, p.y - 2
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
type building struct {
|
type building struct {
|
||||||
|
@ -34,12 +34,21 @@ func (screen *titleScreen) handleKeyPress(event termbox.Event) int {
|
|||||||
func (screen *titleScreen) performLayout(style style) {
|
func (screen *titleScreen) performLayout(style style) {
|
||||||
if !screen.initialized {
|
if !screen.initialized {
|
||||||
var tmplt []string
|
var tmplt []string
|
||||||
tmplt = append(tmplt, " ")
|
if ScreenWidth >= 87 {
|
||||||
tmplt = append(tmplt, " ")
|
tmplt = append(tmplt, " ________ .__ __________ __ __ .__ ")
|
||||||
tmplt = append(tmplt, " gopher.bas ")
|
tmplt = append(tmplt, " / _____/ ____ ______ | |__ ___________ \\______ _____ _/ |__/ |_| | ____ ")
|
||||||
tmplt = append(tmplt, " ")
|
tmplt = append(tmplt, "/ \\ ___ / _ \\\\____ \\| | \\_/ __ \\_ __ \\ | | _\\__ \\\\ __\\ __| | _/ __ \\ ")
|
||||||
tmplt = append(tmplt, " ")
|
tmplt = append(tmplt, "\\ \\_\\ ( <_> | |_> | Y \\ ___/| | \\/ | | \\/ __ \\| | | | | |_\\ ___/ ")
|
||||||
tmplt = append(tmplt, " ")
|
tmplt = append(tmplt, " \\______ /\\____/| __/|___| /\\___ |__| |______ (____ |__| |__| |____/\\___ >")
|
||||||
|
tmplt = append(tmplt, " \\/ |__| \\/ \\/ \\/ \\/ \\/ ")
|
||||||
|
} else {
|
||||||
|
tmplt = append(tmplt, " ")
|
||||||
|
tmplt = append(tmplt, " ")
|
||||||
|
tmplt = append(tmplt, " Gopher Battle ")
|
||||||
|
tmplt = append(tmplt, " ")
|
||||||
|
tmplt = append(tmplt, " ")
|
||||||
|
tmplt = append(tmplt, " ")
|
||||||
|
}
|
||||||
|
|
||||||
defaultFg := style.defaultFg
|
defaultFg := style.defaultFg
|
||||||
defaultBg := style.defaultBg
|
defaultBg := style.defaultBg
|
||||||
|
Loading…
Reference in New Issue
Block a user