custom_drawable/
custom-drawable.rs

1use sfml::{
2    graphics::{
3        CircleShape, Color, Drawable, RectangleShape, RenderStates, RenderTarget, RenderWindow,
4        Shape, Transformable,
5    },
6    window::{Event, Key, Style},
7    SfResult,
8};
9
10/// Our custom drawable type. It looks like a bullet.
11struct Bullet<'s> {
12    head: CircleShape<'s>,
13    torso: RectangleShape<'s>,
14}
15
16impl Bullet<'_> {
17    pub fn new() -> Self {
18        let mut head = CircleShape::new(50.0, 50);
19        head.set_position((100.0, 100.0));
20        head.set_fill_color(Color::RED);
21        let mut torso = RectangleShape::with_size((100., 200.).into());
22        torso.set_position((100.0, 150.0));
23        torso.set_fill_color(Color::BLUE);
24
25        Self { head, torso }
26    }
27}
28
29// Implement the Drawable trait for our custom drawable.
30impl Drawable for Bullet<'_> {
31    fn draw<'a: 'shader, 'texture, 'shader, 'shader_texture>(
32        &'a self,
33        render_target: &mut dyn RenderTarget,
34        _: &RenderStates<'texture, 'shader, 'shader_texture>,
35    ) {
36        render_target.draw(&self.head);
37        render_target.draw(&self.torso)
38    }
39}
40
41fn main() -> SfResult<()> {
42    let mut window = RenderWindow::new(
43        (800, 600),
44        "Custom drawable",
45        Style::CLOSE,
46        &Default::default(),
47    )?;
48    window.set_vertical_sync_enabled(true);
49
50    let bullet = Bullet::new();
51
52    'mainloop: loop {
53        while let Some(event) = window.poll_event() {
54            match event {
55                Event::Closed
56                | Event::KeyPressed {
57                    code: Key::Escape, ..
58                } => break 'mainloop,
59                _ => {}
60            }
61        }
62
63        window.clear(Color::BLACK);
64        window.draw(&bullet);
65        window.display()
66    }
67    Ok(())
68}