(no subject)

Thomas Horsten thomas@hidden
Thu Jan 8 21:30:37 CET 2009


>From 34e9bba9f35d4db98f70140e5d66fc5674a9e2b7 Mon Sep 17 00:00:00 2001
From: Thomas Horsten <th@hidden>
Date: Thu, 8 Jan 2009 20:44:04 +0000
Subject: Updated Minitris with piece colours, next image preview and image shadow


Signed-off-by: Thomas Horsten <thomas@hidden>
---
 tools/minitris.c |   87 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 73 insertions(+), 14 deletions(-)

diff --git a/tools/minitris.c b/tools/minitris.c
index 8641efc..bf042e4 100644
--- a/tools/minitris.c
+++ b/tools/minitris.c
@@ -2,25 +2,35 @@
 
 #define DEFAULT_WIDTH 11
 #define DEFAULT_HEIGHT 20
+#define DEFAULT_BLOCKSIZE 20
+#define PREVIEW_BLOCKSIZE 7
 
 #define BLACK 0
 #define RED   1
 #define GREEN 2
 #define BLUE  3
+#define PURPLE  4
+#define YELLOW  5
+#define CYAN  6
 
 ULONG board[DEFAULT_WIDTH * DEFAULT_HEIGHT];
 
 int board_width = DEFAULT_WIDTH;
 int board_height = DEFAULT_HEIGHT;
-int block_size = 20;
+int block_size = DEFAULT_BLOCKSIZE;
 int interval = 1000;
 int piece_orientation = 0;
+int next_piece_type = 0;
 int piece_type = 0;
 int piece_color = RED;
 int piece_x = 0;
 int piece_y = 0;
 
-HBRUSH brushes[4];
+BOOL show_next_piece = TRUE;
+int preview_pos_x = (DEFAULT_WIDTH * DEFAULT_BLOCKSIZE)-(5*PREVIEW_BLOCKSIZE)-1;
+int preview_pos_y = 1;
+
+HBRUSH brushes[6];
 HPEN null_pen;
 
 const char piece[] = {
@@ -174,12 +184,12 @@ const char piece[] = {
 #undef max
 #undef min
 
-int max( int x, int y )
+static inline int max( int x, int y )
 {
 	return x<y?y:x;
 }
 
-int min( int x, int y )
+static inline int min( int x, int y )
 {
 	return x>y?y:x;
 }
@@ -203,6 +213,28 @@ void draw_block( HDC hdc, int x, int y )
 		 (x+1)*block_size - 1, (y+1)*block_size - 1 );
 }
 
+BOOL piece_has_block( int type, int orientation, int x, int y );
+
+void draw_next_piece_preview(HDC hdc)
+{
+	int x, y;
+
+	SelectObject( hdc, brushes[0] );
+
+	for (x=0; x<5; x++) 
+		for (y=0; y<5; y++) 
+		{
+			if (piece_has_block(next_piece_type, 0, x, y))
+			{
+				SelectObject( hdc, brushes[next_piece_type+1] );
+			} else {
+				SelectObject( hdc, brushes[0] );
+			}
+			Rectangle( hdc, preview_pos_x+(x*PREVIEW_BLOCKSIZE), preview_pos_y+y*PREVIEW_BLOCKSIZE,
+				   preview_pos_x+((x+1)*PREVIEW_BLOCKSIZE), preview_pos_y+(y+1)*PREVIEW_BLOCKSIZE );
+		}
+}
+
 void do_paint( HWND hwnd )
 {
 	PAINTSTRUCT ps;
@@ -215,6 +247,7 @@ void do_paint( HWND hwnd )
 
 	old_brush = SelectObject( hdc, brushes[0] );
 	old_pen = SelectObject( hdc, null_pen );
+
 	for (i=0; i<board_width; i++)
 	{
 		for (j=0; j<board_height; j++)
@@ -222,6 +255,28 @@ void do_paint( HWND hwnd )
 			draw_block( hdc, i, j );
 		}
 	}
