Partikelexplosioner
Vi vill inte att fyrkanterna bara ska försvinna i tomma intet när dom träffas av en kula. Därför ska vi nu använda oss av Macroquads partikelsystem för att generera explosioner. Partikelsystemet kan effektivt skapa och rita många små partiklar på skärmen baserat på en grundkonfiguration. I vårt fall kommer partiklarna att åka ut från fyrkantens mittpunkt i alla riktningar. Vi kan senare lägga på en textur för att göra det ännu mer explosionsliknande.
Implementering
Lägg till crate
Koden för Macroquads partikelsystem ligger i en egen crate, därför behöver vi
lägga till den i vår Cargo.toml
fil. Det kan göras antingen genom att ändra
i filen eller att köra följande kommando.
cargo add macroquad-particles
Följande rad kommer att läggas till i filen Cargo.toml
under rubriken
[dependencies]
.
[package]
name = "my-game"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
macroquad = { version = "0.4" }
macroquad-particles = "0.2.2"
Version 0.2.0 av macroquad-particles stödjer inte senaste versionen av
Macroquad. Om du får felet "error[E0574]: expected struct, variant or union type, found enum 'ShaderSource'"
måste du använda macroquad och
macroquad-particles direkt från
git
tills detta är åtgärdat.
Importera crate
Överst i main.rs
måste vi importera det vi använder från paketet
macroquad_particles
.
use macroquad_particles::{self as particles, ColorCurve, Emitter, EmitterConfig};
Partikelkonfiguration
Vi kommer använda samma konfiguration för alla explosioner, och kommer bara
ändra dess storlek baserat på fyrkantens storlek. Därför skapar vi en funktion
som returnerar en EmitterConfig
som kan användas för att skapa en Emitter
.
En Emitter
är en punkt utifrån partiklar kan genereras.
fn particle_explosion() -> particles::EmitterConfig {
particles::EmitterConfig {
local_coords: false,
one_shot: true,
emitting: true,
lifetime: 0.6,
lifetime_randomness: 0.3,
explosiveness: 0.65,
initial_direction_spread: 2.0 * std::f32::consts::PI,
initial_velocity: 300.0,
initial_velocity_randomness: 0.8,
size: 3.0,
size_randomness: 0.3,
colors_curve: ColorCurve {
start: RED,
mid: ORANGE,
end: RED,
},
..Default::default()
}
}
Det finns en mängd sätt att konfigurera en Emitter
. Fälten för
EmitterConfig
finns beskrivna i dokumentationen för modulen macroquad-particles.
Vektor med explosioner
Vi behöver en vektor för att hålla reda på alla explosioner som inträffar. Den innehåller en tuple med en Emitter och koordinaten som den ska ritas ut på.
let mut explosions: Vec<(Emitter, Vec2)> = vec![];
När vi startar ett nytt spel behöver vi rensa vektorn med explosioner.
if is_key_pressed(KeyCode::Space) {
squares.clear();
bullets.clear();
explosions.clear();
circle.x = screen_width() / 2.0;
circle.y = screen_height() / 2.0;
score = 0;
game_state = GameState::Playing;
}
Skapa en explosion
När en fyrkant träffas av en kula så skapar vi en ny Emitter
baserat på
konfigurationen från particle_explosion()
med tillägget att antalet
partiklar som ska genereras baseras på fyrkantens storlek. Koordinaten som
partiklarna ska genereras ifrån sätts till samma som fyrkantens koordinater.
for square in squares.iter_mut() {
for bullet in bullets.iter_mut() {
if bullet.collides_with(square) {
bullet.collided = true;
square.collided = true;
score += square.size.round() as u32;
high_score = high_score.max(score);
explosions.push((
Emitter::new(EmitterConfig {
amount: square.size.round() as u32 * 2,
..particle_explosion()
}),
vec2(square.x, square.y),
));
}
}
}
Ta bort explosioner
När emittern har ritat färdigt alla partiklar så måste vi ta bort den ur
vektorn explosions
då vi inte ska rita ut den längre. Lägg till denna kod
efter fyrkanterna och kulorna har tagits bort.
explosions.retain(|(explosion, _)| explosion.config.emitting);
Rita ut explosioner
Efter att fyrkanterna har ritats ut kan vi gå igenom vektorn med explosioner och rita ut dem. Vi behöver bara skicka in vilken koordinat partiklarna ska genereras på, sedan hanterar emittern själv att slumpa fram alla partiklarna och flytta på dem.
for (explosion, coords) in explosions.iter_mut() {
explosion.draw(*coords);
}
Prova spelet och se om det blir explosioner när fyrkanterna beskjuts.
Läs dokumentationen för EmitterConfig
och prova vad som händer om du ändrar
olika värden. Kan du lägga till ett partikelsystem som skjuter ut rakt bakåt
från cirkeln så att det ser ut som en raketflamma.
Quiz
Testa dina nya kunskaper genom att svara på följande quiz innan du går vidare.