最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

curses - perl term animation collision detection not working - Stack Overflow

programmeradmin3浏览0评论

I'm trying to make a perl terminal animation where an enitity reverses direction when it collides with another object. Here is the code I have so far:

use Term::Animation 2.0;
use Term::Animation::Entity;
use Time::HiRes qw(time);
use Data::Dumper;
use Curses;
use strict;
use warnings;


main();

sub add_animal {
    my ($anim, $y) = @_;

    # Add the animal to the animation
    my $animal = $anim->new_entity(
        type => 'animal',
        position => [3, $y, 1],
        shape => '*',              
        color => 'r',
        callback_args => [1, 0, 0, 0],
        die_offscreen => 0,
        coll_handler => \&animal_collision, 
    );
}

sub animal_collision {
  my ($animal, $anim) = @_;
  my $collisions = $animal->collisions();
  #return unless defined $collisions;

  foreach my $col_obj (@{$collisions}) {
    # Get the current x direction from the callback_args
    my $x_dir = $animal->callback_args->[0];

    # Reverse the direction
    $animal->callback_args->[0] = -$x_dir;
  }
}



sub add_background {
    my ($anim, $screen_width, $screen_height) = @_;
    my $half_width = int($screen_width / 2);
    my $ground_level = int($screen_height * 0.7);

    for my $y (0..($screen_height)) {
      $anim->new_entity(
            shape => ['|'],
            position => [$half_width, $y, 21],
            color => ['w'], 
        );
    }
}

sub main {

  my $anim = Term::Animation->new();
  $anim->color(1);

  halfdelay(1);
  my $paused = 0;


  while(1) {
      my $screen_width = $anim->width();
      my $screen_height = $anim->height();
      my $half_width = int($screen_width / 2);
      my $ground_level = int($screen_height * 0.7);

      add_background($anim, $screen_width, $screen_height);
      add_animal($anim, ($ground_level - 1));

      # animation loop
      while(1) {
          my $current_time = time();

          # run and display a single animation frame
          $anim->animate() unless($paused);

          # use getch to control the frame rate, and get input at the same time.
          my $input = getch();
          if($input eq 'q') { quit(); }
          if($input eq 'r' || $input eq KEY_RESIZE()) { last; }
          if($input eq 'p') { $paused = !$paused; }
      }
      $anim->update_term_size();
      $anim->remove_all_entities();
  }

  $anim->end();
}

As of now, the animal object passes through the other object without any change of direction. Please let me know what is wrong with the collision detector or any other issues.

I'm trying to make a perl terminal animation where an enitity reverses direction when it collides with another object. Here is the code I have so far:

use Term::Animation 2.0;
use Term::Animation::Entity;
use Time::HiRes qw(time);
use Data::Dumper;
use Curses;
use strict;
use warnings;


main();

sub add_animal {
    my ($anim, $y) = @_;

    # Add the animal to the animation
    my $animal = $anim->new_entity(
        type => 'animal',
        position => [3, $y, 1],
        shape => '*',              
        color => 'r',
        callback_args => [1, 0, 0, 0],
        die_offscreen => 0,
        coll_handler => \&animal_collision, 
    );
}

sub animal_collision {
  my ($animal, $anim) = @_;
  my $collisions = $animal->collisions();
  #return unless defined $collisions;

  foreach my $col_obj (@{$collisions}) {
    # Get the current x direction from the callback_args
    my $x_dir = $animal->callback_args->[0];

    # Reverse the direction
    $animal->callback_args->[0] = -$x_dir;
  }
}



sub add_background {
    my ($anim, $screen_width, $screen_height) = @_;
    my $half_width = int($screen_width / 2);
    my $ground_level = int($screen_height * 0.7);

    for my $y (0..($screen_height)) {
      $anim->new_entity(
            shape => ['|'],
            position => [$half_width, $y, 21],
            color => ['w'], 
        );
    }
}

