1 package Games::Wormy::Render;
8 use List::Util qw(sum max);
10 our $VERSION = '1.00';
13 bg => Imager::Color->new(255, 255, 255),
14 wall => Imager::Color->new( 0, 0, 0),
17 main => Imager::Color->new(hue => 120, v => 1, s => .67),
18 outer => Imager::Color->new(hue => 120, v => 1, s => .33),
21 bouncy => Imager::Color->new(hue => 180, v => 1, s => 1),
25 my ($self, $level) = @_;
27 my $field = Imager->new(xsize => $level->{width}, ysize => $level->{height});
28 $field->box(filled => 1, color => $COL{bg});
30 # initial player paths
32 my $DIRMULT = Math::Trig::pi() / 128;
33 for my $num (0 .. $#{ $level->{worms} }) {
34 my $player = $level->{worms}->[$num];
38 x2 => $player->{x} + sin($_ * $DIRMULT) * 15,
39 y2 => $player->{y} + cos($_ * $DIRMULT) * 15,
40 color => $COL{player}->[$num]->{outer},
41 ) for $player->{d} + 13, $player->{d} - 13;
45 x2 => $player->{x} + sin($player->{d} * $DIRMULT) * 20,
46 y2 => $player->{y} + cos($player->{d} * $DIRMULT) * 20,
47 color => $COL{player}->[$num]->{main},
53 color => $COL{player}->[$num]->{main},
60 xmin => $_, ymin => 0,
61 xmax => $_+1, ymax => $level->{height} - 1,
64 ) for 0, $level->{width} - 2;
66 ymin => $_, xmin => 2,
67 ymax => $_+1, xmax => $level->{width} - 1,
70 ) for 0, $level->{height} - 2;
73 for my $object (@{ $level->{objects} }) {
74 my @x = @$object{'x1', 'x2'};
75 my @y = @$object{'y1', 'y2'};
76 given ($object->{type}) {
89 [ $x[0], $y[0]], [ $x[1], $y[1]],
90 [++$x[1], $y[1]], [++$x[0], $y[0]],
91 [$x[0], ++$y[0]], [$x[1], ++$y[1]],
92 [--$x[1], $y[1]], [--$x[0], $y[0]],
102 ymax => $y[0] + $y[1],
119 for my $bouncy (@{ $level->{balls} }) {
121 xmin => $bouncy->{x},
122 ymin => $bouncy->{y},
123 xmax => $bouncy->{x} + 1,
124 ymax => $bouncy->{y} + 1,
125 color => $COL{bouncy},
135 # single level can be returned directly
136 return $self->level($_[0]) if @_ == 1;
138 # concatenate images of multiple levels
139 my $width = max map { $_->{width} } @_;
140 my $height = sum(map { $_->{height} + 1 } @_) - 1;
141 my $output = Imager->new(xsize => $width, ysize => $height);
142 $output->box(filled => 1, color => [64, 0, 0]);
145 $output->paste(src => $self->level($_), top => $height);
146 $height += $_->{height} + 1;