poder slow motion

This commit is contained in:
silva guimaraes 2023-07-24 14:03:30 -03:00
parent c90fd3d14a
commit 8159246e2c

110
main.go
View file

@ -23,10 +23,11 @@ type game struct {
arenaWidth int32 arenaWidth int32
arenaHeight int32 arenaHeight int32
interfaceWidth int32 interfaceWidth int32
frame int frame float32
enemies []*enemy enemies []*enemy
bullets []*bullet bullets []*bullet
score int score int
gameSpeed float32 // 1 = velocidade normal
} }
type bullet struct { type bullet struct {
@ -67,7 +68,7 @@ func (g *game) removeBullet(index int) {
} }
func (b *bullet) update(g *game, index int) { func (b *bullet) update(g *game, index int) {
b.pos = rl.Vector2Add(b.pos, b.speed) b.pos = rl.Vector2Add(b.pos, rl.Vector2Scale(b.speed, g.gameSpeed))
if !g.insideArena(b.pos) { if !g.insideArena(b.pos) {
g.removeBullet(index) g.removeBullet(index)
@ -79,7 +80,7 @@ func (b *bullet) update(g *game, index int) {
func bulletExplosion(g *game, rate, amount int, bulletSpeed, size float32) shootingPattern { func bulletExplosion(g *game, rate, amount int, bulletSpeed, size float32) shootingPattern {
return func(e *enemy) { return func(e *enemy) {
if g.frame % rate != 0 { if int(g.frame) % rate != 0 {
return return
} }
@ -110,7 +111,7 @@ func bulletExplosion(g *game, rate, amount int, bulletSpeed, size float32) shoot
func ShootAtPlayer(g *game, p *player, rate int, func ShootAtPlayer(g *game, p *player, rate int,
bulletMoveSpeed float32) shootingPattern { bulletMoveSpeed float32) shootingPattern {
return func(e *enemy) { return func(e *enemy) {
if g.frame % rate != 0 { if int(g.frame) % rate != 0 {
return return
} }
direction := rl.Vector2Subtract(p.pos, e.pos) direction := rl.Vector2Subtract(p.pos, e.pos)
@ -131,7 +132,7 @@ func burstShootAtPlayer(g *game, p *player,
rate int, bulletMoveSpeed float32) shootingPattern { rate int, bulletMoveSpeed float32) shootingPattern {
flag := true flag := true
return func(e *enemy) { return func(e *enemy) {
if g.frame % 100 == 0 { if int(g.frame) % 100 == 0 {
flag = !flag flag = !flag
} }
@ -139,7 +140,7 @@ rate int, bulletMoveSpeed float32) shootingPattern {
return return
} }
if g.frame % rate != 0 { if int(g.frame) % rate != 0 {
return return
} }
@ -159,7 +160,7 @@ rate int, bulletMoveSpeed float32) shootingPattern {
func shootStraightDown(g *game) shootingPattern { func shootStraightDown(g *game) shootingPattern {
return func(e *enemy) { return func(e *enemy) {
if g.frame % 10 != 0 { if int(g.frame) % 10 != 0 {
return return
} }
g.bullets = append(g.bullets, &bullet{ g.bullets = append(g.bullets, &bullet{
@ -175,7 +176,7 @@ func shootStraightDown(g *game) shootingPattern {
func shootStill() movementPattern { func shootStill() movementPattern {
return func(e *enemy) rl.Vector2 { return func(e *enemy) rl.Vector2 {
e.shoot(e) e.shoot(e)
return e.pos return rl.Vector2{X: 0, Y: 0}
} }
} }
@ -183,56 +184,52 @@ func horizonalPattern(g *game) movementPattern {
direction := rl.Vector2{X: 4, Y: 0} direction := rl.Vector2{X: 4, Y: 0}
return func(e *enemy) rl.Vector2 { return func(e *enemy) rl.Vector2 {
result := rl.Vector2Add(direction, e.pos)
e.shoot(e) e.shoot(e)
result := rl.Vector2Add(direction, e.pos)
if !g.insideArena(result) { if !g.insideArena(result) {
direction = rl.Vector2Negate(direction) direction = rl.Vector2Negate(direction)
} }
return result return direction
} }
} }
// func aimPlayerPattern(g *game, p *player) movementPattern { // func foobarPattern(g *game) movementPattern {
//
// pos := rl.Vector2{}
// state := 0
// wait := 0
//
// return func(e *enemy) rl.Vector2 {
//
// switch state {
// case 0: // init
// pos.X = e.pos.X
// state = 1
// return pos
// case 1: // descer
// pos.Y += 1
// if pos.Y >= 100 { state = 2; wait = 50 }
// return pos
// case 2: // atirar por um tempo
// e.shoot(e)
// wait -= 1
// if wait <= 0 { state = 3; wait = 60 }
// return pos
// case 3: // wait
// wait -= 1
// if wait <= 0 { state = 4 }
// return pos
// case 4: // retornar
// pos.Y -= 3
// if pos.Y - e.hitBoxRadius < 0 {
// e.health = 0
// }
// return pos
// }
// panic(state)
// }
// } // }
func foobarPattern(g *game) movementPattern {
pos := rl.Vector2{}
state := 0
wait := 0
return func(e *enemy) rl.Vector2 {
switch state {
case 0: // init
pos.X = e.pos.X
state = 1
return pos
case 1: // descer
pos.Y += 1
if pos.Y >= 100 { state = 2; wait = 50 }
return pos
case 2: // atirar por um tempo
e.shoot(e)
wait -= 1
if wait <= 0 { state = 3; wait = 60 }
return pos
case 3: // wait
wait -= 1
if wait <= 0 { state = 4 }
return pos
case 4: // retornar
pos.Y -= 3
if pos.Y - e.hitBoxRadius < 0 {
e.health = 0
}
return pos
}
panic(state)
}
}
func (e *enemy) checkHit(g *game) (bool, *bullet, int) { func (e *enemy) checkHit(g *game) (bool, *bullet, int) {
for index, bullet := range g.bullets { for index, bullet := range g.bullets {
@ -261,7 +258,8 @@ func (e *enemy) update(g *game, index int) {
enemyColor := rl.Blue enemyColor := rl.Blue
if e.move != nil { if e.move != nil {
e.pos = e.move(e) e.pos = rl.Vector2Add(rl.Vector2Scale(e.move(e), g.gameSpeed), e.pos)
// e.pos = e.move(e)
} }
if hit, bullet, idx := e.checkHit(g); hit { if hit, bullet, idx := e.checkHit(g); hit {
@ -320,7 +318,7 @@ func (p *player) shoot(g *game){
return return
} }
if g.frame % 3 != 0 { if int(g.frame) % 3 != 0 {
return return
} }
@ -392,7 +390,7 @@ func (p *player) update(g *game) {
func main() { func main() {
state := &game{arenaWidth: 450, arenaHeight: 700, interfaceWidth: 300} state := &game{arenaWidth: 450, arenaHeight: 700, interfaceWidth: 300, gameSpeed: 1}
player := player{ player := player{
pos: rl.Vector2{ pos: rl.Vector2{
@ -436,7 +434,7 @@ func main() {
currectScore := 0 currectScore := 0
for ; !rl.WindowShouldClose(); state.frame += 1 { for ; !rl.WindowShouldClose(); state.frame += state.gameSpeed {
rl.BeginDrawing() rl.BeginDrawing()
rl.ClearBackground(rl.Black) rl.ClearBackground(rl.Black)
@ -463,6 +461,12 @@ func main() {
rl.DrawText(strconv.Itoa(len(state.bullets)), state.arenaWidth, 50, 50, rl.White) rl.DrawText(strconv.Itoa(len(state.bullets)), state.arenaWidth, 50, 50, rl.White)
if player.focusMode {
state.gameSpeed = 0.3
} else {
state.gameSpeed = 1
}
rl.EndDrawing() rl.EndDrawing()
} }