(ns advent.screens.splash (:require [clojure.string :as str] [play-clj.core :refer :all] [play-clj.math :refer :all] [play-clj.ui :refer :all] [play-clj.utils :refer :all] [play-clj.g2d :refer :all] [advent.utils :as utils] [clojure.tools.logging :as log] [advent.saves :as saves] [advent.tween :as tween] [advent.steam :as steam] [advent.screens.title :as title] ) (:import [com.badlogic.gdx.graphics Pixmap Pixmap$Filter Texture Texture$TextureFilter Color] [com.badlogic.gdx.graphics.g2d TextureRegion] [play_clj.entities NinePatchEntity] [com.badlogic.gdx.utils.viewport FitViewport] [com.badlogic.gdx.scenes.scene2d.ui Slider$SliderStyle Widget ButtonGroup TextButton$TextButtonStyle CheckBox$CheckBoxStyle CheckBox Button] [com.badlogic.gdx.scenes.scene2d Group Actor] [play_clj.entities ActorEntity] [com.badlogic.gdx.scenes.scene2d.utils Align NinePatchDrawable TextureRegionDrawable] [com.badlogic.gdx Application Audio Files Game Gdx Graphics Input InputMultiplexer InputProcessor Net Preferences Screen])) (defn fade-in [screen e thing then] (assoc-in e [:tweens :fade-in] (tween/tween :fade-in screen [thing :opacity] 0.0 1.0 5.0 :finish then :ease tween/ease-in-quadratic))) (defn fade-out [screen e thing then] (assoc-in e [:tweens :fade-out] (tween/tween :fade-out screen [thing :opacity] 1.0 0.0 5.0 :finish then :ease tween/ease-in-quadratic))) (defn get-texture [path] (let [atlas-name (str/replace path #".png" "") atlas (texture-atlas "packed-pop-logo/pack.atlas")] (texture (texture-atlas! atlas :find-region atlas-name)))) (defn make-anim-seq [file [w h] speed frames] (animation speed (map #(get-texture (str file "_" (inc %) ".png")) frames))) (defn animate [entity screen] (if (:anim entity) (merge entity (animation->texture (update-in screen [:total-time] #(- (or % 0) (:anim-start entity 0))) (:anim entity))) entity)) (defscreen splash-screen :on-show (fn [screen entities] (utils/setup-viewport screen 1280 960) (log/info "Starting splash screen.") (input! :set-cursor-image (utils/cursor "cursor.png" :hourglass) 0 0) (let [screen (assoc screen :total-time 0) pop-anim (make-anim-seq "POPPixelLogo_02" [320 240] 0.05 (range 200)) entities {:background (assoc (utils/get-texture "black.png") :scale-x 80 :scale-y 80 :opacity 1.0 :origin-x 0 :origin-y 0 :z 0) :pop-logo (assoc (animation->texture screen pop-anim) :main-anim pop-anim :x 0 :y 0 :origin-x 0 :origin-y 0 :scale-x 4 :scale-y 4 :z 1) :dbhlogo (assoc (utils/get-texture "dbh.png") :x 0 :y 0 :origin-x 0 :origin-y 0 :z 1 :opacity 0.0)}] (fade-in screen entities :dbhlogo (fn [entities] (fade-out (assoc-in screen [:total-time] 5.0) entities :dbhlogo (fn [entities] (as-> entities entities (assoc-in entities [:pop-logo :anim-start ] 10.0) (assoc-in entities [:pop-logo :anim] (get-in entities [:pop-logo :main-anim])) (fade-in (assoc-in screen [:total-time] 10.0) entities :pop-logo (fn [entities] (fade-out (assoc-in screen [:total-time] 15.0) entities :pop-logo (fn [entities] (set-screen! @(resolve 'advent.core/advent) title/title-screen) entities))))))))))) :on-render (fn [{:keys [^FitViewport viewport] :as screen} [entities]] (steam/update) (.apply viewport) (clear!) (let [entities (utils/apply-tweens screen entities (:tweens entities)) entities (update-in entities [:pop-logo] animate screen)] (render! screen (sort-by :z (filter :object (vals entities))) ) entities)) :show-screen (fn [entities] entities) :on-key-up (fn [screen entities] (when (= (key-code :escape) (:key screen)) (utils/toggle-fullscreen!)) nil) :on-resize (fn [{:keys [viewport width height]} [entities]] (.update viewport width height false) nil))