1 package Games::Wormy::Render;
6 use experimental 'switch';
9 use List::Util qw(sum max);
11 our $VERSION = '1.00';
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) = @_;
28 my $field = Imager->new(xsize => $level->{width}, ysize => $level->{height});
29 $field->box(filled => 1, color => $COL{bg});
31 # initial player paths
33 my $DIRMULT = Math::Trig::pi() / 128;
34 for my $num (0 .. $#{ $level->{worms} }) {
35 my $player = $level->{worms}->[$num];
39 x2 => $player->{x} + sin($_ * $DIRMULT) * 15,
40 y2 => $player->{y} + cos($_ * $DIRMULT) * 15,
41 color => $COL{player}->[$num]->{outer},
42 ) for $player->{d} + 13, $player->{d} - 13;
46 x2 => $player->{x} + sin($player->{d} * $DIRMULT) * 20,
47 y2 => $player->{y} + cos($player->{d} * $DIRMULT) * 20,
48 color => $COL{player}->[$num]->{main},
54 color => $COL{player}->[$num]->{main},
61 xmin => $_, ymin => 0,
62 xmax => $_+1, ymax => $level->{height} - 1,
65 ) for 0, $level->{width} - 2;
67 ymin => $_, xmin => 2,
68 ymax => $_+1, xmax => $level->{width} - 1,
71 ) for 0, $level->{height} - 2;
74 for my $object (@{ $level->{objects} }) {
75 my @x = @$object{'x1', 'x2'};
76 my @y = @$object{'y1', 'y2'};
77 given ($object->{type}) {
90 [ $x[0], $y[0]], [ $x[1], $y[1]],
91 [++$x[1], $y[1]], [++$x[0], $y[0]],
92 [$x[0], ++$y[0]], [$x[1], ++$y[1]],
93 [--$x[1], $y[1]], [--$x[0], $y[0]],
103 ymax => $y[0] + $y[1],
120 for my $bouncy (@{ $level->{balls} }) {
122 xmin => $bouncy->{x},
123 ymin => $bouncy->{y},
124 xmax => $bouncy->{x} + 1,
125 ymax => $bouncy->{y} + 1,
126 color => $COL{bouncy},
136 # single level can be returned directly
137 return $self->level($_[0]) if @_ == 1;
139 # concatenate images of multiple levels
140 my $width = max map { $_->{width} } @_;
141 my $height = sum(map { $_->{height} + 1 } @_) - 1;
142 my $output = Imager->new(xsize => $width, ysize => $height);
143 $output->box(filled => 1, color => [64, 0, 0]);
146 $output->paste(src => $self->level($_), top => $height);
147 $height += $_->{height} + 1;