resolver clipping
This commit is contained in:
parent
e5daf2a7ed
commit
fdacb47681
1 changed files with 75 additions and 33 deletions
108
main.go
108
main.go
|
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
rl "github.com/gen2brain/raylib-go/raylib"
|
rl "github.com/gen2brain/raylib-go/raylib"
|
||||||
)
|
)
|
||||||
|
|
@ -16,11 +17,13 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type game struct {
|
type game struct {
|
||||||
screenWidth int32
|
arenaWidth int32
|
||||||
screenHeight int32
|
arenaHeight int32
|
||||||
|
interfaceWidth int32
|
||||||
time int
|
time int
|
||||||
enemies []*enemy
|
enemies []*enemy
|
||||||
bullets []*bullet
|
bullets []*bullet
|
||||||
|
score int
|
||||||
}
|
}
|
||||||
|
|
||||||
type bullet struct {
|
type bullet struct {
|
||||||
|
|
@ -33,9 +36,11 @@ type bullet struct {
|
||||||
|
|
||||||
type player struct {
|
type player struct {
|
||||||
pos rl.Vector2
|
pos rl.Vector2
|
||||||
|
speed rl.Vector2
|
||||||
moveSpeed float32
|
moveSpeed float32
|
||||||
bulletMoveSpeed float32
|
bulletMoveSpeed float32
|
||||||
hitBoxRadius float32
|
hitBoxRadius float32
|
||||||
|
bulletSize float32
|
||||||
}
|
}
|
||||||
|
|
||||||
type enemy struct {
|
type enemy struct {
|
||||||
|
|
@ -48,7 +53,7 @@ type enemy struct {
|
||||||
|
|
||||||
func (g game) insideArena(v rl.Vector2) bool {
|
func (g game) insideArena(v rl.Vector2) bool {
|
||||||
return v.X >= 0 && v.Y >= 0 &&
|
return v.X >= 0 && v.Y >= 0 &&
|
||||||
v.Y <= float32(g.screenHeight) && v.X <= float32(g.screenWidth)
|
v.Y <= float32(g.arenaHeight) && v.X <= float32(g.arenaWidth)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *game) removeBullet(index int) {
|
func (g *game) removeBullet(index int) {
|
||||||
|
|
@ -71,8 +76,6 @@ func (e *enemy) shoot(g *game) {
|
||||||
if g.time % 15 != 0 {
|
if g.time % 15 != 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
g.bullets = append(g.bullets, &bullet{
|
g.bullets = append(g.bullets, &bullet{
|
||||||
speed: rl.Vector2{X: 0, Y: 10},
|
speed: rl.Vector2{X: 0, Y: 10},
|
||||||
size: 4,
|
size: 4,
|
||||||
|
|
@ -148,13 +151,17 @@ func (g *game) killEnemy(index int) {
|
||||||
|
|
||||||
func (e *enemy) update(g *game, index int) {
|
func (e *enemy) update(g *game, index int) {
|
||||||
|
|
||||||
|
enemyColor := rl.Blue
|
||||||
|
|
||||||
if e.movePattern != nil {
|
if e.movePattern != nil {
|
||||||
e.pos = e.movePattern(e)
|
e.pos = e.movePattern(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
if hit, bullet, idx := e.checkHit(g); hit {
|
if hit, bullet, idx := e.checkHit(g); hit {
|
||||||
|
g.score += 273
|
||||||
e.health -= bullet.dmg
|
e.health -= bullet.dmg
|
||||||
g.removeBullet(idx)
|
g.removeBullet(idx)
|
||||||
|
enemyColor = rl.White
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.health <= 0 {
|
if e.health <= 0 {
|
||||||
|
|
@ -164,30 +171,54 @@ func (e *enemy) update(g *game, index int) {
|
||||||
|
|
||||||
e.shoot(g)
|
e.shoot(g)
|
||||||
|
|
||||||
rl.DrawCircleV(e.pos, 5, rl.Blue)
|
rl.DrawCircleV(e.pos, e.hitBoxRadius, enemyColor)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *player) move() {
|
func (p *player) move(g *game) {
|
||||||
if rl.IsKeyDown(rl.KeyW) { p.pos.Y -= p.moveSpeed }
|
p.speed = rl.Vector2{X: 0, Y: 0}
|
||||||
if rl.IsKeyDown(rl.KeyS) { p.pos.Y += p.moveSpeed }
|
|
||||||
if rl.IsKeyDown(rl.KeyA) { p.pos.X -= p.moveSpeed }
|
if rl.IsKeyDown(rl.KeyW) { p.speed.Y -= 1 }
|
||||||
if rl.IsKeyDown(rl.KeyD) { p.pos.X += p.moveSpeed }
|
if rl.IsKeyDown(rl.KeyS) { p.speed.Y += 1 }
|
||||||
|
if rl.IsKeyDown(rl.KeyA) { p.speed.X -= 1 }
|
||||||
|
if rl.IsKeyDown(rl.KeyD) { p.speed.X += 1 }
|
||||||
|
|
||||||
|
if !(p.speed.X == 0 && p.speed.Y == 0) {
|
||||||
|
// jogador se move mais rapido na diagonal caso o contrario
|
||||||
|
p.speed = rl.Vector2Normalize(p.speed)
|
||||||
|
p.speed = rl.Vector2Scale(p.speed, p.moveSpeed)
|
||||||
|
}
|
||||||
|
|
||||||
|
result := rl.Vector2Add(p.pos, p.speed)
|
||||||
|
|
||||||
|
if result.Y - p.hitBoxRadius < 0 ||
|
||||||
|
result.Y + p.hitBoxRadius > float32(g.arenaHeight) {
|
||||||
|
p.speed.Y = 0
|
||||||
|
}
|
||||||
|
if result.X - p.hitBoxRadius < 0 ||
|
||||||
|
result.X + p.hitBoxRadius > float32(g.arenaWidth) {
|
||||||
|
p.speed.X = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
p.pos = rl.Vector2Add(p.pos, p.speed)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *player) shoot(g *game){
|
func (p *player) shoot(g *game){
|
||||||
if g.time % 10 != 0 {
|
if g.time % 5 != 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if rl.IsMouseButtonDown(rl.MouseLeftButton) {
|
if rl.IsMouseButtonDown(rl.MouseLeftButton) {
|
||||||
// não leva em consideração a velocidade do jogador
|
// (mal) leva em consideração a velocidade do jogador
|
||||||
mouse := rl.GetMousePosition()
|
mouse := rl.GetMousePosition()
|
||||||
direction := rl.Vector2Subtract(mouse, p.pos)
|
direction := rl.Vector2Subtract(mouse, p.pos)
|
||||||
|
direction = rl.Vector2Add(direction, p.speed)
|
||||||
direction = rl.Vector2Normalize(direction)
|
direction = rl.Vector2Normalize(direction)
|
||||||
|
direction = rl.Vector2Scale(direction, p.bulletMoveSpeed)
|
||||||
|
|
||||||
g.bullets = append(g.bullets, &bullet{
|
g.bullets = append(g.bullets, &bullet{
|
||||||
pos: p.pos,
|
pos: p.pos,
|
||||||
size: 2,
|
size: p.bulletSize,
|
||||||
speed: rl.Vector2Scale(direction, p.bulletMoveSpeed),
|
speed: direction,
|
||||||
dmg: 1,
|
dmg: 1,
|
||||||
enemy: false,
|
enemy: false,
|
||||||
})
|
})
|
||||||
|
|
@ -210,7 +241,7 @@ func (p *player) checkHit(g *game) {
|
||||||
|
|
||||||
func (p *player) update(g *game) {
|
func (p *player) update(g *game) {
|
||||||
|
|
||||||
p.move()
|
p.move(g)
|
||||||
|
|
||||||
p.shoot(g)
|
p.shoot(g)
|
||||||
|
|
||||||
|
|
@ -231,56 +262,60 @@ func (p *player) update(g *game) {
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
state := &game{screenWidth: 450, screenHeight: 700}
|
state := &game{arenaWidth: 450, arenaHeight: 700, interfaceWidth: 300}
|
||||||
|
|
||||||
player := player{
|
player := player{
|
||||||
pos: rl.Vector2{X: 100, Y: 100},
|
pos: rl.Vector2{X: 100, Y: 100},
|
||||||
moveSpeed: 4,
|
moveSpeed: 4,
|
||||||
bulletMoveSpeed: 8,
|
bulletMoveSpeed: 13,
|
||||||
|
bulletSize: 8,
|
||||||
hitBoxRadius: 5,
|
hitBoxRadius: 5,
|
||||||
}
|
}
|
||||||
|
|
||||||
rl.SetTraceLog(rl.LogWarning | rl.LogDebug)
|
rl.SetTraceLog(rl.LogWarning | rl.LogDebug)
|
||||||
rl.InitWindow(state.screenWidth, state.screenHeight, "danmaku")
|
rl.InitWindow(state.arenaWidth + state.interfaceWidth, state.arenaHeight, "danmaku")
|
||||||
rl.SetTargetFPS(60)
|
rl.SetTargetFPS(60)
|
||||||
|
|
||||||
state.enemies = []*enemy{
|
state.enemies = []*enemy{
|
||||||
{
|
{
|
||||||
pos: rl.Vector2{X: 200, Y: 200},
|
pos: rl.Vector2{X: 200, Y: 200},
|
||||||
health: 1,
|
health: 10,
|
||||||
hitBoxRadius: 5,
|
hitBoxRadius: 10,
|
||||||
movePattern: horizonalPattern(state),
|
movePattern: horizonalPattern(state),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: rl.Vector2{X: 169, Y: 222},
|
pos: rl.Vector2{X: 169, Y: 222},
|
||||||
health: 1,
|
health: 10,
|
||||||
hitBoxRadius:5,
|
hitBoxRadius:10,
|
||||||
movePattern: horizonalPattern(state),
|
movePattern: horizonalPattern(state),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: rl.Vector2{X: 400, Y: 400},
|
pos: rl.Vector2{X: 400, Y: 400},
|
||||||
health: 1,
|
health: 10,
|
||||||
hitBoxRadius:5,
|
hitBoxRadius:10,
|
||||||
// movePattern: circlePattern(state, rl.Vector2{X: 200, Y: 200}),
|
// movePattern: circlePattern(state, rl.Vector2{X: 200, Y: 200}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pos: rl.Vector2{X: 200, Y: 200},
|
pos: rl.Vector2{X: 200, Y: 200},
|
||||||
health: 1,
|
health: 10,
|
||||||
hitBoxRadius:5,
|
hitBoxRadius:10,
|
||||||
// movePattern: circlePattern(state, rl.Vector2{X: 200, Y: 200}),
|
// movePattern: circlePattern(state, rl.Vector2{X: 200, Y: 200}),
|
||||||
}}
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
currectScore := 0
|
||||||
|
|
||||||
for ; !rl.WindowShouldClose(); state.time += 1 {
|
for ; !rl.WindowShouldClose(); state.time += 1 {
|
||||||
rl.BeginDrawing()
|
rl.BeginDrawing()
|
||||||
rl.ClearBackground(rl.Black)
|
rl.ClearBackground(rl.Black)
|
||||||
|
|
||||||
rl.DrawText("danmaku", 20, 20, 20, rl.DarkGray)
|
rl.DrawText("danmaku babe bullet shoot shoot", 20, 20, 20, rl.DarkGray)
|
||||||
rl.DrawLine(18, 42, state.screenWidth-18, 42, rl.Black)
|
rl.DrawLine(18, 42, state.arenaWidth-18, 42, rl.Black)
|
||||||
rl.DrawFPS(0, 0)
|
rl.DrawFPS(0, 0)
|
||||||
|
|
||||||
player.update(state)
|
player.update(state)
|
||||||
|
|
||||||
for i := range state.enemies {
|
for i := 0; i < len(state.enemies); i++ {
|
||||||
state.enemies[i].update(state, i)
|
state.enemies[i].update(state, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -288,6 +323,13 @@ func main() {
|
||||||
state.bullets[i].update(state, i)
|
state.bullets[i].update(state, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rl.DrawRectangle(
|
||||||
|
state.arenaWidth, 0, state.interfaceWidth, state.arenaHeight,
|
||||||
|
rl.NewColor(0, 33, 59, 255),
|
||||||
|
)
|
||||||
|
currectScore += (state.score - currectScore) / 11
|
||||||
|
rl.DrawText(strconv.Itoa(currectScore), state.arenaWidth, 0, 50, rl.White)
|
||||||
|
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue