package SDL::Game::Rect;
use strict;
use warnings;
-
+use Carp;
use base 'SDL::Rect';
our $VERSION = '0.01';
my $w = shift || 0;
my $h = shift || 0;
- my $self = SDL::Rect->new($x, $y, $w, $h);
+ my $self = $class->SUPER::new($x, $y, $w, $h);
unless ($$self) {
- require Carp;
- Carp::croak SDL::GetError();
+ #require Carp;
+ croak SDL::GetError();
}
bless $self, $class;
return $self;
return;
}
+###############################
+## methods ##
+###############################
+
+sub duplicate {
+}
+
+sub copy {
+ my $self = shift;
+ return $self->new(
+ -top => $self->top,
+ -left => $self->left,
+ -width => $self->width,
+ -height => $self->height,
+ );
+}
+
+sub move {
+ my ($self, $x, $y) = (@_);
+ if (not defined $x or not defined $y) {
+ #require Carp;
+ croak "must receive x and y positions as argument";
+ }
+ return $self->new(
+ -top => $self->top + $y,
+ -left => $self->left + $x,
+ -width => $self->width,
+ -height => $self->height,
+ );
+}
+
+sub move_ip {
+ my ($self, $x, $y) = (@_);
+ if (not defined $x or not defined $y) {
+ #require Carp;
+ croak "must receive x and y positions as argument";
+ }
+ $self->x($self->x + $x);
+ $self->y($self->y + $y);
+
+ return;
+}
+
+sub inflate {
+ my ($self, $x, $y) = (@_);
+ if (not defined $x or not defined $y) {
+ #require Carp;
+ croak "must receive x and y positions as argument";
+ }
+
+ return $self->new(
+ -left => $self->left - ($x / 2),
+ -top => $self->top - ($y / 2),
+ -width => $self->width + $x,
+ -height => $self->height + $y,
+ );
+}
+
+sub inflate_ip {
+ my ($self, $x, $y) = (@_);
+ if (not defined $x or not defined $y) {
+ #require Carp;
+ croak "must receive x and y positions as argument";
+ }
+
+ $self->x( $self->x - ($x / 2) );
+ $self->y( $self->y - ($y / 2) );
+
+ $self->w( $self->w + $x );
+ $self->h( $self->h + $y );
+}
+
+sub _get_clamp_coordinates {
+ my ($self_pos, $self_len, $rect_pos, $rect_len) = (@_);
+
+ if ($self_len >= $rect_len) {
+ return $rect_pos + ($rect_len / 2) - ($self_len / 2);
+ }
+ elsif ($self_pos < $rect_pos) {
+ return $rect_pos;
+ }
+ elsif ( ($self_pos + $self_len) > ($rect_pos + $rect_len) ) {
+ return $rect_pos + $rect_len - $self_len;
+ }
+ else {
+ return $self_pos;
+ }
+}
+
+sub clamp {
+ my ($self, $rect) = (@_);
+
+ unless ($rect->isa('SDL::Rect')) {
+ croak "must receive an SDL::Rect-based object";
+ }
+
+ my $x = _get_clamp_coordinates($self->x, $self->w, $rect->x, $rect->w);
+ my $y = _get_clamp_coordinates($self->y, $self->h, $rect->y, $rect->h);
+
+ return $self->new($x, $y, $self->w, $self->h);
+}
+
+sub clamp_ip {
+ my ($self, $rect) = (@_);
+
+ unless ($rect->isa('SDL::Rect')) {
+ croak "must receive an SDL::Rect-based object";
+ }
+
+ my $x = _get_clamp_coordinates($self->x, $self->w, $rect->x, $rect->w);
+ my $y = _get_clamp_coordinates($self->y, $self->h, $rect->y, $rect->h);
+
+ $self->x($x);
+ $self->y($y);
+
+ return;
+}
42;
__END__