changeset 13:952e27204992

More work.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 23 May 2015 03:01:29 +0300
parents bc1a226cc2d5
children 5870d530cb32
files demo.c
diffstat 1 files changed, 127 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/demo.c	Fri May 22 03:22:37 2015 +0300
+++ b/demo.c	Sat May 23 03:01:29 2015 +0300
@@ -43,16 +43,29 @@
 typedef struct
 {
     int layer;
+    int freq;
+    int max;
+    float ypos;
+    float speed;
     char *filename;
     SDL_Surface *img;
+    int count;
 } DMItemDef;
 
 
-DMItemDef items[] = 
+typedef struct
 {
-    { 1, "viitta.png", NULL },
-    { 1, "puu_pv_1.png", NULL },
-    { 0, "puu_pv_2.png", NULL },
+    BOOL enabled;
+    float xtime, xpos, ypos;
+    DMItemDef *ref;
+} DMFooItemDef;
+
+
+static DMItemDef items[] = 
+{
+    { 0,  3, 1,  0.53, 0.2, "viitta.png", NULL, 0 },
+    { 0,  1, 3,  0.28 , 0.1 , "puu_pv_2.png", NULL, 0 },
+    { 1,  9, 2,  0.25 , 0.8 , "puu_pv_1.png", NULL, 0 },
 };
 
 static const int nitems = sizeof(items) / sizeof(items[0]);
@@ -230,6 +243,38 @@
 }
 
 
+static DMItemDef * dmGetItem(int t)
+{
+    int i;
+    for (i = 0; i < nitems; i++)
+    {
+        DMItemDef *def = &items[i];
+        if (t % def->freq == 0 && def->count <= def->max)
+            return def;
+    }
+    return NULL;
+}
+
+
+static void dmRenderItems(DMEngineData *engine, DMScaledBlitFunc ablit, DMFooItemDef *mitems, const int nmitems, const int layer)
+{
+    int i;
+    for (i = 0; i < nmitems; i++)
+    {
+        DMFooItemDef *item = &mitems[i];
+
+        if (item->enabled && item->ref->layer == layer)
+        {
+            ablit(item->ref->img,
+                dmCX(engine, item->xpos),
+                dmCY(engine, item->ypos),
+                dmQX(engine, item->ref->img, 1),
+                dmQY(engine, item->ref->img, 1),
+                engine->screen);
+        }
+    }
+}
+
 
 static int demoRender(DMEngineData *engine)
 {
@@ -312,13 +357,58 @@
             cblit(tausta, x2, 0, dmQX(engine, tausta, 1), dmQY(engine, tausta, 1), engine->screen);
         }
 
-        float qm = sin(t * 0.1 + fftPow * 5) * 15, qm2 = qm*2;
+        float qm = sin(t * 0.1 + fftPow * 5) * 0.05, qm2 = qm * 10;
         dmScaledBlitSurface32to32TransparentGA(aurinko,
-            dmCX(engine, 0.8 - dmLerpSCurveClamp(&fadeLerp3, engineGetTime(engine, 0) * 0.01) * 0.3 ) - qm,
-            dmCY(engine, 0.05) - qm,
-            aurinko->w + qm2, aurinko->h + qm2,
+            dmCX(engine, 0.8 - dmLerpSCurveClamp(&fadeLerp3, engineGetTime(engine, 0) * 0.01) * 0.3 - qm),
+            dmCY(engine, 0.05 - qm),
+            dmQX(engine, aurinko, 1 + qm2),
+            dmQY(engine, aurinko, 1 + qm2),
             engine->screen, fadeVal);
 
