mirror of
https://github.com/QuinnPainter/sandstone.git
synced 2025-06-18 19:15:39 -04:00
Shooter demo spawns random enemies
This commit is contained in:
parent
28a7c84b98
commit
4f3ac0a33a
13
pong-demo/code/Cargo.lock
generated
13
pong-demo/code/Cargo.lock
generated
@ -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",
|
||||
|
14
shooter-demo/code/Cargo.lock
generated
14
shooter-demo/code/Cargo.lock
generated
@ -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",
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
48
shooter-demo/code/src/enemy.rs
Normal file
48
shooter-demo/code/src/enemy.rs
Normal 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);
|
||||
}*/
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -12,3 +12,6 @@ pub use player::PlayerScript;
|
||||
|
||||
pub mod enemy_spawner;
|
||||
pub use enemy_spawner::EnemySpawnerScript;
|
||||
|
||||
pub mod enemy;
|
||||
pub use enemy::EnemyScript;
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
),
|
||||
(
|
||||
|
Loading…
Reference in New Issue
Block a user