Compare commits
2 Commits
17aa76ac61
...
fdce0a7d3b
Author | SHA1 | Date |
---|---|---|
Mark | fdce0a7d3b | |
Mark | e6a45a16a4 |
|
@ -1,7 +1,5 @@
|
||||||
use crate::physics::Pfloat;
|
pub const ZOOM_MIN: f32 = 200.0;
|
||||||
|
pub const ZOOM_MAX: f32 = 2000.0;
|
||||||
pub const ZOOM_MIN: Pfloat = 200.0;
|
|
||||||
pub const ZOOM_MAX: Pfloat = 2000.0;
|
|
||||||
|
|
||||||
/// Z-axis range for starfield stars
|
/// Z-axis range for starfield stars
|
||||||
/// This does not affect scale.
|
/// This does not affect scale.
|
||||||
|
|
|
@ -2,11 +2,10 @@ use anyhow::{bail, Context, Result};
|
||||||
use cgmath::{Deg, Point3};
|
use cgmath::{Deg, Point3};
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
use crate::physics::{Pfloat, Polar};
|
use crate::physics::Polar;
|
||||||
|
|
||||||
/// Toml file syntax
|
/// Toml file syntax
|
||||||
pub(in crate::content) mod toml {
|
pub(in crate::content) mod toml {
|
||||||
use super::Pfloat;
|
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
@ -26,10 +25,10 @@ pub(in crate::content) mod toml {
|
||||||
pub sprite: String,
|
pub sprite: String,
|
||||||
pub position: Position,
|
pub position: Position,
|
||||||
|
|
||||||
pub size: Pfloat,
|
pub size: f32,
|
||||||
|
|
||||||
pub radius: Option<Pfloat>,
|
pub radius: Option<f32>,
|
||||||
pub angle: Option<Pfloat>,
|
pub angle: Option<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
|
@ -42,16 +41,16 @@ pub(in crate::content) mod toml {
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct PolarCoords {
|
pub struct PolarCoords {
|
||||||
pub center: CoordinatesTwo,
|
pub center: CoordinatesTwo,
|
||||||
pub radius: Pfloat,
|
pub radius: f32,
|
||||||
pub angle: Pfloat,
|
pub angle: f32,
|
||||||
pub z: Pfloat,
|
pub z: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum CoordinatesTwo {
|
pub enum CoordinatesTwo {
|
||||||
Label(String),
|
Label(String),
|
||||||
Coords([Pfloat; 2]),
|
Coords([f32; 2]),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToString for CoordinatesTwo {
|
impl ToString for CoordinatesTwo {
|
||||||
|
@ -67,7 +66,7 @@ pub(in crate::content) mod toml {
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum CoordinatesThree {
|
pub enum CoordinatesThree {
|
||||||
Label(String),
|
Label(String),
|
||||||
Coords([Pfloat; 3]),
|
Coords([f32; 3]),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToString for CoordinatesThree {
|
impl ToString for CoordinatesThree {
|
||||||
|
@ -90,8 +89,8 @@ pub struct System {
|
||||||
pub struct Object {
|
pub struct Object {
|
||||||
pub sprite: String,
|
pub sprite: String,
|
||||||
pub position: Point3<f32>,
|
pub position: Point3<f32>,
|
||||||
pub size: Pfloat,
|
pub size: f32,
|
||||||
pub angle: Deg<Pfloat>,
|
pub angle: Deg<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function for resolve_position, never called on its own.
|
// Helper function for resolve_position, never called on its own.
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
use cgmath::Point2;
|
use cgmath::Point2;
|
||||||
|
|
||||||
use crate::physics::Pfloat;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct Camera {
|
pub struct Camera {
|
||||||
/// Camera center
|
/// Camera center
|
||||||
pub pos: Point2<Pfloat>,
|
pub pos: Point2<f32>,
|
||||||
|
|
||||||
/// Camera zoom
|
/// Camera zoom
|
||||||
/// (How many game units tall is the viewport?)
|
/// (How many game units tall is the viewport?)
|
||||||
pub zoom: Pfloat,
|
pub zoom: f32,
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::time::Instant;
|
||||||
use winit::event::{ElementState, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode};
|
use winit::event::{ElementState, MouseButton, MouseScrollDelta, TouchPhase, VirtualKeyCode};
|
||||||
|
|
||||||
use super::{ship::ShipKind, Camera, InputStatus, Ship, System};
|
use super::{ship::ShipKind, Camera, InputStatus, Ship, System};
|
||||||
use crate::{consts, content::Content, physics::Pfloat, render::Sprite, render::Spriteable};
|
use crate::{consts, content::Content, render::Sprite, render::Spriteable};
|
||||||
|
|
||||||
pub struct Game {
|
pub struct Game {
|
||||||
pub input: InputStatus,
|
pub input: InputStatus,
|
||||||
|
@ -40,18 +40,18 @@ impl Game {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self) {
|
pub fn update(&mut self) {
|
||||||
let t: Pfloat = self.last_update.elapsed().as_secs_f32();
|
let t: f32 = self.last_update.elapsed().as_secs_f32();
|
||||||
|
|
||||||
if self.input.key_thrust {
|
if self.input.key_thrust {
|
||||||
self.player.body.thrust(50.0 * t);
|
self.player.physicsbody.thrust(50.0 * t);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.input.key_right {
|
if self.input.key_right {
|
||||||
self.player.body.rot(Deg(35.0) * t);
|
self.player.physicsbody.rot(Deg(35.0) * t);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.input.key_left {
|
if self.input.key_left {
|
||||||
self.player.body.rot(Deg(-35.0) * t);
|
self.player.physicsbody.rot(Deg(-35.0) * t);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.input.v_scroll != 0.0 {
|
if self.input.v_scroll != 0.0 {
|
||||||
|
@ -60,8 +60,8 @@ impl Game {
|
||||||
self.input.v_scroll = 0.0;
|
self.input.v_scroll = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.player.body.tick(t);
|
self.player.physicsbody.tick(t);
|
||||||
self.camera.pos = self.player.body.pos;
|
self.camera.pos = self.player.physicsbody.pos;
|
||||||
|
|
||||||
self.last_update = Instant::now();
|
self.last_update = Instant::now();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
mod camera;
|
mod camera;
|
||||||
mod doodad;
|
|
||||||
mod game;
|
mod game;
|
||||||
mod inputstatus;
|
mod inputstatus;
|
||||||
mod ship;
|
mod ship;
|
||||||
mod system;
|
mod system;
|
||||||
|
mod systemobject;
|
||||||
|
|
||||||
pub use camera::Camera;
|
pub use camera::Camera;
|
||||||
pub use doodad::Doodad;
|
|
||||||
pub use game::Game;
|
pub use game::Game;
|
||||||
pub use inputstatus::InputStatus;
|
pub use inputstatus::InputStatus;
|
||||||
pub use ship::Ship;
|
pub use ship::Ship;
|
||||||
pub use system::System;
|
pub use system::System;
|
||||||
|
pub use systemobject::SystemObject;
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
use cgmath::Point2;
|
use cgmath::Point2;
|
||||||
|
|
||||||
use crate::{
|
use crate::{physics::PhysicsBody, render::Sprite, render::SpriteTexture, render::Spriteable};
|
||||||
physics::Pfloat, physics::PhysBody, render::Sprite, render::SpriteTexture, render::Spriteable,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub enum ShipKind {
|
pub enum ShipKind {
|
||||||
Gypsum,
|
Gypsum,
|
||||||
|
@ -17,7 +15,7 @@ impl ShipKind {
|
||||||
return SpriteTexture(name.to_owned());
|
return SpriteTexture(name.to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn size(&self) -> Pfloat {
|
fn size(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Self::Gypsum => 100.0,
|
Self::Gypsum => 100.0,
|
||||||
}
|
}
|
||||||
|
@ -25,14 +23,14 @@ impl ShipKind {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Ship {
|
pub struct Ship {
|
||||||
pub body: PhysBody,
|
pub physicsbody: PhysicsBody,
|
||||||
kind: ShipKind,
|
kind: ShipKind,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ship {
|
impl Ship {
|
||||||
pub fn new(kind: ShipKind, pos: Point2<Pfloat>) -> Self {
|
pub fn new(kind: ShipKind, pos: Point2<f32>) -> Self {
|
||||||
Ship {
|
Ship {
|
||||||
body: PhysBody::new(pos),
|
physicsbody: PhysicsBody::new(pos),
|
||||||
kind,
|
kind,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,9 +39,9 @@ impl Ship {
|
||||||
impl Spriteable for Ship {
|
impl Spriteable for Ship {
|
||||||
fn get_sprite(&self) -> Sprite {
|
fn get_sprite(&self) -> Sprite {
|
||||||
return Sprite {
|
return Sprite {
|
||||||
pos: (self.body.pos.x, self.body.pos.y, 1.0).into(),
|
pos: (self.physicsbody.pos.x, self.physicsbody.pos.y, 1.0).into(),
|
||||||
texture: self.kind.sprite(),
|
texture: self.kind.sprite(),
|
||||||
angle: self.body.angle,
|
angle: self.physicsbody.angle,
|
||||||
scale: 1.0,
|
scale: 1.0,
|
||||||
size: self.kind.size(),
|
size: self.kind.size(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,28 +1,26 @@
|
||||||
use cgmath::{Point3, Vector2};
|
use cgmath::{Point3, Vector2};
|
||||||
use rand::{self, Rng};
|
use rand::{self, Rng};
|
||||||
|
|
||||||
use super::Doodad;
|
use super::SystemObject;
|
||||||
use crate::{
|
use crate::{consts, content, render::Sprite, render::SpriteTexture, render::Spriteable};
|
||||||
consts, content, physics::Pfloat, render::Sprite, render::SpriteTexture, render::Spriteable,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub struct StarfieldStar {
|
pub struct StarfieldStar {
|
||||||
/// Star coordinates, in world space.
|
/// Star coordinates, in world space.
|
||||||
/// These are relative to the center of a starfield tile.
|
/// These are relative to the center of a starfield tile.
|
||||||
pub pos: Point3<Pfloat>,
|
pub pos: Point3<f32>,
|
||||||
|
|
||||||
/// Height in game units.
|
/// Height in game units.
|
||||||
/// Will be scaled for zoom, but not for distance.
|
/// Will be scaled for zoom, but not for distance.
|
||||||
pub size: Pfloat,
|
pub size: f32,
|
||||||
|
|
||||||
/// Color/brightness variation. Random between 0 and 1.
|
/// Color/brightness variation. Random between 0 and 1.
|
||||||
/// Used in starfield shader.
|
/// Used in starfield shader.
|
||||||
pub tint: Vector2<Pfloat>,
|
pub tint: Vector2<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct System {
|
pub struct System {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
bodies: Vec<Doodad>,
|
bodies: Vec<SystemObject>,
|
||||||
pub starfield: Vec<StarfieldStar>,
|
pub starfield: Vec<StarfieldStar>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +48,7 @@ impl System {
|
||||||
};
|
};
|
||||||
|
|
||||||
for o in &ct.objects {
|
for o in &ct.objects {
|
||||||
s.bodies.push(Doodad {
|
s.bodies.push(SystemObject {
|
||||||
pos: o.position,
|
pos: o.position,
|
||||||
sprite: SpriteTexture(o.sprite.to_owned()),
|
sprite: SpriteTexture(o.sprite.to_owned()),
|
||||||
size: o.size,
|
size: o.size,
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
use cgmath::{Deg, Point3};
|
use cgmath::{Deg, Point3};
|
||||||
|
|
||||||
use crate::{physics::Pfloat, render::Sprite, render::SpriteTexture, render::Spriteable};
|
use crate::{render::Sprite, render::SpriteTexture, render::Spriteable};
|
||||||
|
|
||||||
pub struct Doodad {
|
pub struct SystemObject {
|
||||||
pub sprite: SpriteTexture,
|
pub sprite: SpriteTexture,
|
||||||
pub pos: Point3<Pfloat>,
|
pub pos: Point3<f32>,
|
||||||
pub size: Pfloat,
|
pub size: f32,
|
||||||
pub angle: Deg<Pfloat>,
|
pub angle: Deg<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Spriteable for Doodad {
|
impl Spriteable for SystemObject {
|
||||||
fn get_sprite(&self) -> Sprite {
|
fn get_sprite(&self) -> Sprite {
|
||||||
return Sprite {
|
return Sprite {
|
||||||
texture: self.sprite.clone(),
|
texture: self.sprite.clone(),
|
|
@ -1,16 +1,15 @@
|
||||||
use super::Pfloat;
|
|
||||||
use cgmath::{Angle, Deg, Point2, Vector2};
|
use cgmath::{Angle, Deg, Point2, Vector2};
|
||||||
|
|
||||||
pub struct PhysBody {
|
pub struct PhysicsBody {
|
||||||
pub pos: Point2<Pfloat>,
|
pub pos: Point2<f32>,
|
||||||
pub vel: Vector2<Pfloat>,
|
pub vel: Vector2<f32>,
|
||||||
pub mass: Pfloat,
|
pub mass: f32,
|
||||||
pub angle: Deg<Pfloat>,
|
pub angle: Deg<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PhysBody {
|
impl PhysicsBody {
|
||||||
pub fn new(pos: Point2<Pfloat>) -> Self {
|
pub fn new(pos: Point2<f32>) -> Self {
|
||||||
return PhysBody {
|
return PhysicsBody {
|
||||||
pos,
|
pos,
|
||||||
vel: (0.0, 0.0).into(),
|
vel: (0.0, 0.0).into(),
|
||||||
mass: 0.3,
|
mass: 0.3,
|
||||||
|
@ -19,17 +18,17 @@ impl PhysBody {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calculate the position of this body after t seconds.
|
/// Calculate the position of this body after t seconds.
|
||||||
pub fn tick(&mut self, t: Pfloat) {
|
pub fn tick(&mut self, t: f32) {
|
||||||
self.pos += self.vel * t;
|
self.pos += self.vel * t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply an instantaneous force to this object
|
/// Apply an instantaneous force to this object
|
||||||
pub fn force(&mut self, v: Vector2<Pfloat>) {
|
pub fn force(&mut self, v: Vector2<f32>) {
|
||||||
self.vel += v / self.mass;
|
self.vel += v / self.mass;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply a force in the direction this object is pointing.
|
/// Apply a force in the direction this object is pointing.
|
||||||
pub fn thrust(&mut self, f: Pfloat) {
|
pub fn thrust(&mut self, f: f32) {
|
||||||
let l = Vector2 {
|
let l = Vector2 {
|
||||||
x: -self.angle.sin(),
|
x: -self.angle.sin(),
|
||||||
y: self.angle.cos(),
|
y: self.angle.cos(),
|
||||||
|
@ -38,7 +37,7 @@ impl PhysBody {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotate this object
|
// Rotate this object
|
||||||
pub fn rot(&mut self, a: Deg<Pfloat>) {
|
pub fn rot(&mut self, a: Deg<f32>) {
|
||||||
self.angle -= a;
|
self.angle -= a;
|
||||||
|
|
||||||
// Wrap angles
|
// Wrap angles
|
||||||
|
|
|
@ -2,7 +2,5 @@ mod body;
|
||||||
mod polar;
|
mod polar;
|
||||||
|
|
||||||
// What kind of float shoud we use for physics?
|
// What kind of float shoud we use for physics?
|
||||||
pub type Pfloat = f32;
|
pub use body::PhysicsBody;
|
||||||
|
|
||||||
pub use body::PhysBody;
|
|
||||||
pub use polar::Polar;
|
pub use polar::Polar;
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
use super::Pfloat;
|
|
||||||
use cgmath::{Angle, Deg, Point2, Vector2};
|
use cgmath::{Angle, Deg, Point2, Vector2};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct Polar {
|
pub struct Polar {
|
||||||
pub center: Point2<Pfloat>,
|
pub center: Point2<f32>,
|
||||||
pub radius: Pfloat,
|
pub radius: f32,
|
||||||
pub angle: Deg<Pfloat>,
|
pub angle: Deg<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Polar {
|
impl Polar {
|
||||||
pub fn to_cartesian(self) -> Point2<Pfloat> {
|
pub fn to_cartesian(self) -> Point2<f32> {
|
||||||
let v = Vector2 {
|
let v = Vector2 {
|
||||||
x: self.radius * self.angle.sin(),
|
x: self.radius * self.angle.sin(),
|
||||||
y: self.radius * self.angle.cos(),
|
y: self.radius * self.angle.cos(),
|
||||||
|
|
|
@ -16,7 +16,7 @@ use super::{
|
||||||
VertexBuffer,
|
VertexBuffer,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use crate::{consts, game::Game, physics::Pfloat};
|
use crate::{consts, game::Game};
|
||||||
|
|
||||||
pub struct GPUState {
|
pub struct GPUState {
|
||||||
device: wgpu::Device,
|
device: wgpu::Device,
|
||||||
|
@ -211,7 +211,7 @@ impl GPUState {
|
||||||
for s in game.get_sprites() {
|
for s in game.get_sprites() {
|
||||||
// Compute post-parallax position and distance-adjusted scale.
|
// Compute post-parallax position and distance-adjusted scale.
|
||||||
// We do this here so we can check if a sprite is on the screen.
|
// We do this here so we can check if a sprite is on the screen.
|
||||||
let pos: Point2<Pfloat> = {
|
let pos: Point2<f32> = {
|
||||||
(Point2 {
|
(Point2 {
|
||||||
x: s.pos.x,
|
x: s.pos.x,
|
||||||
y: s.pos.y,
|
y: s.pos.y,
|
||||||
|
|
|
@ -1,26 +1,25 @@
|
||||||
use cgmath::{Deg, Point3};
|
use cgmath::{Deg, Point3};
|
||||||
|
|
||||||
use super::SpriteTexture;
|
use super::SpriteTexture;
|
||||||
use crate::physics::Pfloat;
|
|
||||||
|
|
||||||
pub struct Sprite {
|
pub struct Sprite {
|
||||||
/// Name of the sprite to draw
|
/// Name of the sprite to draw
|
||||||
pub texture: SpriteTexture,
|
pub texture: SpriteTexture,
|
||||||
|
|
||||||
/// This object's position, in world coordinates.
|
/// This object's position, in world coordinates.
|
||||||
pub pos: Point3<Pfloat>,
|
pub pos: Point3<f32>,
|
||||||
|
|
||||||
/// The size of this sprite,
|
/// The size of this sprite,
|
||||||
/// given as height in world units.
|
/// given as height in world units.
|
||||||
pub size: Pfloat,
|
pub size: f32,
|
||||||
|
|
||||||
/// Scale factor.
|
/// Scale factor.
|
||||||
/// if this is 1, sprite height is exactly self.size.
|
/// if this is 1, sprite height is exactly self.size.
|
||||||
pub scale: Pfloat,
|
pub scale: f32,
|
||||||
|
|
||||||
/// This sprite's rotation
|
/// This sprite's rotation
|
||||||
/// (relative to north, measured ccw)
|
/// (relative to north, measured ccw)
|
||||||
pub angle: Deg<Pfloat>,
|
pub angle: Deg<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Spriteable {
|
pub trait Spriteable {
|
||||||
|
|
Loading…
Reference in New Issue