custom_drawable/
custom-drawable.rs1use sfml::{
2 graphics::{
3 CircleShape, Color, Drawable, RectangleShape, RenderStates, RenderTarget, RenderWindow,
4 Shape, Transformable,
5 },
6 window::{Event, Key, Style},
7 SfResult,
8};
9
10struct 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
29impl 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}