add turn updates with arrow keys etc
This commit is contained in:
parent
bcd0665c17
commit
a744a17695
2 changed files with 106 additions and 93 deletions
|
@ -4,7 +4,7 @@ extern crate serde_derive;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
extern crate octoon_math;
|
extern crate octoon_math;
|
||||||
|
|
||||||
use octoon_math::{Mat3, Vec3, One};
|
use octoon_math::{Mat3, Vec3};
|
||||||
|
|
||||||
mod utils;
|
mod utils;
|
||||||
mod types;
|
mod types;
|
||||||
|
@ -75,7 +75,6 @@ impl Circle {
|
||||||
|
|
||||||
let cos = alpha.cos();
|
let cos = alpha.cos();
|
||||||
let sin = alpha.sin();
|
let sin = alpha.sin();
|
||||||
// Mat3::rotate_z(alpha) *
|
|
||||||
Mat3::new(
|
Mat3::new(
|
||||||
0.3, 0.0, 0.0,
|
0.3, 0.0, 0.0,
|
||||||
0.0, 0.4, 0.0,
|
0.0, 0.4, 0.0,
|
||||||
|
@ -84,51 +83,51 @@ impl Circle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Line {
|
// struct Line {
|
||||||
x1: f32,
|
// x1: f32,
|
||||||
y1: f32,
|
// y1: f32,
|
||||||
x2: f32,
|
// x2: f32,
|
||||||
y2: f32,
|
// y2: f32,
|
||||||
a: f32,
|
// a: f32,
|
||||||
d: usize,
|
// d: usize,
|
||||||
}
|
// }
|
||||||
impl Line {
|
// impl Line {
|
||||||
pub fn new(p1: &types::Planet, p2: &types::Planet) -> Self {
|
// pub fn new(p1: &types::Planet, p2: &types::Planet) -> Self {
|
||||||
let dx = p1.x - p2.x;
|
// let dx = p1.x - p2.x;
|
||||||
let dy = p1.y - p2.y;
|
// let dy = p1.y - p2.y;
|
||||||
let a = dy.atan2(dx);
|
// let a = dy.atan2(dx);
|
||||||
// let a = (dy / dx).atan();
|
// // let a = (dy / dx).atan();
|
||||||
let d = (dx * dx + dy * dy).sqrt().ceil() as usize + 1;
|
// let d = (dx * dx + dy * dy).sqrt().ceil() as usize + 1;
|
||||||
|
|
||||||
Self {
|
// Self {
|
||||||
x1: p1.x,
|
// x1: p1.x,
|
||||||
x2: p2.x,
|
// x2: p2.x,
|
||||||
y1: p1.y,
|
// y1: p1.y,
|
||||||
y2: p2.y,
|
// y2: p2.y,
|
||||||
d, a,
|
// d, a,
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
pub fn get_for_remaining(&self, remaining: usize) -> (Mat3<f32>, Mat3<f32>) {
|
// pub fn get_for_remaining(&self, remaining: usize) -> (Mat3<f32>, Mat3<f32>) {
|
||||||
(
|
// (
|
||||||
self.get_remaining(remaining),
|
// self.get_remaining(remaining),
|
||||||
self.get_remaining((remaining + 1).min(self.d - 1)),
|
// self.get_remaining((remaining + 1).min(self.d - 1)),
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
|
|
||||||
fn get_remaining(&self, remaining: usize) -> Mat3<f32> {
|
// fn get_remaining(&self, remaining: usize) -> Mat3<f32> {
|
||||||
let x = (self.x1 * remaining as f32 + (self.d - remaining) as f32 * self.x2) / self.d as f32;
|
// let x = (self.x1 * remaining as f32 + (self.d - remaining) as f32 * self.x2) / self.d as f32;
|
||||||
// let x = self.x1 + (remaining as f32 / self.d as f32) * (self.x2 - self.x1);
|
// // let x = self.x1 + (remaining as f32 / self.d as f32) * (self.x2 - self.x1);
|
||||||
let y = (self.y1 * remaining as f32 + (self.d - remaining) as f32 * self.y2) / self.d as f32;
|
// let y = (self.y1 * remaining as f32 + (self.d - remaining) as f32 * self.y2) / self.d as f32;
|
||||||
|
|
||||||
// let y = self.y1 + (remaining as f32 / self.d as f32) * (self.y2 - self.y1);
|
// // let y = self.y1 + (remaining as f32 / self.d as f32) * (self.y2 - self.y1);
|
||||||
Mat3::new(
|
// Mat3::new(
|
||||||
0.3, 0.0, 0.0,
|
// 0.3, 0.0, 0.0,
|
||||||
0.0, 0.3, 0.0,
|
// 0.0, 0.3, 0.0,
|
||||||
x, y, 0.3,
|
// x, y, 0.3,
|
||||||
) * Mat3::rotate_z(self.a)
|
// ) * Mat3::rotate_z(self.a)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
|
@ -154,13 +153,9 @@ impl Game {
|
||||||
utils::set_panic_hook();
|
utils::set_panic_hook();
|
||||||
|
|
||||||
// First line is fucked but we just filter out things that cannot parse
|
// First line is fucked but we just filter out things that cannot parse
|
||||||
let mut states: Vec<types::State> = file.split("\n").filter_map(|line|
|
let states: Vec<types::State> = file.split("\n").filter_map(|line|
|
||||||
serde_json::from_str(line).ok()
|
serde_json::from_str(line).ok()
|
||||||
).collect();
|
).collect();
|
||||||
states.push(types::State {
|
|
||||||
planets: states.last().unwrap().planets.clone(),
|
|
||||||
expeditions: Vec::new()
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut planet_map = HashMap::new();
|
let mut planet_map = HashMap::new();
|
||||||
|
|
||||||
|
@ -204,11 +199,13 @@ impl Game {
|
||||||
self.states.len()
|
self.states.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_turn(&mut self, turn: usize) {
|
pub fn update_turn(&mut self, turn: usize) -> usize {
|
||||||
self.turn = turn.min(self.states.len() -1);
|
self.turn = turn.min(self.states.len() -1);
|
||||||
|
|
||||||
self.update_planet_colours();
|
self.update_planet_colours();
|
||||||
self.update_ship_locations()
|
self.update_ship_locations();
|
||||||
|
|
||||||
|
self.turn
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_planet_colours(&mut self) {
|
fn update_planet_colours(&mut self) {
|
||||||
|
@ -242,12 +239,6 @@ impl Game {
|
||||||
}).collect();
|
}).collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn add_location(&mut self, x: f32, y: f32, angle: f32) {
|
|
||||||
// self.current_turn.push(
|
|
||||||
// Location { x, y, angle}
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub fn get_max_ships(&self) -> usize {
|
pub fn get_max_ships(&self) -> usize {
|
||||||
self.states.iter().map(|s| s.expeditions.len()).max().unwrap()
|
self.states.iter().map(|s| s.expeditions.len()).max().unwrap()
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,6 +125,43 @@ class GameInstance {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_update_state() {
|
||||||
|
const colours = f32v(this.game.get_planet_colors(), this.planet_count * 6);
|
||||||
|
for(let i=0; i < this.planet_count; i++){
|
||||||
|
const u = new Uniform3f(colours[i*6], colours[i*6 + 1], colours[i*6 + 2]);
|
||||||
|
this.renderer.updateUniform(i, (us) => us["u_color"] = u);
|
||||||
|
const u2 = new Uniform3f(colours[i*6 + 3], colours[i*6 + 4], colours[i*6 + 5]);
|
||||||
|
this.renderer.updateUniform(i, (us) => us["u_color_next"] = u2);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ships = f32v(this.game.get_ship_locations(), this.game.get_ship_count() * 9 * 2);
|
||||||
|
const ship_colours = f32v(this.game.get_ship_colours(), this.game.get_ship_count() * 3);
|
||||||
|
|
||||||
|
for (let i=0; i < this.game.get_max_ships(); i++) {
|
||||||
|
const index = this.ship_indices[i];
|
||||||
|
if (i < this.game.get_ship_count()) {
|
||||||
|
|
||||||
|
this.renderer.enableRendershit(index);
|
||||||
|
|
||||||
|
const u = new Uniform3f(ship_colours[i*3], ship_colours[i*3 + 1], ship_colours[i*3 + 2]);
|
||||||
|
// const t1 = new UniformMatrix3fv(new Float32Array(ships, i * 18, 9));
|
||||||
|
// const t2 = new UniformMatrix3fv(new Float32Array(ships, i * 18 + 9, 9));
|
||||||
|
|
||||||
|
const t1 = new UniformMatrix3fv(ships.slice(i * 18, i * 18 + 9));
|
||||||
|
const t2 = new UniformMatrix3fv(ships.slice(i * 18 + 9, i * 18 + 18));
|
||||||
|
|
||||||
|
this.renderer.updateUniform(index, (us) => {
|
||||||
|
us["u_color"] = u;
|
||||||
|
us["u_color_next"] = u;
|
||||||
|
us["u_trans"] = t1;
|
||||||
|
us["u_trans_next"] = t2;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.renderer.disableRenderShift(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render(time: number) {
|
render(time: number) {
|
||||||
COUNTER.frame(time);
|
COUNTER.frame(time);
|
||||||
|
|
||||||
|
@ -135,43 +172,7 @@ class GameInstance {
|
||||||
if (time > this.last_time + 500) {
|
if (time > this.last_time + 500) {
|
||||||
|
|
||||||
this.last_time = time;
|
this.last_time = time;
|
||||||
this.frame ++;
|
this.updateTurn(this.frame + 1);
|
||||||
this.game.update_turn(this.frame);
|
|
||||||
|
|
||||||
const colours = f32v(this.game.get_planet_colors(), this.planet_count * 6);
|
|
||||||
for(let i=0; i < this.planet_count; i++){
|
|
||||||
const u = new Uniform3f(colours[i*6], colours[i*6 + 1], colours[i*6 + 2]);
|
|
||||||
this.renderer.updateUniform(i, (us) => us["u_color"] = u);
|
|
||||||
const u2 = new Uniform3f(colours[i*6 + 3], colours[i*6 + 4], colours[i*6 + 5]);
|
|
||||||
this.renderer.updateUniform(i, (us) => us["u_color_next"] = u2);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ships = f32v(this.game.get_ship_locations(), this.game.get_ship_count() * 9 * 2);
|
|
||||||
const ship_colours = f32v(this.game.get_ship_colours(), this.game.get_ship_count() * 3);
|
|
||||||
|
|
||||||
for (let i=0; i < this.game.get_max_ships(); i++) {
|
|
||||||
const index = this.ship_indices[i];
|
|
||||||
if (i < this.game.get_ship_count()) {
|
|
||||||
|
|
||||||
this.renderer.enableRendershit(index);
|
|
||||||
|
|
||||||
const u = new Uniform3f(ship_colours[i*3], ship_colours[i*3 + 1], ship_colours[i*3 + 2]);
|
|
||||||
// const t1 = new UniformMatrix3fv(new Float32Array(ships, i * 18, 9));
|
|
||||||
// const t2 = new UniformMatrix3fv(new Float32Array(ships, i * 18 + 9, 9));
|
|
||||||
|
|
||||||
const t1 = new UniformMatrix3fv(ships.slice(i * 18, i * 18 + 9));
|
|
||||||
const t2 = new UniformMatrix3fv(ships.slice(i * 18 + 9, i * 18 + 18));
|
|
||||||
|
|
||||||
this.renderer.updateUniform(index, (us) => {
|
|
||||||
us["u_color"] = u;
|
|
||||||
us["u_color_next"] = u;
|
|
||||||
us["u_trans"] = t1;
|
|
||||||
us["u_trans_next"] = t2;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.renderer.disableRenderShift(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GL.bindFramebuffer(GL.FRAMEBUFFER, null);
|
GL.bindFramebuffer(GL.FRAMEBUFFER, null);
|
||||||
|
@ -188,6 +189,17 @@ class GameInstance {
|
||||||
this.renderer.render(GL);
|
this.renderer.render(GL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateTurn(turn: number) {
|
||||||
|
this.frame = Math.max(0, turn);
|
||||||
|
const new_frame = this.game.update_turn(this.frame);
|
||||||
|
if (new_frame < this.frame) {
|
||||||
|
this.frame = new_frame;
|
||||||
|
this.playing = false;
|
||||||
|
} else {
|
||||||
|
this._update_state();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
handleKey(event: KeyboardEvent) {
|
handleKey(event: KeyboardEvent) {
|
||||||
console.log(event.keyCode);
|
console.log(event.keyCode);
|
||||||
console.log(event.key);
|
console.log(event.key);
|
||||||
|
@ -199,7 +211,17 @@ class GameInstance {
|
||||||
} else {
|
} else {
|
||||||
this.playing = true;
|
this.playing = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arrow left
|
||||||
|
if (event.keyCode == 37) {
|
||||||
|
// This feels more natural than -1 what it should be, I think
|
||||||
|
this.updateTurn(this.frame - 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arrow right
|
||||||
|
if (event.keyCode == 39) {
|
||||||
|
this.updateTurn(this.frame + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue