23 |
|
|
24 |
Screen - simulated 256*256 pixels monochrome screen using SDL |
Screen - simulated 256*256 pixels monochrome screen using SDL |
25 |
|
|
26 |
|
=head1 Architecture dependent |
27 |
|
|
28 |
|
You may override following methods if you want to implement keyboard on each |
29 |
|
keypress event. Alternative is to use <read> hook and trap memory access. |
30 |
|
|
31 |
|
=head2 key_down |
32 |
|
|
33 |
|
$self->key_down( 'a' ); |
34 |
|
|
35 |
|
=cut |
36 |
|
|
37 |
|
sub key_down {} |
38 |
|
|
39 |
|
=head2 key_up |
40 |
|
|
41 |
|
$self->key_up( 'a' ); |
42 |
|
|
43 |
|
=cut |
44 |
|
|
45 |
|
sub key_up {} |
46 |
|
|
47 |
|
|
48 |
|
=head1 Architecture independent |
49 |
|
|
50 |
|
You don't need to override any of following function in your architecture, |
51 |
|
but you might want to call them. |
52 |
|
|
53 |
=head2 open_screen |
=head2 open_screen |
54 |
|
|
55 |
Open simulated screen |
Open simulated screen |
247 |
my $pending_key; |
my $pending_key; |
248 |
my $run_for = 2000; |
my $run_for = 2000; |
249 |
|
|
|
my $key_down; |
|
|
|
|
|
sub key_down { |
|
|
my $self = shift; |
|
|
my $key = shift; |
|
|
warn "key_down($key) = ",$key_down->{$key}, "\n" if $self->debug; |
|
|
return $key_down->{$key}; |
|
|
} |
|
|
|
|
250 |
sub key_pressed { |
sub key_pressed { |
251 |
my $self = shift; |
my $self = shift; |
252 |
|
|
261 |
my ( $key, $state ) = %$h; |
my ( $key, $state ) = %$h; |
262 |
if ( $state ) { |
if ( $state ) { |
263 |
$pending_key = $key; |
$pending_key = $key; |
264 |
$key_down->{$key}++; |
$self->key_down( $key ); |
265 |
} else { |
} else { |
266 |
undef $pending_key; |
undef $pending_key; |
267 |
$key_down->{$key} = 0; |
$self->key_up( $key ); |
268 |
} |
} |
269 |
} |
} |
270 |
return $pending_key; |
return $pending_key; |
278 |
|
|
279 |
if ($type == SDL_KEYDOWN) { |
if ($type == SDL_KEYDOWN) { |
280 |
$k = $event->key_name(); |
$k = $event->key_name(); |
|
$key_down->{$k}++; |
|
281 |
if ( $k eq 'escape' ) { |
if ( $k eq 'escape' ) { |
282 |
$run_for = $self->cli; |
$run_for = $self->cli; |
283 |
warn "will check event loop every $run_for cycles\n"; |
warn "will check event loop every $run_for cycles\n"; |
285 |
} else { |
} else { |
286 |
warn "SDL_KEYDOWN ($type) = '$k'", $just_checking ? ' fake' : '', "\n"; |
warn "SDL_KEYDOWN ($type) = '$k'", $just_checking ? ' fake' : '', "\n"; |
287 |
$pending_key = $k; |
$pending_key = $k; |
288 |
|
$self->key_down( $k ); |
289 |
$self->record_session('key_pressed', { $k => 1 }); |
$self->record_session('key_pressed', { $k => 1 }); |
290 |
} |
} |
291 |
} elsif ( $type == SDL_KEYUP ) { |
} elsif ( $type == SDL_KEYUP ) { |
292 |
my $up = $event->key_name(); |
my $up = $event->key_name(); |
293 |
warn "SDL_KEYUP ($type) = '$up'", $just_checking ? ' fake' : '', "\n"; |
warn "SDL_KEYUP ($type) = '$up'", $just_checking ? ' fake' : '', "\n"; |
294 |
|
$self->key_up( $up ); |
295 |
$self->record_session('key_pressed', { $up => 0 }); |
$self->record_session('key_pressed', { $up => 0 }); |
|
$key_down->{$up} = 0; |
|
296 |
undef $pending_key; |
undef $pending_key; |
297 |
} |
} |
298 |
|
|