polish some things

This commit is contained in:
2026-09-07 14:49:25 +02:00
parent a106a26277
commit 96db9ec1f9
5 changed files with 110 additions and 62 deletions
+76 -46
View File
@@ -40,17 +40,19 @@ type Snake struct {
diff time.Duration
isDead bool
hasWon bool
total int
score int
}
const (
START_LENGTH = 20
THICKNESS = 8
MIN_SPEED int64 = 500
MAX_SPEED int64 = 50
MAX_SPRINT int64 = 20
StartLength = 20
Thickness = 10
MinSpeed int64 = 400
MaxSpeed int64 = 50
MaxSprint int64 = 20
EnnemiesCount = 1
)
func InitSnake(width, height int) *Snake {
@@ -60,11 +62,13 @@ func InitSnake(width, height int) *Snake {
return &Snake{
img: img,
speed: MIN_SPEED,
speed: MinSpeed,
direction: Right,
positions: getInitPositions(utils.GetCenter(width, height)),
ennemies: randomEnnemies(width, h, 10),
ennemies: randomEnnemies(width, h, EnnemiesCount),
isDead: false,
total: EnnemiesCount,
score: 0,
}
}
@@ -77,11 +81,6 @@ func (snake *Snake) Render(screen *ebiten.Image, font *text.GoTextFaceSource) {
renderScoreScreen(screen, snake, font)
if snake.isDead {
renderDeadScreen(screen, snake, font)
return
}
snake.img.Fill(colors.LightGray)
for _, ennemy := range snake.ennemies {
@@ -89,8 +88,8 @@ func (snake *Snake) Render(screen *ebiten.Image, font *text.GoTextFaceSource) {
snake.img,
float32(ennemy.X),
float32(ennemy.Y),
THICKNESS,
THICKNESS,
Thickness,
Thickness,
colors.DarkYellow,
true,
)
@@ -101,8 +100,8 @@ func (snake *Snake) Render(screen *ebiten.Image, font *text.GoTextFaceSource) {
snake.img,
float32(point.X),
float32(point.Y),
THICKNESS,
THICKNESS,
Thickness,
Thickness,
color.White,
true,
)
@@ -168,9 +167,11 @@ func (snake *Snake) Eat() {
snake.positions...,
)
if snake.speed > MAX_SPEED {
if snake.speed > MaxSpeed {
snake.speed -= 50
}
snake.score += 1
}
func (snake *Snake) Move() {
@@ -180,7 +181,7 @@ func (snake *Snake) Move() {
var speed int64
if snake.sprint {
speed = MAX_SPRINT
speed = MaxSprint
} else {
speed = snake.speed
}
@@ -215,13 +216,13 @@ func (snake *Snake) getNextPosition() image.Point {
switch snake.direction {
case Up:
nextHead.Y = nextHead.Y - THICKNESS
nextHead.Y = nextHead.Y - Thickness
case Right:
nextHead.X = nextHead.X + THICKNESS
nextHead.X = nextHead.X + Thickness
case Down:
nextHead.Y = nextHead.Y + THICKNESS
nextHead.Y = nextHead.Y + Thickness
case Left:
nextHead.X = nextHead.X - THICKNESS
nextHead.X = nextHead.X - Thickness
}
return nextHead
@@ -237,8 +238,8 @@ func (snake *Snake) Click(game *Game) {
func getInitPositions(center image.Point) []image.Point {
points := []image.Point{}
for i := range START_LENGTH {
points = append(points, image.Point{X: center.X - i*THICKNESS, Y: center.Y})
for i := range StartLength {
points = append(points, image.Point{X: center.X - i*Thickness, Y: center.Y})
}
return points
@@ -247,12 +248,12 @@ func getInitPositions(center image.Point) []image.Point {
func randomEnnemies(width int, height int, count int) []image.Point {
ennemies := []image.Point{}
w := width / THICKNESS
h := height / THICKNESS
w := width / Thickness
h := height / Thickness
for range count {
x := rand.Intn(w) * THICKNESS
y := rand.Intn(h) * THICKNESS
x := rand.Intn(w) * Thickness
y := rand.Intn(h) * Thickness
ennemies = append(ennemies, image.Point{X: x, Y: y})
}
@@ -261,31 +262,18 @@ func randomEnnemies(width int, height int, count int) []image.Point {
}
func renderScoreScreen(screen *ebiten.Image, snake *Snake, font *text.GoTextFaceSource) {
scoreImg := ebiten.NewImage(WINDOW_WIDTH, 100)
scoreImg.Fill(colors.Red)
levelOptions := &text.DrawOptions{}
levelOptions.ColorScale.ScaleWithColor(color.White)
levelOptions.GeoM.Translate(10, 10)
text.Draw(
scoreImg,
"Level 1",
&text.GoTextFace{
Source: font,
Size: 25,
},
levelOptions,
)
scoreImg := ebiten.NewImage(WindowWidth, 50)
scoreImg.Fill(colors.Black)
scoreOptions := &text.DrawOptions{}
scoreOptions.ColorScale.ScaleWithColor(color.White)
scoreOptions.GeoM.Translate(100, 10)
scoreOptions.GeoM.Translate(float64(WindowWidth)-100, 15)
text.Draw(
scoreImg,
fmt.Sprintf("Score: %d/%d", snake.score, snake.total),
&text.GoTextFace{
Source: font,
Size: 25,
Size: 20,
},
scoreOptions,
)
@@ -295,7 +283,49 @@ func renderScoreScreen(screen *ebiten.Image, snake *Snake, font *text.GoTextFace
screen.DrawImage(snake.img, &ebiten.DrawImageOptions{})
}
func renderDeadScreen(screen *ebiten.Image, snake *Snake, font *text.GoTextFaceSource) {
func (snake *Snake) renderWinScreen(screen *ebiten.Image, font *text.GoTextFaceSource) {
snake.img.Fill(colors.Black)
fontOptions := &text.DrawOptions{}
fontOptions.ColorScale.ScaleWithColor(colors.Green)
winImg := ebiten.NewImage(450, 90)
text.Draw(
winImg,
"You won !",
&text.GoTextFace{
Source: font,
Size: 80,
},
fontOptions,
)
deadImgW := winImg.Bounds().Dx()
deadImgH := winImg.Bounds().Dy()
x := float64(screen.Bounds().Dx()/2 - deadImgW/2)
y := float64(screen.Bounds().Dy()/2 - deadImgH/2)
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(x, y)
snake.img.DrawImage(winImg, op)
// ---- return to menu button
returnToMenuButton := buttons.MenuButton{
Value: "return to menu",
Action: buttons.ReturnToMenu,
}
rtmbImg := returnToMenuButton.GetMenuButtonImg(font, 24, true)
rtmOp := &ebiten.DrawImageOptions{}
rtmOp.GeoM.Translate(x, y+100)
snake.img.DrawImage(rtmbImg, rtmOp)
screen.DrawImage(snake.img, &ebiten.DrawImageOptions{})
}
func (snake *Snake) renderDeadScreen(screen *ebiten.Image, font *text.GoTextFaceSource) {
snake.img.Fill(colors.Black)
fontOptions := &text.DrawOptions{}