Shooter demo spawns random enemies

This commit is contained in:
Quinn Painter 2023-04-11 20:58:34 +01:00
parent 28a7c84b98
commit 4f3ac0a33a
9 changed files with 125 additions and 138 deletions

View File

@ -86,7 +86,7 @@ dependencies = [
[[package]]
name = "ironds"
version = "0.1.0"
source = "git+https://github.com/QuinnPainter/ironds#033d372ea0aec941e53a287f203b678821bdc843"
source = "git+https://github.com/QuinnPainter/ironds#37c85508588492054e84abedc0a2f0020e1b8f1b"
dependencies = [
"bitfield-struct",
"bitflags",
@ -123,6 +123,12 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "randomize"
version = "4.0.0-alpha.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f542bc38e3f3ddef024f3403748744afb354559ec0ed95380f050713ea9b9b54"
[[package]]
name = "rustc-hash"
version = "1.1.0"
@ -136,6 +142,7 @@ dependencies = [
"cordic",
"fixed",
"ironds",
"randomize",
"sandstone_common",
]
@ -179,9 +186,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.13"
version = "2.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec"
checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5"
dependencies = [
"proc-macro2",
"quote",

View File

@ -86,7 +86,7 @@ dependencies = [
[[package]]
name = "ironds"
version = "0.1.0"
source = "git+https://github.com/QuinnPainter/ironds#033d372ea0aec941e53a287f203b678821bdc843"
source = "git+https://github.com/QuinnPainter/ironds#37c85508588492054e84abedc0a2f0020e1b8f1b"
dependencies = [
"bitfield-struct",
"bitflags",
@ -166,18 +166,18 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.159"
version = "1.0.160"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065"
checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.159"
version = "1.0.160"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585"
checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
dependencies = [
"proc-macro2",
"quote",
@ -186,9 +186,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.13"
version = "2.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec"
checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5"
dependencies = [
"proc-macro2",
"quote",

View File

@ -1,3 +1,5 @@
use sandstone::node::Node;
use sandstone::pool::Handle;
use sandstone::{Script, ScriptContext};
use sandstone::fixed::types::*;
use sandstone::hierarchy::HierarchyPoolTrait;
@ -16,26 +18,27 @@ impl Script for BulletScript {
fn update(&mut self, context: &mut ScriptContext) {
let node = context.hierarchy.borrow_mut(context.handle);
node.transform.y -= BULLET_SPEED;
if node.transform.y < -64 {
context.hierarchy.destroy_node(context.handle);
}
let node = context.hierarchy.borrow(context.handle);
let child = context.hierarchy.borrow(node.child_handle.unwrap());
let collider_handle = if let sandstone::node::NodeExtensionHandle::RectCollider(n) = child.node_extension {
n
} else {
panic!("");
let sandstone::node::NodeExtensionHandle::RectCollider(collider_handle) = child.node_extension else {
panic!("Bullet has no Collider");
};
let mut died = false;
let mut hit_enemy_handle: Option<Handle<Node>> = None;
let collider = context.hierarchy.borrow(collider_handle);
for intersecting_node_handle in collider.intersect_list.iter() {
//ds::nocash::print(&context.hierarchy.borrow(*intersecting_node_handle).name);
if context.hierarchy.borrow(*intersecting_node_handle).name.contains("Enemy") {
//ds::nocash::print("died");
died = true;
hit_enemy_handle = Some(*intersecting_node_handle);
}
}
if died {
if let Some(hit_enemy_handle) = hit_enemy_handle {
context.hierarchy.destroy_node(context.handle);
let enemy_handle = context.hierarchy.borrow(hit_enemy_handle).parent_handle.unwrap();
context.hierarchy.destroy_node(enemy_handle);
}
}
}

View File

@ -0,0 +1,48 @@
use sandstone::{Script, ScriptContext};
use sandstone::fixed::types::*;
use sandstone::hierarchy::HierarchyPoolTrait;
const SPEED: I20F12 = I20F12::lit("3");
#[derive(Default)]
pub struct EnemyScript {
pub x_velocity: I20F12,
pub y_velocity: I20F12,
}
sandstone::register_script!(EnemyScript, 5);
impl Script for EnemyScript {
fn start(&mut self, _context: &mut ScriptContext) {
}
fn update(&mut self, context: &mut ScriptContext) {
let node = context.hierarchy.borrow_mut(context.handle);
node.transform.y += self.y_velocity * SPEED;
node.transform.x += self.x_velocity * SPEED;
if node.transform.y > 192*2 {
context.hierarchy.destroy_node(context.handle);
}
/*let node = context.hierarchy.borrow(context.handle);
let child = context.hierarchy.borrow(node.child_handle.unwrap());
let collider_handle = if let sandstone::node::NodeExtensionHandle::RectCollider(n) = child.node_extension {
n
} else {
panic!("");
};
let mut died = false;
let collider = context.hierarchy.borrow(collider_handle);
for intersecting_node_handle in collider.intersect_list.iter() {
//ds::nocash::print(&context.hierarchy.borrow(*intersecting_node_handle).name);
if context.hierarchy.borrow(*intersecting_node_handle).name.contains("Enemy") {
//ds::nocash::print("died");
died = true;
}
}
if died {
context.hierarchy.destroy_node(context.handle);
}*/
}
}

View File

@ -4,13 +4,46 @@ use sandstone::hierarchy::HierarchyPoolTrait;
#[derive(Default)]
pub struct EnemySpawnerScript {
enemy_spawn_countdown: u32,
}
sandstone::register_script!(EnemySpawnerScript, 4);
impl Script for EnemySpawnerScript {
fn start(&mut self, _context: &mut ScriptContext) {
self.enemy_spawn_countdown = 20;
}
fn update(&mut self, context: &mut ScriptContext) {
self.enemy_spawn_countdown -= 1;
if self.enemy_spawn_countdown == 0 {
spawn_enemy(context);
self.enemy_spawn_countdown = 60;
}
}
}
fn spawn_enemy(context: &mut ScriptContext) {
let new_enemy_x = sandstone::random::rand_i32_in_range(0, 256);
let new_enemy_angle =
I20F12::from_num(sandstone::random::rand_i32_in_range(-128, 128))
/ 128 // number from -1 to 1
/ 3; // number from -0.333 to 0.333
let new_enemy_handle = context.hierarchy.spawn_object("Enemy", context.handle);
let new_enemy = context.hierarchy.borrow_mut(new_enemy_handle);
new_enemy.transform.x = I20F12::from_num(new_enemy_x);
new_enemy.transform.y = I20F12::lit("-32");
let enemy_script = new_enemy.cast_script_mut::<crate::EnemyScript>();
let (sin, cos) = sandstone::cordic::sin_cos(-new_enemy_angle);
(enemy_script.x_velocity, enemy_script.y_velocity) = (sin, cos);
let sandstone::node::NodeExtensionHandle::Sprite(sprite_handle) = new_enemy.node_extension else {
panic!("Enemy had no Sprite");
};
let enemy_sprite = context.hierarchy.borrow_mut(sprite_handle);
let sandstone::node::sprite::SpriteType::Affine(aff) = &mut enemy_sprite.sprite_type else {
panic!("Enemy's Sprite was not affine");
};
aff.rotation = new_enemy_angle;
}

View File

@ -12,3 +12,6 @@ pub use player::PlayerScript;
pub mod enemy_spawner;
pub use enemy_spawner::EnemySpawnerScript;
pub mod enemy;
pub use enemy::EnemyScript;

View File

@ -3,6 +3,7 @@ use sandstone::ironds::{input, display::console};
#[derive(Default)]
pub struct MenuScript {
start_counter: u64,
}
sandstone::register_script!(MenuScript, 3);
@ -13,11 +14,14 @@ impl Script for MenuScript {
}
fn update(&mut self, context: &mut ScriptContext) {
self.start_counter += 1;
let keys = input::read_keys();
if keys.contains(input::Buttons::A) || keys.contains(input::Buttons::START) {
// Clear press start text
console::set_cursor_pos(11, 15);
console::print(" ");
// Seed random number generator with the time since starting
sandstone::random::seed(self.start_counter);
context.hierarchy.set_scene("GameScene");
}
}

View File

@ -20,34 +20,17 @@ impl Script for PlayerScript {
fn update(&mut self, context: &mut ScriptContext) {
let node = context.hierarchy.borrow_mut(context.handle);
let keys = input::read_keys();
let sandstone::node::NodeExtensionHandle::Sprite(s) = node.node_extension else {
panic!("f");
};
let node_sprite = context.hierarchy.borrow_mut(s);
let sandstone::node::sprite::SpriteType::Affine(aff) = &mut node_sprite.sprite_type else {
panic!("f");
};
if keys.contains(input::Buttons::UP) {
aff.scale_y += I20F12::lit("0.02");
//node.transform.y -= SPEED;
node.transform.y -= SPEED;
}
if keys.contains(input::Buttons::DOWN) {
aff.scale_y -= I20F12::lit("0.02");
//node.transform.y += SPEED;
node.transform.y += SPEED;
}
if keys.contains(input::Buttons::LEFT) {
aff.scale_x -= I20F12::lit("0.02");
//node.transform.x -= SPEED;
node.transform.x -= SPEED;
}
if keys.contains(input::Buttons::RIGHT) {
aff.scale_x += I20F12::lit("0.02");
//node.transform.x += SPEED;
}
if keys.contains(input::Buttons::L) {
aff.rotation -= I20F12::lit("0.02");
}
if keys.contains(input::Buttons::R) {
aff.rotation += I20F12::lit("0.02");
node.transform.x += SPEED;
}
if keys.contains(input::Buttons::A) &&
self.shoot_cooldown > SHOOT_COOLDOWN_RELOAD

View File

@ -5,7 +5,7 @@
(
nodes: [
(
child_index: Some(9),
child_index: Some(5),
parent_index: None,
sibling_index: None,
name: "GameScene",
@ -36,17 +36,7 @@
),
node_extension: Sprite((
graphic_asset: "playerShip2_small",
sprite_type: Affine((
rotation: (
bits: 0,
),
scale_x: (
bits: 4096,
),
scale_y: (
bits: 4096,
),
)),
sprite_type: Normal,
)),
script_type_id: Some(1),
enabled: true,
@ -119,90 +109,6 @@
child_index: None,
parent_index: Some(0),
sibling_index: Some(2),
name: "Enemy 1",
transform: (
x: (
bits: 221184,
),
y: (
bits: 372736,
),
),
node_extension: Sprite((
graphic_asset: "enemyRed3",
sprite_type: Normal,
)),
script_type_id: None,
enabled: true,
),
(
child_index: None,
parent_index: Some(0),
sibling_index: Some(5),
name: "Enemy 2",
transform: (
x: (
bits: 385024,
),
y: (
bits: 372736,
),
),
node_extension: Sprite((
graphic_asset: "enemyRed3",
sprite_type: Normal,
)),
script_type_id: None,
enabled: true,
),
(
child_index: Some(8),
parent_index: Some(0),
sibling_index: Some(6),
name: "Enemy 3",
transform: (
x: (
bits: 548864,
),
y: (
bits: 372736,
),
),
node_extension: Sprite((
graphic_asset: "enemyRed3",
sprite_type: Normal,
)),
script_type_id: None,
enabled: true,
),
(
child_index: None,
parent_index: Some(7),
sibling_index: None,
name: "Enemy Collider",
transform: (
x: (
bits: 0,
),
y: (
bits: 0,
),
),
node_extension: RectCollider((
width: (
bits: 118784,
),
height: (
bits: 114688,
),
)),
script_type_id: None,
enabled: true,
),
(
child_index: None,
parent_index: Some(0),
sibling_index: Some(7),
name: "EnemySpawner",
transform: (
x: (
@ -213,7 +119,7 @@
),
),
node_extension: None,
script_type_id: None,
script_type_id: Some(4),
enabled: true,
),
],
@ -376,7 +282,7 @@
),
)),
)),
script_type_id: None,
script_type_id: Some(5),
enabled: true,
),
(