From 37af2957c46088b3f5fd9ddff367b929ab4cd8a0 Mon Sep 17 00:00:00 2001 From: Coeuvre Date: Thu, 22 May 2014 17:09:48 +0800 Subject: [PATCH] Tiles can display numbers now! --- bin/assets/digits.png | Bin 0 -> 21266 bytes src/app.rs | 12 +++++--- src/board.rs | 9 +++--- src/main.rs | 1 + src/number_renderer.rs | 62 +++++++++++++++++++++++++++++++++++++++++ src/settings.rs | 3 ++ src/tile.rs | 10 ++++++- 7 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 bin/assets/digits.png create mode 100644 src/number_renderer.rs diff --git a/bin/assets/digits.png b/bin/assets/digits.png new file mode 100644 index 0000000000000000000000000000000000000000..2c04ea4984a0264ddcbaf1d93edba670178faa41 GIT binary patch literal 21266 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 Q@N%JThC2=N^y~xw2S|j>H~;_u literal 0 HcmV?d00001 diff --git a/src/app.rs b/src/app.rs index 8e392e7..8013042 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,31 +3,35 @@ use graphics::*; use piston::*; use board::Board; +use number_renderer::NumberRenderer; pub struct App { board: Board, + number_renderer: Option, } impl App { pub fn new() -> App { App { board: Board::new(), + number_renderer: None, } } } impl Game for App { + fn load(&mut self, asset_store: &mut AssetStore) { + self.number_renderer = Some(NumberRenderer::new(asset_store)); + } + fn render(&self, c: &Context, gl: &mut Gl) { - self.board.render(c, gl); + self.board.render(self.number_renderer.get_ref(), c, gl); } fn update(&mut self, dt: f64, _asset_store: &mut AssetStore) { self.board.update(dt); } - fn load(&mut self, _asset_store: &mut AssetStore) { - } - fn key_press( &mut self, key: keyboard::Key, diff --git a/src/board.rs b/src/board.rs index cb6bf9a..e25b15f 100644 --- a/src/board.rs +++ b/src/board.rs @@ -4,6 +4,7 @@ use collections::hashmap::HashSet; use rand::random; use graphics::*; use piston::*; +use number_renderer::NumberRenderer; use settings; use tile::{ Tile, @@ -87,9 +88,9 @@ impl Board { } } - pub fn render(&self, c: &Context, gl: &mut Gl) { + pub fn render(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut Gl) { self.render_board(c, gl); - self.render_tiles(c, gl); + self.render_tiles(number_renderer, c, gl); } pub fn merge_from_bottom_to_top(&mut self) { @@ -365,9 +366,9 @@ impl Board { } } - fn render_tiles(&self, c: &Context, gl: &mut Gl) { + fn render_tiles(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut Gl) { for tile in self.tiles.iter() { - tile.render(c, gl); + tile.render(number_renderer, c, gl); } } diff --git a/src/main.rs b/src/main.rs index 8ee46ca..dd480a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ use piston::*; mod app; mod board; +mod number_renderer; mod settings; mod tile; diff --git a/src/number_renderer.rs b/src/number_renderer.rs new file mode 100644 index 0000000..6cb4a5c --- /dev/null +++ b/src/number_renderer.rs @@ -0,0 +1,62 @@ + +use graphics::*; +use piston::{ + AssetStore, + Gl, +}; + +static DIGITS_WIDTH: f64 = 20.0; +static DIGITS_HEIGHT: f64 = 26.0; + +pub struct NumberRenderer { + image: Image, +} + +impl NumberRenderer { + pub fn new(asset_store: &mut AssetStore) -> NumberRenderer { + NumberRenderer { + image: asset_store.load_image("digits.png"), + } + } + + pub fn render(&self, number: u32, center_x: f64, center_y: f64, max_width: f64, + color: [f32, ..4], c: &Context, gl: &mut Gl) { + let digits = number_to_digits(number); + let total_width = DIGITS_WIDTH * digits.len() as f64; + let total_width = if total_width > max_width { + max_width + } else { + total_width + }; + let mut x = center_x - total_width / 2.0; + let width = total_width / digits.len() as f64; + let height = width / DIGITS_WIDTH * DIGITS_HEIGHT; + let y = center_y - height / 2.0; + + let mut image = self.image; + image.source_rect[2] = DIGITS_WIDTH as u32; + for digit in digits.iter() { + image.source_rect[0] = DIGITS_WIDTH as u32 * *digit; + c.view().rect(x, y, width, height) + .image(image).rgba(color[0], color[1], color[2], color[3]) + .draw(gl); + x += width; + } + } +} + +fn number_to_digits(number: u32) -> Vec { + let mut digits = Vec::::new(); + if number == 0 { + digits.push(0); + return digits; + } + + let mut n = number; + while n != 0 { + digits.unshift(n % 10); + n /= 10; + } + digits +} + diff --git a/src/settings.rs b/src/settings.rs index ab0a2dd..20bb616 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -49,3 +49,6 @@ pub static TILE_COMBINE_TIME: f64 = 0.1; pub static LABEL_COLOR: [f32, ..4] = [187.0 / 255.0, 173.0 / 255.0, 160.0 / 255.0, 1.0]; pub static BUTTON_COLOR: [f32, ..4] = [142.0 / 255.0, 122.0 / 255.0, 102.0 / 255.0, 1.0]; +pub static TEXT_DARK_COLOR: [f32, ..4] = [119.0 / 255.0, 110.0 / 255.0, 101.0 / 255.0, 1.0]; +pub static TEXT_LIGHT_COLOR: [f32, ..4] = [249.0 / 255.0, 246.0 / 255.0, 242.0 / 255.0, 1.0]; + diff --git a/src/tile.rs b/src/tile.rs index cdbce3b..7217617 100644 --- a/src/tile.rs +++ b/src/tile.rs @@ -1,6 +1,7 @@ use graphics::*; use piston::*; +use number_renderer::NumberRenderer; use settings; #[deriving(Clone, Eq)] @@ -96,7 +97,7 @@ impl Tile { } } - pub fn render(&self, c: &Context, gl: &mut Gl) { + pub fn render(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut Gl) { let mut pos = Tile::tile_to_pos(self.tile_x, self.tile_y); let mut size = (settings::TILE_SIZE, settings::TILE_SIZE); match self.status { @@ -119,6 +120,13 @@ impl Tile { y + settings::TILE_SIZE / 2.0, w / 2.0, h / 2.0) .rgba(color[0], color[1], color[2], color[3]).fill(gl); + + let color = if self.score >= 8 { + settings::TEXT_LIGHT_COLOR + } else { + settings::TEXT_DARK_COLOR + }; + number_renderer.render(self.score as u32, x + settings::TILE_SIZE / 2.0, y + settings::TILE_SIZE / 2.0, settings::TILE_SIZE, color, c, gl); } fn get_color(&self) -> [f32, ..4] {