0m/s^2 | 🚫Gravity | Día 1/31

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

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.