Goo-Canvas
view release on metacpan or search on metacpan
bin/perltetris.pl view on Meta::CPAN
$window->show_all;
if ( defined $after_load_function
&& ref $after_load_function eq 'CODE' ) {
$after_load_function->();
}
Gtk2->main;
sub END {
write_history();
}
sub setting {
return if $game_start;
my $dia = Gtk2::Dialog->new(
gettext('Setting'), $window,
'modal', 'gtk-ok' => 'ok',
'gtk-cancel' => 'cancel',
);
my $vbox = $dia->vbox;
my $table = Gtk2::Table->new(2, 2);
my $label = Gtk2::Label->new(gettext("Start level"));
my $but = Gtk2::SpinButton->new_with_range(0, 10, 1);
$but->set_value($Config{start_level});
$table->attach_defaults($label, 0, 1, 0, 1);
$table->attach_defaults($but, 1, 2, 0, 1);
$vbox->add($table);
$vbox->show_all();
score(0);
my $response = $dia->run;
if ( $response eq 'ok' ) {
$Config{start_level} = $but->get_value;
$level = $Config{start_level};
update_label();
}
$dia->destroy;
}
sub about {
return if $game_start;
my $dia = Gtk2::AboutDialog->new();
$dia->set_authors(gettext('Ye Wenbin'));
$dia->run;
$dia->destroy;
}
sub stop_game {
if ( $timer ) {
Glib::Source->remove($timer);
}
remove_heading();
($score, $lines, $level) = (0, 0, $Config{start_level});
update_label();
$canvas->{table}->clear;
$canvas->{preview}->clear;
$game_start = 0;
}
sub create_menu {
my $menu_bar = Gtk2::MenuBar->new;
# File
my $file_menu = Gtk2::Menu->new;
# |- New
my $new_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-new', undef);
$new_menuitem->signal_connect('activate' => \&new_game);
$file_menu->append($new_menuitem);
# |- Stop
my $stop_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-close', undef);
$stop_menuitem->signal_connect('activate' => \&stop_game);
$file_menu->append($stop_menuitem);
# |- Rank
my $rank_menuitem = Gtk2::MenuItem->new_with_mnemonic(gettext('_Rank'));
$rank_menuitem->signal_connect( 'activate' => sub { rank_dia() } );
$file_menu->append($rank_menuitem);
# |- Exit
my $exit_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-quit', undef);
$exit_menuitem->signal_connect('activate' => sub { Gtk2->main_quit });
$file_menu->append($exit_menuitem);
# Setting
my $setting_menu = Gtk2::Menu->new;
# |- Settings
my $setting_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-preferences', undef);
$setting_menuitem->signal_connect('activate' => \&setting);
$setting_menu->append($setting_menuitem);
# Help
my $help_menu = Gtk2::Menu->new;
# |- About
my $about_menuitem = Gtk2::ImageMenuItem->new_from_stock('gtk-about', undef);
$about_menuitem->signal_connect('activate' => \&about);
$help_menu->append($about_menuitem);
my $file_menuitem = Gtk2::MenuItem->new(gettext("_File"));
$file_menuitem->set_submenu($file_menu);
$menu_bar->append( $file_menuitem );
my $setting_menuitem2 = Gtk2::MenuItem->new(gettext("_Setting"));
$setting_menuitem2->set_submenu($setting_menu);
$menu_bar->append($setting_menuitem2);
my $help_menuitem = Gtk2::MenuItem->new(gettext("_Help"));
$help_menuitem->set_submenu($help_menu);
$menu_bar->append($help_menuitem);
return $menu_bar;
}
sub create_canvas {
my $canvas = Goo::Canvas->new;
$canvas->set_size_request(330, 400);
my $root = $canvas->get_root_item;
my ($rows, $cols) = ($Config{rows}, $Config{cols});
my $offset = [ 10, 10 ];
my $border = 1;
my $padding = 16;
$canvas->{table} = Tetris::Table->new(
$root, $offset->[0], $offset->[1],
-columns => $cols,
-rows => $rows,
-border => $border,
);
my $px = $offset->[0]+($cols+( $border ? 2 : 0) )*Tetris::Cell::SIZE + $padding;
$canvas->{preview} = Tetris::Table->new(
$root, $px, $offset->[1],
-columns => 4,
-rows => 4,
-border => $border,
);
use_keymap( $window, $Config{keybindings} );
my $text_group = Goo::Canvas::Group->new($root);
$text_group->translate( $px, $offset->[1] + 7 * Tetris::Cell::SIZE );
my $text_spacing = 20;
my @label = (
Gtk2::Label->new(make_string('Scores', $score)),
Gtk2::Label->new(make_string('Lines', $lines)),
Gtk2::Label->new(make_string('Level', $level)),
);
foreach ( 0..$#label ) {
$label[$_]->set_alignment(0, 0);
Goo::Canvas::Widget->new(
$text_group, $label[$_], 0, $text_spacing*$_,
100, 20,
);
}
$canvas->{labels} = \@label;
# $canvas->{labels} = [
# Goo::Canvas::Text->new(
# $text_group, make_string('Scores', $score), 0, 0, -1, 'nw',
# ),
# Goo::Canvas::Text->new(
# $text_group, make_string("Lines", $lines), 0, $text_spacing, -1, 'nw',
# ),
# Goo::Canvas::Text->new(
# $text_group, make_string("Level", $level), 0, $text_spacing*2, -1, 'nw',
# )
# ];
return $canvas;
}
sub make_string {
my ($text, $num) = @_;
( run in 0.963 second using v1.01-cache-2.11-cpan-f56aa216473 )