+
+	// draw shadow under current block
+	SelectObject( hdc, brushes[0] );
+	Rectangle( hdc, 1, board_height*block_size, 
+		   board_width*block_size-1, board_height*block_size+5 );
+	SelectObject( hdc, brushes[piece_color] );
+	for (i=0; i<5; i++)
+	{
+		for (j=0; j<5; j++) {
+			if (piece_has_block(piece_type, piece_orientation,
+					    i, j))
+				break;
+		}
+		if (j<5) {
+			Rectangle( hdc, (i+piece_x)*block_size, board_height*block_size,
+				   (i+piece_x+1)*block_size - 1, board_height*block_size+5 );
+		}
+	}
+
+	if (show_next_piece) 
+		draw_next_piece_preview(hdc);
+
 	SelectObject( hdc, old_brush );
 	SelectObject( hdc, old_pen );
 
@@ -238,7 +293,7 @@ void set_block( int x, int y, int color )
 
 BOOL piece_has_block( int type, int orientation, int x, int y )
 {
-	return piece[ piece_type*100 + orientation*25 + y*5 + x] == 'X';
+	return piece[ type*100 + orientation*25 + y*5 + x] == 'X';
 }
 
 void block_at_cursor( int type, int orientation, int color )
@@ -326,9 +381,7 @@ BOOL move_right()
 
 BOOL do_rotate()
 {
-	int new_orientation = piece_orientation + 1;
-	if (new_orientation >= 4)
-		new_orientation = 0;
+	int new_orientation = (piece_orientation + 1) & 3;
 	block_at_cursor( piece_type, piece_orientation, BLACK );
 	if (block_fits_at(piece_type, new_orientation, piece_x, piece_y ))
 		piece_orientation = new_orientation;
@@ -338,11 +391,11 @@ BOOL do_rotate()
 
 BOOL new_block()
 {
-	piece_type += 1;
-	if (piece_type > 5)
-		piece_type = 0;
+	piece_type = next_piece_type;
+	next_piece_type = rand()%6;
+	piece_color = piece_type+1;
 	piece_x = board_width/2 - 2;
-	piece_y = 1;
+	piece_y = 0;
 	block_at_cursor( piece_type, piece_orientation, piece_color );
 	return TRUE;
 }
@@ -443,7 +496,7 @@ LRESULT CALLBACK minitris_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa
 	switch (msg)
 	{
 	case WM_SIZE:
-		do_size( hwnd, block_size * board_width, block_size * board_height );
+		do_size( hwnd, block_size * board_width, block_size * board_height + 5 );
 		break;
 	case WM_KEYDOWN:
 		if (do_keydown(wparam))
@@ -468,6 +521,9 @@ int APIENTRY WinMain( HINSTANCE Instance, HINSTANCE Prev, LPSTR CmdLine, int Sho
 	HWND hwnd;
 	MSG msg;
 
+	srand(time(NULL));
+	next_piece_type = rand()%5;
+
 	wc.style = 0;
 	wc.lpfnWndProc = minitris_wndproc;
 	wc.cbClsExtra = 0;
@@ -485,7 +541,7 @@ int APIENTRY WinMain( HINSTANCE Instance, HINSTANCE Prev, LPSTR CmdLine, int Sho
 	}
 
 	hwnd = CreateWindow("MINITRIS", "Minitris", WS_VISIBLE|WS_POPUP|WS_DLGFRAME,
-		CW_USEDEFAULT, CW_USEDEFAULT, block_size * board_width, block_size * board_height,
+		CW_USEDEFAULT, CW_USEDEFAULT, block_size * board_width, block_size * board_height + 5,
 		NULL, NULL, Instance, NULL);
 	if (!hwnd)
 	{
@@ -498,6 +554,9 @@ int APIENTRY WinMain( HINSTANCE Instance, HINSTANCE Prev, LPSTR CmdLine, int Sho
 	brushes[1] = CreateSolidBrush( RGB( 0x80, 0, 0 ) );
 	brushes[2] = CreateSolidBrush( RGB( 0, 0x80, 0 ) );
 	brushes[3] = CreateSolidBrush( RGB( 0, 0, 0x80 ) );
+	brushes[4] = CreateSolidBrush( RGB( 0x80, 0, 0x80 ) );
+	brushes[5] = CreateSolidBrush( RGB( 0x80, 0x80, 0 ) );
+	brushes[6] = CreateSolidBrush( RGB( 0, 0x80, 0x80 ) );
 
 	new_block();
 	SetTimer( hwnd, 0, interval, 0 );
-- 
1.5.6.5



More information about the ring3k mailing list