Repo: https://github.com/umarquez/0ms2-game
DÃa 1.
Decidà empezar con este reto aprovechando que he estado trabajando en este prototipo, aún no tiene una dinámica u objetivo, solo es un astronauta que gira y se impulsa para navegar a través del espacio.
Herramientas
- Lenguaje: Golang
- Motor: Ebiten
- Editor de sprites: Asprite
- IDE: Jetbraings - Goland
Retos
Fondo de estrellas
Para la construcción del fondo decidà crear las imágenes que lo componen en tiempo real, para esto genero números aleatorios para ubicar la posición de cada estrella y a continuación coloreo el pixel de esa posición.
func NewTile(origin, position vec2.T) *Tile {
op := ebiten.DrawImageOptions{}
op.GeoM.Translate(float64(position[0]), float64(position[1]))
max := copyVector(origin)
max.Add(&vec2.T{
windowWidth,
windowHeight,
})
tile := Tile{
startingPoint: &origin,
position: &position,
op: &op,
}
log.WithFields(map[string]interface{}{
"starting_point": tile.startingPoint,
"position": tile.position,
}).Debugf("new tile")
tile.img, _ = ebiten.NewImage(windowWidth, windowHeight, ebiten.FilterNearest)
for v := float64(windowWidth*windowHeight) * starsProportion; v > 0; v-- {
tile.img.Set(rand.Intn(windowWidth), rand.Intn(windowHeight), color.White)
}
return &tile
}
Todo el tiempo el juego estará monitoreando la posición del jugador dentro de las imágenes disponibles, a partir de la posición del jugador se localizan las imágenes superiores laterales y la imagen frontal, si estas no existen aún, el juego las generará y agregará al mosaico de estrellas, si en algún momento una imagen supera el área visible esta será eliminada del mosaico y por lo tanto no se dibujará.
Boceto
Control del personaje
El jugador debe controlar de alguna manera al personaje, de momento decidà utilizar el teclado, asignando las siguientes funciones a cada tecla:
- Tecla ◀ - Rota 45° a la izquierda
- Tecla ▶ - Rota 45° a la derecha
- Tecla [ espacio ] - Propulsión
func (j0hn *J0hn) Update(_ *ebiten.Image, delta int64) {
j0hn.timeAcumulator += delta
if j0hn.timeAcumulator >= playerTick {
j0hn.timeAcumulator = 0
var direction = 0.0
if ebiten.IsKeyPressed(ebiten.KeyLeft) {
direction = 1
j0hn.rotation = -(45 * math.Pi) / 180
j0hn.position = j0hn.leftPosition
} else if ebiten.IsKeyPressed(ebiten.KeyRight) {
direction = -1
j0hn.rotation = (45 * math.Pi) / 180
j0hn.position = j0hn.rightPosition
} else {
j0hn.position = j0hn.upPosition
j0hn.rotation = 0
}
if ebiten.IsKeyPressed(ebiten.KeySpace) {
j0hn.Accelerate(&vec2.T{direction * 2, 2})
} else if !j0hn.flying {
j0hn.StandUp()
} else {
j0hn.Steady()
}
}
}
Planetas
De momento, adicional al fondo estrellado, decidà agregar un generador de planetas, estos aparecen fuera de la pantalla y se dirigen hacia el centro, para simular profundidad agregue un atributo que regula la cantidad de movimiento del usuario que afecta al movimiento de cada planeta, de esta forma, los menos afectados aparentan estar más lejos, contrario a los más cercanos, que se mueven casi a la par del personaje.
También en este caso al salir del área visible vertical, los planetas son eliminados.