--- deliantra/Deliantra-Client/bin/pclient 2006/04/09 01:21:11 1.41 +++ deliantra/Deliantra-Client/bin/pclient 2006/04/09 22:12:12 1.52 @@ -42,11 +42,16 @@ our @GL_INIT; # hooks called on every gl init our $ALT_ENTER_MESSAGE; +our $STATUS_LINE; our $TOPLEVEL; our $tw; # Test widget #d# +my $last_refresh; +my %ANIMATE; +my $refresh_handler; + sub init_screen { $SDL_APP = new SDL::App -flags => SDL_ANYFORMAT | SDL_HWSURFACE, @@ -54,13 +59,16 @@ -width => $WIDTH, -height => $HEIGHT, -opengl => 1, - -red_size => 8, - -green_size => 8, - -blue_size => 8, + -red_size => 5, + -green_size => 5, + -blue_size => 5, + -alpha_size => 0, -double_buffer => 1, -fullscreen => $FULLSCREEN, -resizeable => 0; + $last_refresh = SDL::GetTicks; + %GL_EXT = map +($_ => 1), split /\s+/, Crossfire::Client::gl_extensions; $GL_EXT{GL_ARB_texture_non_power_of_two} @@ -68,23 +76,7 @@ $FONTSIZE = int $HEIGHT / 50; - $ALT_ENTER_MESSAGE = new Crossfire::Client::Widget::Label - 0, $FONTSIZE, $HEIGHT - $FONTSIZE, $FONTSIZE, - "Use Alt-Enter to toggle fullscreen mode"; - $ALT_ENTER_MESSAGE->move (0, $HEIGHT - ($ALT_ENTER_MESSAGE->size_request)[1]); - $TOPLEVEL->add ($ALT_ENTER_MESSAGE); - - # Test code #d# - { - my $frm = new Crossfire::Client::Widget::Frame; - $tw = new Crossfire::Client::Widget::Window; - $frm->add (my $te = new Crossfire::Client::Widget::TextEntry 0, 0, 10, $FONTSIZE, "Foo in the garden!"); - $tw->add ($frm); - - $tw->move (0, $HEIGHT - 120); - $TOPLEVEL->add ($tw); -# $te->focus_in; - } + ############################################################################# glClearColor 0, 0, 0, 0; @@ -95,10 +87,49 @@ glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; $_->() for @GL_INIT; + + ############################################################################# + + $STATUS_LINE = new Crossfire::Client::Widget::Label + 0, $HEIGHT * 59 / 60 - $FONTSIZE, 1, $FONTSIZE, + ""; + $TOPLEVEL->add ($STATUS_LINE); + + $ALT_ENTER_MESSAGE = new Crossfire::Client::Widget::Label + 0, $HEIGHT * 59 / 60, 1, $HEIGHT / 60, + "Use Alt-Enter to toggle fullscreen mode"; + $TOPLEVEL->add ($ALT_ENTER_MESSAGE); + + # Test code #d# + unless ($tw) { # haha... + $tw = new Crossfire::Client::Widget::Animator; + my $lbl1 = new Crossfire::Client::Widget::Label + 0, 0, 10, $FONTSIZE, "This is a\nTEST!\nOf a themed\nFrame!"; + my $lbl2 = new Crossfire::Client::Widget::Label + 0, 0, 10, $FONTSIZE, "LBL2"; + + my $vb = new Crossfire::Client::Widget::VBox; + my $f = new Crossfire::Client::Widget::FancyFrame; + my $f2 = new Crossfire::Client::Widget::FancyFrame; + $f->add ($lbl1); + $f2->add ($lbl2); + $vb->add ($f); + $vb->add ($f2, 1); + + $tw->add ($vb); + $tw->w (400); + $tw->h (300); + $tw->move ($WIDTH - 200, 0); + $tw->moveto (0, 0); + $TOPLEVEL->add ($tw); + +# $f->move ($WIDTH - 200, 0); +# $TOPLEVEL->add ($f); + } } sub start_game { - $SDL_TIMER = add Glib::Timeout 1000/100, sub { + $SDL_TIMER = add Glib::Timeout 1000/50, sub { ($SDL_CB{$SDL_EV->type} || sub { warn "unhandled event ", $SDL_EV->type })->() while $SDL_EV->poll; @@ -111,20 +142,27 @@ init_screen; + my $mapsize = List::Util::min 64, List::Util::max 11, int $HEIGHT * $CFG->{mapsize} * 0.01 / 32; + $CONN = new conn host => $CFG->{host}, port => $CFG->{port}, user => $CFG->{user}, pass => $CFG->{password}, - mapw => 50, - maph => 37, + mapw => $mapsize, + maph => $mapsize, ; + + Crossfire::Client::lowdelay fileno $CONN->{fh}; } sub stop_game { remove Glib::Source $SDL_TIMER; + remove Glib::Source $refresh_handler if $refresh_handler; + undef $refresh_handler; undef $SDL_APP; + undef $CONN; SDL::Quit; } @@ -134,7 +172,7 @@ glMatrixMode GL_PROJECTION; glLoadIdentity; - glOrtho 0, $WIDTH, $HEIGHT, 0, -100 , 100; + glOrtho 0, $WIDTH, $HEIGHT, 0, -6000 , 6000; glMatrixMode GL_MODELVIEW; glClear GL_COLOR_BUFFER_BIT; @@ -144,16 +182,39 @@ SDL::GLSwapBuffers; } -my $refresh_handler; - sub refresh { $refresh_handler ||= add Glib::Idle sub { + return unless $SDL_APP; + + my $next_refresh = SDL::GetTicks; + my $interval = ($next_refresh - $last_refresh) * 0.001; + $last_refresh = $next_refresh; + force_refresh; - undef $refresh_handler; - 0 + $_->animate ($interval) for grep $_, values %ANIMATE; + + if (%ANIMATE) { + 1 + } else { + undef $refresh_handler; + 0 + } }; } +sub animation_start { + my ($widget) = @_; + $ANIMATE{$widget} = $widget; + Scalar::Util::weaken $ANIMATE{$widget}; + + refresh; +} + +sub animation_stop { + my ($widget) = @_; + delete $ANIMATE{$widget}; +} + %SDL_CB = ( SDL_QUIT() => sub { main_quit Gtk2; @@ -200,13 +261,13 @@ sub conn::map_scroll { my ($self, $dx, $dy) = @_; - refresh; +# refresh; } sub conn::map_clear { my ($self) = @_; - refresh; +# refresh; } sub conn::face_find { @@ -242,6 +303,12 @@ $ent->signal_connect (changed => sub { my ($ent) = @_; $cfg->{$key} = $ent->get_text; + # TODO: Mapsize should be a slider in the game gui + if ($key eq 'mapsize' and $cfg->{$key} > 100) { + $cfg->{$key} = 100; + } elsif ($key eq 'mapsize' and $cfg->{$key} < 50) { + $cfg->{$key} = 50; + } }); } @@ -253,6 +320,7 @@ my @cfg = ( [qw/Host host/], [qw/Port port/], + [qw/Mapsize% mapsize/], [qw/Username user/], [qw/Password password/], ); @@ -309,7 +377,7 @@ }); $hb->pack_start (my $cb = Gtk2::Button->new ("logout"), 1, 1, 5); $cb->signal_connect (clicked => sub { - my $cb = $events{login} || sub {}; + my $cb = $events{logout} || sub {}; $cb->(); }); $hb->pack_start (my $cb = Gtk2::Button->new ("quit"), 1, 1, 5); @@ -337,13 +405,13 @@ $CFG ||= { width => 640, height => 480, + mapsize => 100, fullscreen => 0, host => "crossfire.schmorp.de", port => 13327, }; -Crossfire::Client::add_font Crossfire::Client::find_rcfile "uifont.ttf"; -Crossfire::Client::set_font "[Bitstream Vera Sans Mono]"; +Crossfire::Client::set_font Crossfire::Client::find_rcfile "uifont.ttf"; $FACECACHE = eval { Crossfire::load_ref "$Crossfire::VARDIR/pclient.faces" } || {};