Upgraded to latest Piston and Rust 1.0.0
removed use of unstabel features Gl => GlGraphics
This commit is contained in:
parent
9513582832
commit
796fe1f45b
2 changed files with 62 additions and 47 deletions
96
src/board.rs
96
src/board.rs
|
|
@ -1,10 +1,10 @@
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::iter::range_step_inclusive;
|
// use std::iter::range_step_inclusive;
|
||||||
use rand::random;
|
use rand::random;
|
||||||
use graphics::*;
|
use graphics::*;
|
||||||
use opengl_graphics::{
|
use opengl_graphics::{
|
||||||
Gl,
|
GlGraphics,
|
||||||
};
|
};
|
||||||
use number_renderer::NumberRenderer;
|
use number_renderer::NumberRenderer;
|
||||||
use settings::Settings;
|
use settings::Settings;
|
||||||
|
|
@ -18,7 +18,6 @@ fn rgb2rgba(c: [f32; 3]) -> [f32; 4] { [c[0], c[1], c[2], 1.0] }
|
||||||
pub struct Board<'a> {
|
pub struct Board<'a> {
|
||||||
tiles: Vec<Tile<'a>>,
|
tiles: Vec<Tile<'a>>,
|
||||||
score: i32,
|
score: i32,
|
||||||
|
|
||||||
settings: &'a Settings,
|
settings: &'a Settings,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,7 +52,7 @@ impl<'a> Board<'a> {
|
||||||
for tile in self.tiles.iter_mut() {
|
for tile in self.tiles.iter_mut() {
|
||||||
tile.update(dt);
|
tile.update(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.is_locking() {
|
if self.is_locking() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -68,8 +67,8 @@ impl<'a> Board<'a> {
|
||||||
for j in i+1..self.tiles.len() {
|
for j in i+1..self.tiles.len() {
|
||||||
let tile2 = &self.tiles[j];
|
let tile2 = &self.tiles[j];
|
||||||
if tile2.status != TileState::TileStatic
|
if tile2.status != TileState::TileStatic
|
||||||
|| tile1.tile_x != tile2.tile_x
|
|| tile1.tile_x != tile2.tile_x
|
||||||
|| tile1.tile_y != tile2.tile_y {
|
|| tile1.tile_y != tile2.tile_y {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,19 +87,22 @@ impl<'a> Board<'a> {
|
||||||
tiles.push(self.tiles[i].clone());
|
tiles.push(self.tiles[i].clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tiles.append(&mut tiles_need_added);
|
// better but unstable: tiles.append(&mut tiles_need_added);
|
||||||
|
while let Some(tile_to_add) = tiles_need_added.pop() {
|
||||||
|
tiles.push(tile_to_add);
|
||||||
|
}
|
||||||
self.tiles = tiles;
|
self.tiles = tiles;
|
||||||
self.add_score(score_to_added);
|
self.add_score(score_to_added);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut Gl) {
|
pub fn render(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut GlGraphics) {
|
||||||
number_renderer.render(
|
number_renderer.render(
|
||||||
self.score as u32,
|
self.score as u32,
|
||||||
self.settings.best_rect[0] + self.settings.best_rect[2] / 2.0,
|
self.settings.best_rect[0] + self.settings.best_rect[2] / 2.0,
|
||||||
self.settings.best_rect[1] + self.settings.best_rect[3] / 2.0,
|
self.settings.best_rect[1] + self.settings.best_rect[3] / 2.0,
|
||||||
self.settings.best_rect[2],
|
self.settings.best_rect[2],
|
||||||
self.settings.text_light_color, c, gl);
|
self.settings.text_light_color, c, gl);
|
||||||
|
|
||||||
self.render_board(c, gl);
|
self.render_board(c, gl);
|
||||||
self.render_tiles(number_renderer, c, gl);
|
self.render_tiles(number_renderer, c, gl);
|
||||||
|
|
@ -118,20 +120,28 @@ impl<'a> Board<'a> {
|
||||||
|
|
||||||
fn merge_col(&mut self, y_start: i32, y_end: i32, y_step: i32) {
|
fn merge_col(&mut self, y_start: i32, y_end: i32, y_step: i32) {
|
||||||
if self.is_locking() {
|
if self.is_locking() {
|
||||||
|
println!("return");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut need_generate = false;
|
let mut need_generate = false;
|
||||||
|
let mut steps: Vec<i32> = Vec::with_capacity(self.settings.tile_height as usize);
|
||||||
|
let mut next_step = y_start;
|
||||||
|
if y_step < 0 {
|
||||||
|
while next_step > y_end { steps.push(next_step); next_step += y_step }
|
||||||
|
} else {
|
||||||
|
while next_step < y_end { steps.push(next_step); next_step += y_step }
|
||||||
|
};
|
||||||
loop {
|
loop {
|
||||||
// move all tiles to right place
|
// move all tiles to right place
|
||||||
for col in 0..self.settings.tile_width {
|
for col in 0 .. self.settings.tile_width {
|
||||||
for row in range_step_inclusive(y_start, y_end, y_step) {
|
// TODO: replace steps by (y_start .. y_end).step_by(y_step) if step_by becomes stable
|
||||||
|
for row in steps.to_vec() {
|
||||||
match self.get_mut_tile(col, row) {
|
match self.get_mut_tile(col, row) {
|
||||||
None => {
|
None => {
|
||||||
match self.get_mut_next_tile(col, row, 0, y_step) {
|
match self.get_mut_next_tile(col, row, 0, y_step) {
|
||||||
Some(ref mut tile) => {
|
Some(ref mut tile) => {
|
||||||
println!("move ({}, {}) to ({}, {})",
|
println!("move ({}, {}) to ({}, {})",
|
||||||
tile.tile_x, tile.tile_y, col, row);
|
tile.tile_x, tile.tile_y, col, row);
|
||||||
need_generate = true;
|
need_generate = true;
|
||||||
tile.start_moving(col, row);
|
tile.start_moving(col, row);
|
||||||
},
|
},
|
||||||
|
|
@ -150,13 +160,13 @@ impl<'a> Board<'a> {
|
||||||
let mut sy = 0;
|
let mut sy = 0;
|
||||||
let mut dx = 0;
|
let mut dx = 0;
|
||||||
let mut dy = 0;
|
let mut dy = 0;
|
||||||
for row in range_step_inclusive(y_start, y_end, y_step) {
|
for row in steps.to_vec() {
|
||||||
match self.get_tile(col, row) {
|
match self.get_tile(col, row) {
|
||||||
Some(ref d_tile) => {
|
Some(ref d_tile) => {
|
||||||
match self.get_next_tile(col, row, 0, y_step) {
|
match self.get_next_tile(col, row, 0, y_step) {
|
||||||
Some(ref s_tile)
|
Some(ref s_tile)
|
||||||
if d_tile.score == s_tile.score
|
if d_tile.score == s_tile.score
|
||||||
&& self.get_tile_count(d_tile.tile_x, d_tile.tile_y) == 1 => {
|
&& self.get_tile_count(d_tile.tile_x, d_tile.tile_y) == 1 => {
|
||||||
found = true;
|
found = true;
|
||||||
dx = d_tile.tile_x;
|
dx = d_tile.tile_x;
|
||||||
dy = d_tile.tile_y;
|
dy = d_tile.tile_y;
|
||||||
|
|
@ -206,10 +216,18 @@ impl<'a> Board<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut need_generate = false;
|
let mut need_generate = false;
|
||||||
|
let mut steps: Vec<i32> = Vec::with_capacity(self.settings.tile_width as usize);
|
||||||
|
let mut next_step = x_start;
|
||||||
|
if x_step < 0 {
|
||||||
|
while next_step > x_end { steps.push(next_step); next_step += x_step }
|
||||||
|
} else {
|
||||||
|
while next_step < x_end { steps.push(next_step); next_step += x_step }
|
||||||
|
};
|
||||||
loop {
|
loop {
|
||||||
// move all tiles to right place
|
// move all tiles to right place
|
||||||
for row in 0..self.settings.tile_height {
|
for row in 0..self.settings.tile_height {
|
||||||
for col in range_step_inclusive(x_start, x_end, x_step) {
|
for col in steps.to_vec() {
|
||||||
|
|
||||||
match self.get_mut_tile(col, row) {
|
match self.get_mut_tile(col, row) {
|
||||||
None => {
|
None => {
|
||||||
match self.get_mut_next_tile(col, row, x_step, 0) {
|
match self.get_mut_next_tile(col, row, x_step, 0) {
|
||||||
|
|
@ -234,13 +252,13 @@ impl<'a> Board<'a> {
|
||||||
let mut sy = 0;
|
let mut sy = 0;
|
||||||
let mut dx = 0;
|
let mut dx = 0;
|
||||||
let mut dy = 0;
|
let mut dy = 0;
|
||||||
for col in range_step_inclusive(x_start, x_end, x_step) {
|
for col in steps.to_vec() {
|
||||||
match self.get_tile(col, row) {
|
match self.get_tile(col, row) {
|
||||||
Some(ref d_tile) => {
|
Some(ref d_tile) => {
|
||||||
match self.get_next_tile(col, row, x_step, 0) {
|
match self.get_next_tile(col, row, x_step, 0) {
|
||||||
Some(ref s_tile)
|
Some(ref s_tile)
|
||||||
if d_tile.score == s_tile.score
|
if d_tile.score == s_tile.score
|
||||||
&& self.get_tile_count(d_tile.tile_x, d_tile.tile_y) == 1 => {
|
&& self.get_tile_count(d_tile.tile_x, d_tile.tile_y) == 1 => {
|
||||||
found = true;
|
found = true;
|
||||||
dx = d_tile.tile_x;
|
dx = d_tile.tile_x;
|
||||||
dy = d_tile.tile_y;
|
dy = d_tile.tile_y;
|
||||||
|
|
@ -289,7 +307,7 @@ impl<'a> Board<'a> {
|
||||||
let mut x = x + step_x;
|
let mut x = x + step_x;
|
||||||
let mut y = y + step_y;
|
let mut y = y + step_y;
|
||||||
while x >= 0 && x < self.settings.tile_width
|
while x >= 0 && x < self.settings.tile_width
|
||||||
&& y >= 0 && y < self.settings.tile_height {
|
&& y >= 0 && y < self.settings.tile_height {
|
||||||
let tile = self.get_tile(x, y);
|
let tile = self.get_tile(x, y);
|
||||||
if tile.is_some() {
|
if tile.is_some() {
|
||||||
return tile;
|
return tile;
|
||||||
|
|
@ -305,7 +323,7 @@ impl<'a> Board<'a> {
|
||||||
let mut y = y + step_y;
|
let mut y = y + step_y;
|
||||||
let mut found = false;
|
let mut found = false;
|
||||||
while x >= 0 && x < self.settings.tile_width
|
while x >= 0 && x < self.settings.tile_width
|
||||||
&& y >= 0 && y < self.settings.tile_height {
|
&& y >= 0 && y < self.settings.tile_height {
|
||||||
let tile = self.get_tile(x, y);
|
let tile = self.get_tile(x, y);
|
||||||
if tile.is_some() {
|
if tile.is_some() {
|
||||||
found = true;
|
found = true;
|
||||||
|
|
@ -316,7 +334,7 @@ impl<'a> Board<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if found {
|
if found {
|
||||||
self.get_mut_tile(x, y)
|
self.get_mut_tile(x, y)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
@ -350,25 +368,25 @@ impl<'a> Board<'a> {
|
||||||
count
|
count
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_board(&self, c: &Context, gl: &mut Gl) {
|
fn render_board(&self, c: &Context, gl: &mut GlGraphics) {
|
||||||
Rectangle::new(rgb2rgba(self.settings.label_color))
|
Rectangle::new(rgb2rgba(self.settings.label_color))
|
||||||
.draw([self.settings.board_padding,
|
.draw([self.settings.board_padding,
|
||||||
self.settings.board_padding + self.settings.board_offset_y,
|
self.settings.board_padding + self.settings.board_offset_y,
|
||||||
self.settings.board_size[0],
|
self.settings.board_size[0],
|
||||||
self.settings.board_size[1]],
|
self.settings.board_size[1]],
|
||||||
default_draw_state(),
|
default_draw_state(),
|
||||||
c.transform,
|
c.transform,
|
||||||
gl);
|
gl);
|
||||||
|
|
||||||
let mut x = self.settings.board_padding + self.settings.tile_padding;
|
let mut x = self.settings.board_padding + self.settings.tile_padding;
|
||||||
let mut y = self.settings.board_padding + self.settings.board_offset_y + self.settings.tile_padding;
|
let mut y = self.settings.board_padding + self.settings.board_offset_y + self.settings.tile_padding;
|
||||||
for _ in 0..self.settings.tile_height {
|
for _ in 0..self.settings.tile_height {
|
||||||
for _ in 0..self.settings.tile_width {
|
for _ in 0..self.settings.tile_width {
|
||||||
Rectangle::new(rgb2rgba(self.settings.tiles_colors[0]))
|
Rectangle::new(rgb2rgba(self.settings.tiles_colors[0]))
|
||||||
.draw([x, y, self.settings.tile_size, self.settings.tile_size],
|
.draw([x, y, self.settings.tile_size, self.settings.tile_size],
|
||||||
default_draw_state(),
|
default_draw_state(),
|
||||||
c.transform,
|
c.transform,
|
||||||
gl);
|
gl);
|
||||||
|
|
||||||
x += self.settings.tile_padding + self.settings.tile_size;
|
x += self.settings.tile_padding + self.settings.tile_size;
|
||||||
}
|
}
|
||||||
|
|
@ -377,7 +395,7 @@ impl<'a> Board<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_tiles(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut Gl) {
|
fn render_tiles(&self, number_renderer: &NumberRenderer, c: &Context, gl: &mut GlGraphics) {
|
||||||
for tile in self.tiles.iter() {
|
for tile in self.tiles.iter() {
|
||||||
tile.render(number_renderer, c, gl);
|
tile.render(number_renderer, c, gl);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
13
src/main.rs
13
src/main.rs
|
|
@ -1,6 +1,3 @@
|
||||||
|
|
||||||
#![feature(core,collections,path_ext)]
|
|
||||||
|
|
||||||
extern crate rustc_serialize;
|
extern crate rustc_serialize;
|
||||||
extern crate rand;
|
extern crate rand;
|
||||||
|
|
||||||
|
|
@ -45,19 +42,19 @@ fn main() {
|
||||||
|
|
||||||
for e in window.events() {
|
for e in window.events() {
|
||||||
use piston::event::{ RenderEvent, PressEvent };
|
use piston::event::{ RenderEvent, PressEvent };
|
||||||
|
|
||||||
if let Some(ref args) = e.render_args() {
|
if let Some(ref args) = e.render_args() {
|
||||||
app.render(args, &mut gl);
|
app.render(args, &mut gl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref args) = e.update_args() {
|
if let Some(ref args) = e.update_args() {
|
||||||
app.update(args);
|
// TODO: only update if necessary
|
||||||
|
// println!("update");
|
||||||
|
app.update(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref args) = e.press_args() {
|
if let Some(ref args) = e.press_args() {
|
||||||
app.key_press(args);
|
app.key_press(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
for e in GameIterator::new(&mut window, &game_iter_settings) {
|
for e in GameIterator::new(&mut window, &game_iter_settings) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue