Posts tagged: Piksahl

Slick, LWJGL and Ubuntu 9.04

It has been a busy month for me and a slow month in regard to posting any sort of update here. I’ve been reading a whole whack of stuff. A giant whack.

Speaking of reading stuff, why not check out http://books.1889.ca/ for some excellent reading material. Follow the author on Twitter, while you’re at it. I’m not being paid to promote 1889 books, it is just good stuff.

Back to the topic at hand, I want to share a tidbit of information. If you’re like me, you use Ubuntu. And recently, a new version of Ubuntu became available. So if you’re like me, you upgraded to Ubuntu 9.04 from Ubuntu 8.10. Then stuff broke. Because, like me, you use an ATI video card and ATI decided to not update last year’s model of video cards to work with the new version of X (the window system) in Ubuntu 9.04.

That’s a side rant, and possibly unrelated. My main problem was that the game(s) I’ve been writing would no longer compile, or run, with Ubuntu 9.04. Wait, it was Ubuntu’s fault? No. Something broke somewhere along the way and LWJGL was b0rken just a little bit (b0rken… look it up).

I fixed it. And you can, too. Grab the nightly build and replace your native libraries.

Now Slick (which uses LWJGL) and Eclipse and Ubuntu 9.04 all play nice together. Development of Generic 2D Platformer (and Pixahl) commence.

Right, I may be called on the name change to Piksahl. Piksahl was the Perl version, but that was just silly. Who programs a game in Perl? I started to, because I could. Now I’m doing it in Slick/Java. That makes more sense. Thus, the name change.

Piksahl, just a little more

Working on Piksahl just a little bit more. Finally labelling all of the columns and rows.

Another sneak peek.

Another sneak peek.

Since the beginning I’ve had the functionality to label the columns/rows, or to at least build a string like “2,1,1” and output the column/row total as “4”. So today I finally got around to parsing the original string and outputting as “2\n1\n1\n” with a little chomp(stirng) for good measure, in the case of a column. Rows are simpler, needing only to s/,/  /g the string.

To do, align the row labels to the right, align those columns to the bottom. For both columns and rows I need to get rid of all that wasted space where there is no text. That will be easily done by calculating the maximum number of characters per row and column individually.

Update to “The Lab”

I’ve created pages within the n3wt0n wiki for both Piksahl and the Warcrabs! manual.

Just keep in mind, both projects are unfinished. Piksahl comes a little closer to completion when I’m bored both with video games and the Warcrabs! manual. My revision of the Warcrabs! manual is near completion which should result in more interest on my part toward finishing Piksahl.

Piksahl, sneak peek.

Here's a look into the current state of Piksahl.

Here's a look into the current state of Piksahl.

I did have working images (photos as they are called in Perl-TK), but as a sacrifice for the photos working it ended up breaking something else. In the meantime, solid colours are being used with the canvas object createRectangle. But this is just a first look into Piksahl. I’ll get more in-depth later.

PerlTK and “activating” multiple canvas items

What I was looking for was every row and every column to be “lit up” wherever I put my mouse cursor. I started with the base code snippet:

#!/usr/bin/perl -w

use strict;
use Tk;

my ($x, $y);
my $iconSize = 20;
my ($width, $height) = (3, 3);
my ($canvasWidth, $canvasHeight) = ($iconSize+$width*$iconSize,
                                    $iconSize+$height*$iconSize);

my $MW = MainWindow->new;
my $MF = $MW->Frame->pack;
my $c = $MF->Canvas( -width => $canvasWidth,
                -height => $canvasHeight )->pack;

for ($y = $iconSize; $y < $canvasHeight; $y+=$iconSize)
{
    for ($x = $iconSize; $x < $canvasWidth; $x+=$iconSize)
    {
        $c->createRectangle ($x, $y,
                $x+$iconSize, $y+$iconSize,
                -fill => '#AFAFAF',
                -activefill => '#CFCFCF' );
    }
}

MainLoop

And posted to comp.lang.perl.tk for help. I received two solutions.

Zentara was first to reply, who wrote:

The secret to using the Canvas is tags. Read the perldoc Tk::Canvas
for everything on tags, and search groups.google.com for "Perl Tk canvas
tags" for many examples.
It's kind of an art, to see which tag juggling technique to use, but
generally you bind to motion or a tag, then find the current item, then
addtags or deltags, etc.  You can get very clever and make things very
efficient. For instance, in the following script, I do it the clunky
way, by itemconfiguring a bunch of items returned by find. But you
could also define a tag called "lit' (or something), and addtag lit
to all rows and cols on enter, then deltags lit on leaving. 

Second to reply was Jack D. He altered Zentara’s solution making it more compact.

#!/usr/bin/perl -w

use strict;
use Tk;

my ($x, $y);
my $iconSize = 20;
my ($width, $height) = (10, 10);
my ($canvasWidth, $canvasHeight) = ($iconSize+$width*$iconSize,
                                    $iconSize+$height*$iconSize);

my $MW = MainWindow->new;
my $MF = $MW->Frame->pack;
my $c = $MF->Canvas( -width => $canvasWidth,
                -height => $canvasHeight )->pack;

for ($y = $iconSize; $y < $canvasHeight; $y+=$iconSize)
{
    for ($x = $iconSize; $x < $canvasWidth; $x+=$iconSize)
    {
        $c->createRectangle ($x, $y,
            $x+$iconSize, $y+$iconSize,
            -fill => '#AFAFAF',
            -activefill => '#CFCFCF',
            -tags=>['rect',"row.$y", "col.$x"] );
    }
}

$c->bind('rect', '<Enter>', \&enter );
$c->bind("rect", "<Leave>", \&leave );

MainLoop;

sub findtag {
    my ($canv) = @_;
    my $id = $canv->find('withtag', 'current');
    my @tags = $canv->gettags($id);
    my ($row) = ( grep /^row\d*/, @tags );
    my ($col) = ( grep /^col\d*/, @tags );
    return ($row,$col);
}

sub enter {
    my ($canv) = @_;
    my ($r,$c) = findtag($canv);
    $canv->itemconfigure($r, -fill=>$canv->itemcget($r,-activefill));
    $canv->itemconfigure($c, -fill=>$canv->itemcget($c,-activefill));
}

sub leave{
    my ($canv) = @_;
    $canv->itemconfigure('rect', -fill=>'#AFAFAF');
}

__END__

And it certainly gets the job done. I’m interested in that particular trick for a game I’m currently programming. I call it Piksahl and I’ll release more details as the game sees more progress.

Staypressed theme by Themocracy