#!/usr/bin/env perl use SDL; use SDL::App; use SDL::Surface; use SDL::Rect; use SDL::Event; my $menu = new SDL::Surface -name => 'data/menu.png'; my $app = new SDL::App -w => $menu->width(), -h => $menu->height(), -resizeable => 1; my $hilight = new SDL::Surface -name => 'data/highlight.png'; my %menu = ( 'start' => [ 115, 30, 160, 40 ], 'help' => [ 120, 100, 120, 40 ], 'giveup' => [ 120, 230, 120, 40 ], 'spawnserver' => [ 115, 170, 165, 40 ], 'credits' => [ 115, 285, 160, 40 ], ); my $needblit; sub drawMenu { my ($a,$dx,$dy,$no,$hi,%m) = @_; for (keys %m) { my ($x,$y,$w,$h) = @{$m{$_}}; next unless $dx >= $x && $dx <= $x+$w && $dy >= $y && $dy <= $y+$h; unless ($needblit) { my $rect = new SDL::Rect -w => $w, -h => $h, -x => $x, -y => $y; $hi->blit($rect,$a,$rect); $needblit = 1; } return $_; } $no->blit(NULL,$a,NULL) if $needblit; $needblit = 0; return 0; } sub help { print STDERR < sub { my ($e) = @_; drawMenu($app, $e->motion_x(), $e->motion_y(), $menu, $hilight, %menu); }, SDL_MOUSEBUTTONUP() => sub { my ($e) = @_; my $routine = drawMenu($app, $e->motion_x(), $e->motion_y(), $menu, $hilight, %menu); &{$routine} if ($routine); }, SDL_QUIT() => sub { exit(0); }, SDL_KEYDOWN() => sub { my ($e) = @_; exit(0) if ($e->key_sym() == SDLK_ESCAPE); }, ); $menu->blit(NULL,$app,NULL); $app->sync(); $app->loop(\%events);