1 package Games::Wormy::Render;
6 use experimental 'switch';
9 use List::Util qw(sum max);
11 our $VERSION = '1.01';
14 bg => Imager::Color->new(255, 255, 255),
15 wall => Imager::Color->new( 0, 0, 0),
18 main => Imager::Color->new(hue => 120, v => 1, s => .67),
19 outer => Imager::Color->new(hue => 120, v => 1, s => .33),
22 bouncy => Imager::Color->new(hue => 180, v => 1, s => 1),
26 my ($self, $level) = @_;
29 my $field = Imager->new(xsize => $level->{width}, ysize => $level->{height});
30 $field->box(filled => 1, color => $COL{bg});
32 # initial player paths
34 my $DIRMULT = Math::Trig::pi() / 128;
35 for my $num (0 .. $#{ $level->{worms} }) {
36 my $player = $level->{worms}->[$num];
40 x2 => $player->{x} + sin($_ * $DIRMULT) * 15,
41 y2 => $player->{y} + cos($_ * $DIRMULT) * 15,
42 color => $COL{player}->[$num]->{outer},
43 ) for $player->{d} + 13, $player->{d} - 13;
47 x2 => $player->{x} + sin($player->{d} * $DIRMULT) * 20,
48 y2 => $player->{y} + cos($player->{d} * $DIRMULT) * 20,
49 color => $COL{player}->[$num]->{main},
55 color => $COL{player}->[$num]->{main},
62 xmin => $_, ymin => 0,
63 xmax => $_+1, ymax => $level->{height} - 1,
66 ) for 0, $level->{width} - 2;
68 ymin => $_, xmin => 2,
69 ymax => $_+1, xmax => $level->{width} - 1,
72 ) for 0, $level->{height} - 2;
75 for my $object (@{ $level->{objects} }) {
76 my @x = @$object{'x1', 'x2'};
77 my @y = @$object{'y1', 'y2'};
78 given ($object->{type}) {
91 [ $x[0], $y[0]], [ $x[1], $y[1]],
92 [++$x[1], $y[1]], [++$x[0], $y[0]],
93 [$x[0], ++$y[0]], [$x[1], ++$y[1]],
94 [--$x[1], $y[1]], [--$x[0], $y[0]],
104 ymax => $y[0] + $y[1],
121 for my $bouncy (@{ $level->{balls} }) {
123 xmin => $bouncy->{x},
124 ymin => $bouncy->{y},
125 xmax => $bouncy->{x} + 1,
126 ymax => $bouncy->{y} + 1,
127 color => $COL{bouncy},
137 # single level can be returned directly
138 return $self->level($_[0]) if @_ == 1;
140 # concatenate images of multiple levels
141 my $width = max map { $_->{width} } @_;
142 my $height = sum(map { $_->{height} + 1 } @_) - 1;
143 my $output = Imager->new(xsize => $width, ysize => $height);
144 $output->box(filled => 1, color => [64, 0, 0]);
147 $output->paste(src => $self->level($_), top => $height);
148 $height += $_->{height} + 1;