diff options
| author | Ian C <ianc@noddybox.co.uk> | 2018-10-22 08:01:28 +0000 | 
|---|---|---|
| committer | Ian C <ianc@noddybox.co.uk> | 2018-10-22 08:01:28 +0000 | 
| commit | 74f15a9e50bb1bac10ff87da83214fdeb6f9b3dd (patch) | |
| tree | 49ada51dda0a4973ee847dd28caffdc6b90b8598 | |
| parent | 35dae3cc1d3a76eeef18f625dda55a5e7fdfd079 (diff) | |
Addeed snow demo.
| -rw-r--r-- | xd.c | 130 | 
1 files changed, 128 insertions, 2 deletions
| @@ -64,6 +64,8 @@ static const char id[]="$Id$";  #define RND(x)		(rand()%(x))  #define RND2(h,l)	((rand()%((h)-(l)))+(l)) +#define XY(x,y)		((x) + (y) * width) +  /* ---------------------------------------- TYPES  */  typedef enum {UsesImage, UsesPixmap} DType; @@ -170,10 +172,11 @@ static void	TriangleDemo2(void);  static void	FollowDemo(void);  static void	CatwalkDemo(void);  static void	GravityDemo(void); +static void	SnowDemo(void);  /* ---------------------------------------- GLOBAL VARS  */ -#define NO_DEMOS	18 +#define NO_DEMOS	19  static int		demo=NO_DEMOS-1; @@ -271,6 +274,11 @@ static DemoInfo		demotbl[NO_DEMOS]=  				GravityDemo,  				UsesPixmap  			    }, +			    { +				"Snow Demo (LMB reset)", +				SnowDemo, +				UsesPixmap +			    },  			};  /* ---------------------------------------- X11 VARS @@ -4057,7 +4065,7 @@ static void GravityDemo(void)  		gravobj[f].dx = sintab[a] * 0.1;  		gravobj[f].dy = costab[a] * 0.1; -		gravobj[f].mass = 1; +		gravobj[f].mass = 10;  		gravobj[f].alive = TRUE;  	    } @@ -4164,4 +4172,122 @@ static void GravityDemo(void)  #undef GRAV_SIZE +/* ---------------------------------------- SNOW DEMO + */ + +#define SNOW_LINES	20 +#define SNOW_FLAKES	10000 + +static void SnowDemo(void) +{ +    static int init = FALSE; + +    static int *map; + +    typedef struct +    { +    	int	x,y; +    } Flake; + +    static Flake *snow; + +    int f,r; +    int x,y; +    int xi, yi; + +    if (!init || mouse_b&Button1Mask) +    { +	Cls(); + +	map = Grab(sizeof *map * width * height); +	snow = Grab(sizeof *snow * SNOW_FLAKES); + +	Line(0, 0, 0, height - 1, red); +	Line(width - 1, 0, width - 1, height - 1, red); +	Line(0, height - 1, width - 1, height - 1, red); + +	for(x = 0; x < width; x++) +	{ +	    for(y = 0; y < height; y++) +	    { +		if (x == 0 || x == width - 1 || y == height - 1) +		{ +		    map[XY(x,y)] = 1; +		} +		else +		{ +		    map[XY(x,y)] = 0; +		} +	    } +	} + +	for(f = 0; f < SNOW_LINES; f++) +	{ +	    x = RND(width); +	    y = RND(height); +	    do +	    { +		xi = RND2(1, -1); +	    } while (xi == 0); +	    yi = 0; + +	    for(r = RND(50) + 10; r > 0; r--) +	    { +	    	if (x > 0 && x < width && y > 0 && y < height) +		{ +		    Plot(x, y, red); +		    map[XY(x,y)] = 1; +		    x += xi; +		    y += yi; +		} +	    } +	} + +	for(f = 0; f < SNOW_FLAKES; f++) +	{ +	    do +	    { +		snow[f].x = RND(width - 2) + 1; +		snow[f].y = RND(height); +	    } while (map[XY(snow[f].x, snow[f].y)]); +	} + +	init=TRUE; +    } + +    for(f = 0; f < SNOW_FLAKES; f++) +    { +    	if (map[XY(snow[f].x, snow[f].y + 1)] == 0) +	{ +	    Plot(snow[f].x, snow[f].y, black); +	    snow[f].y++; +	    Plot(snow[f].x, snow[f].y, white); +	} +	else if (map[XY(snow[f].x + 1, snow[f].y + 1)] == 0) +	{ +	    Plot(snow[f].x, snow[f].y, black); +	    snow[f].x++; +	    snow[f].y++; +	    Plot(snow[f].x, snow[f].y, white); +	} +	else if (map[XY(snow[f].x - 1, snow[f].y + 1)] == 0) +	{ +	    Plot(snow[f].x, snow[f].y, black); +	    snow[f].x--; +	    snow[f].y++; +	    Plot(snow[f].x, snow[f].y, white); +	} +	else +	{ +	    Plot(snow[f].x, snow[f].y, white); +	    map[XY(snow[f].x, snow[f].y)] = 1; +	    snow[f].x = RND(width - 2) + 1; +	    snow[f].y = 0; +	} +    } +} + +#undef SNOW_LINES + +  /* END OF FILE */ | 
