Hi,

I am but a perl6 newbie and perl archwizard but I placed my module for a 2D 
gamekit at
http://gomez.yellowcouch.org/holly6src-1.3.tar.gz

It can be extended for 3D games later on.

Best regards,
Holly

On Mon, Nov 06, 2017 at 12:25:08PM +0100, The Holy Ghost wrote:
> Hi,
> 
> I will develop game kits with the attached code, I made an upload to CPAN
> for the perl5 HollyGame kit at holyghost.yellowcouch.org but it uses but SDL 
> 1.2
> 
> I might try to put through perl6.
> 
> Any ideas are welcome.
> 
> Best regards,
> The Holy Ghost

> use NativeCall;
> use SDL2::Raw;
> use nqp;
> my int ($w, $h) = 800, 600;
> my SDL_Window $window;
> my SDL_Renderer $renderer;
> my int $particlenum = 1000;
> constant $sdl-lib = 'SDL2';
> sub SDL_RenderDrawPoints( SDL_Renderer $, CArray[int32] $points, int32 $count 
> ) returns int32 is native($sdl-lib) {*}
> SDL_Init(VIDEO);
> $window = SDL_CreateWindow(
> "Particle System!",
> SDL_WINDOWPOS_CENTERED_MASK, SDL_WINDOWPOS_CENTERED_MASK,
> $w, $h,
> SHOWN
> );
> $renderer = SDL_CreateRenderer( $window, -1, ACCELERATED );
> SDL_ClearError();
> my SDL_RendererInfo $renderer_info .= new;
> SDL_GetRendererInfo($renderer, $renderer_info);
> say $renderer_info;
> say %PIXELFORMAT.pairs.grep({ $_.value == any($renderer_info.texf1, 
> $renderer_info.texf2, $renderer_info.texf3) });
> my num @positions = 0e0 xx ($particlenum * 2);
> my num @velocities = 0e0 xx ($particlenum * 2);
> my num @lifetimes = 0e0 xx $particlenum;
> my CArray[int32] $points .= new;
> my int $numpoints;
> sub update (num \df) {
> my int $xidx = 0;
> my int $yidx = 1;
> my int $pointidx = 0;
> loop (my int $idx = 0; $idx < $particlenum; $idx = $idx + 1) {
> my int $willdraw = 0;
> if (@lifetimes[$idx] <= 0e0) {
> if (rand < df) {
> @lifetimes[$idx] = rand * 10e0;
> @positions[$xidx] = ($w / 20e0).Num;
> @positions[$yidx] = (3 * $h / 50).Num;
> @velocities[$xidx] = (rand - 0.5e0) * 10;
> @velocities[$yidx] = (rand - 2e0) * 10;
> $willdraw = 1;
> }
> } else {
> if @positions[$yidx] > $h / 10 && @velocities[$yidx] > 0 {
> @velocities[$yidx] = @velocities[$yidx] * -0.6e0;
> }
> @velocities[$yidx] = @velocities[$yidx] + 9.81e0 * df;
> @positions[$xidx] = @positions[$xidx] + @velocities[$xidx] * df;
> @positions[$yidx] = @positions[$yidx] + @velocities[$yidx] * df;
> @lifetimes[$idx] = @lifetimes[$idx] - df;
> $willdraw = 1;
> }
> if ($willdraw) {
> $points[$pointidx++] = (@positions[$xidx] * 10).floor;
> $points[$pointidx++] = (@positions[$yidx] * 10).floor;
> }
> $xidx = $xidx + 2;
> $yidx = $xidx + 1;
> }
> $numpoints = ($pointidx - 1) div 2;
> }
> sub render {
> SDL_SetRenderDrawColor($renderer, 0x0, 0x0, 0x0, 0xff);
> SDL_RenderClear($renderer);
> SDL_SetRenderDrawColor($renderer, 0xff, 0xff, 0xff, 0x7f);
> SDL_RenderDrawPoints($renderer, $points, $numpoints);
> SDL_RenderPresent($renderer);
> }
> my $event = SDL_Event.new;
> my @times;
> my num $df = 0.0001e0;
> main: loop {
> my $start = nqp::time_n();
> while SDL_PollEvent($event) {
> my $casted_event = SDL_CastEvent($event);
> given $casted_event {
> when *.type == QUIT {
> last main;
> }
> }
> }
> update($df);
> render();
> @times.push: nqp::time_n() - $start;
> $df = nqp::time_n() - $start;
> }
> @times .= sort;
> my @timings = (@times[* div 50], @times[* div 4], @times[* div 2], @times[* * 
> 3 div 4], @times[* - * div 100]);
> say "frames per second:";
> say (1 X/ @timings).fmt("%3.4f");
> say "timings:";
> say ( @timings).fmt("%3.4f");
> say "";
> 'raw_timings.txt'.IO.spurt((1 X/ @times).join("\n"));

Reply via email to