sub main {

  my $anim = Term::Animation->new();
  $anim->color(1);

  halfdelay(1);
  my $paused = 0;


  while(1) {
      my $screen_width = $anim->width();
      my $screen_height = $anim->height();
      my $half_width = int($screen_width / 2);
      my $ground_level = int($screen_height * 0.7);

      add_background($anim, $screen_width, $screen_height);
      add_animal($anim, ($ground_level - 1));

      # animation loop
      while(1) {
          my $current_time = time();

          # run and display a single animation frame
          $anim->animate() unless($paused);

          # use getch to control the frame rate, and get input at the same time.
          my $input = getch();
          if($input eq 'q') { quit(); }
          if($input eq 'r' || $input eq KEY_RESIZE()) { last; }
          if($input eq 'p') { $paused = !$paused; }
      }
      $anim->update_term_size();
      $anim->remove_all_entities();
  }

  $anim->end();
}

As of now, the animal object passes through the other object without any change of direction. Please let me know what is wrong with the collision detector or any other issues.

Share Improve this question edited Mar 12 at 19:37 brian d foy 133k31 gold badges213 silver badges605 bronze badges asked Mar 10 at 19:58 Sam DorfmanSam Dorfman 876 bronze badges 2
  • 2 You need to specify which code does not do what you expect. You can't just dump all your code in and say: Help! Please be more specific. – TLP Commented Mar 10 at 20:32
  • coll_handler doesn't seem to be a parameter that's included in the documentation. In fact, I can't see what it's going to do if it detects a collision anywhere in the documentation. – Ted Lyngmo Commented Mar 10 at 20:40
Add a comment  | 

1 Answer 1

Reset to default 8

Collision detection is done for physical objects only. Add physical => 1 to both objects. Also the model has 3 dimensions so you need to have the objects in the same z plane if you want them to collide.

use strict;
use warnings;
use Term::Animation 2.0;
use Term::Animation::Entity;
use Time::HiRes qw(time);
use Data::Dumper;
use Curses;

main();

sub add_animal {
    my ($anim, $y) = @_;

    # Add the animal to the animation
    my $animal = $anim->new_entity(
        type => 'animal',
        position => [3, $y, 21],
        shape => '*',
        color => 'r',
        callback_args => [1, 0, 0, 0],
        die_offscreen => 0,
        coll_handler => \&animal_collision,
        physical => 1,
    );
}

sub animal_collision {
  my ($animal, $anim) = @_;
  my $collisions = $animal->collisions();
  #return unless defined $collisions;
  foreach my $col_obj (@{$collisions}) {
    # Get the current x direction from the callback_args
    my $x_dir = $animal->callback_args->[0];

    # Reverse the direction
    $animal->callback_args->[0] = -$x_dir;
  }
}



sub add_background {
    my ($anim, $screen_width, $screen_height) = @_;
    my $half_width = int($screen_width / 2);
    my $ground_level = int($screen_height * 0.7);

    for my $y (0..($screen_height)) {
      $anim->new_entity(
            shape => ['|'],
            position => [$half_width, $y, 21],
            color => ['w'],
            physical => 1,
        );
    }
}

sub main {

  my $anim = Term::Animation->new();
  $anim->color(1);

  halfdelay(1);
  my $paused = 0;


  while(1) {
      my $screen_width = $anim->width();
      my $screen_height = $anim->height();
      my $half_width = int($screen_width / 2);
      my $ground_level = int($screen_height * 0.7);

      add_background($anim, $screen_width, $screen_height);
      my $animal = add_animal($anim, ($ground_level - 1));
      # animation loop
      while(1) {
          my $current_time = time();

          # run and display a single animation frame
          $anim->animate() unless($paused);

          # use getch to control the frame rate, and get input at the same time.
          my $input = getch();
          if($input eq 'q') { quit(); }
          if($input eq 'r' || $input eq KEY_RESIZE()) { last; }
          if($input eq 'p') { $paused = !$paused; }
      }
      $anim->update_term_size();
      $anim->remove_all_entities();
  }

  $anim->end();
}
发布评论

评论列表(0)

  1. 暂无评论