+        // Puut ym. liikennejutut
+        #define DM_MAX_MITEMS 16
+        static DMFooItemDef mitems[DM_MAX_MITEMS];
+        if (t > 0)
+        {
+            float dt = (t - 0);
+            static BOOL nollattu = FALSE;
+            int i;
+
+            if (!nollattu)
+            {
+                memset(mitems, 0, sizeof(mitems));
+                nollattu = TRUE;
+            }
+
+            for (i = 0; i < DM_MAX_MITEMS; i++)
+            {
+                DMFooItemDef *item = &mitems[i];
+                if (!item->enabled && (item->ref = dmGetItem((int) t * 10 + 1)) != NULL)
+                {
+                    item->enabled = TRUE;
+                    item->ref->count++;
+                    item->xtime = dt;
+                    item->ypos = item->ref->ypos + sin(dt) * 0.001f;
+                }
+            }
+            for (i = 0; i < DM_MAX_MITEMS; i++)
+            {
+                DMFooItemDef *item = &mitems[i];
+                if (item->enabled)
+                {
+                    float xpos = (dt - item->xtime) * item->ref->speed;
+                    if (xpos > 1.5)
+                    {
+                        item->enabled = FALSE;
+                        item->ref->count--;
+                    }
+                    else
+                        item->xpos = 1 - xpos;
+                }
+            }
+        }
+
+        dmRenderItems(engine, ablit, mitems, DM_MAX_MITEMS, 0);
         
         // Bussi ajaa sisään
         if (t > 14)
@@ -327,7 +417,7 @@
                 dt = engineGetTime(engine, 14),
                 ajelu = dmLerpSCurveClamp(&fadeLerp3, dt),
                 xc = dmCX(engine, -1 + ajelu),
-                yc = dmCY(engine, 0.35 + sin(t * 10) * 0.005),
+                yc = dmCY(engine, 0.38 + sin(t * 10) * 0.005),
                 yc2 = yc + dmQY(engine, bussi, 0.7) + dmCY(engine, sin(t * 20) * 0.001);
             
             ablit(rengas, xc + dmQX(engine, bussi, 0.07), yc2, dmQX(engine, rengas, 1), dmQY(engine, rengas, 1), engine->screen);
@@ -335,11 +425,7 @@
             ablit(bussi, xc, yc, dmQX(engine, bussi, 1), dmQY(engine, bussi, 1), engine->screen);
         }
 
-
-        // Puut ym. liikennejutut
-        if (t > 10)
-        {
-        }
+        dmRenderItems(engine, ablit, mitems, DM_MAX_MITEMS, 1);
     }
 
     //
@@ -430,26 +516,10 @@
     }
 
 
-    {
-        static DMScaledBlitFunc cblit = NULL;
-        static SDL_Surface *maski = NULL;
-        static BOOL nollattu = FALSE;
-
-        if (!nollattu)
-        {
-            engineGetResImage(engine, maski, "maski.png");
-            cblit = dmGetScaledBlitFunc(maski->format, engine->screen->format, DMD_TRANSPARENT);
-        }
-
-        cblit(maski,
-            0, 0,
-            dmQX(engine, maski, 1),
-            dmQY(engine, maski, 1),
-            engine->screen);
-    }
-
+    //
     // Skrolleri
-    if (t > 2)
+    //
+    if (t > 3)
     {
         int tt = engineGetTime(engine, 2);
         static DMScaledBlitFunc cblit, qblit;
@@ -485,7 +555,9 @@
         }
     }
 
+    //
     // Loppufeidi
+    //
     if (t > 70)
     {
         static DMLerpContext fadeLerp;
@@ -503,6 +575,28 @@
             dmLerpSCurveClamp(&fadeLerp, fadeTime));
     }
 
+    //
+    // Maskaus
+    //
+    {
+        static DMScaledBlitFunc cblit = NULL;
+        static SDL_Surface *maski = NULL;
+        static BOOL nollattu = FALSE;
+
+        if (!nollattu)
+        {
+            engineGetResImage(engine, maski, "maski.png");
+            cblit = dmGetScaledBlitFunc(maski->format, engine->screen->format, DMD_TRANSPARENT);
+        }
+
+        cblit(maski,
+            0, 0,
+            dmQX(engine, maski, 1),
+            dmQY(engine, maski, 1),
+            engine->screen);
+    }
+
+
     if (t > 75)
         return 1;
     else