1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-28 23:48:30 +02:00
VVVVVV/mobile_version/src/bigroom/input/KeyPoll.as
2020-01-08 10:37:50 -05:00

371 lines
10 KiB
ActionScript

/**
* Key polling class
*
* To create:
* var key:KeyPoll = new KeyPoll( displayObject );
*
* the display object will usually be the stage.
*
* Full example:
* package
* {
* import flash.display.Sprite;
* import flash.events.Event;
* import flash.ui.Keyboard;
* import fgc.input.KeyPoll;
*
* public class Test
* {
* var key:KeyPoll;
*
* public function Test()
* {
* key = new KeyPoll( this.stage );
* addEventListener( Event.ENTER_FRAME, enterFrame );
* }
*
* public function enterFrame( ev:Event ):void
* {
* if( key.isDown( Keyboard.LEFT ) )
* {
* trace( "left key is down" );
* }
* if( key.isDown( Keyboard.RIGHT ) )
* {
* trace( "right key is down" );
* }
* }
* }
* }
*
* Author: Richard Lord
* Copyright (c) FlashGameCode.net 2007
* Version 1.0.2
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package bigroom.input
{
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.display.DisplayObject;
import flash.utils.ByteArray;
import flash.events.TouchEvent;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
import flash.ui.*;
import flash.events.MouseEvent;
import flash.net.*;
public class KeyPoll
{
private var states:ByteArray;
private var dispObj:DisplayObject;
public var click:Boolean = false;
public var clickheld:Boolean = false;
public var hasclicked:Boolean = false;
public var press:Boolean = false;
public var onscreen:Boolean=true;
public var gotosite:String = "";
public var touchx:Vector.<int> = new Vector.<int>;
public var touchy:Vector.<int> = new Vector.<int>;
public var touchid:Vector.<int> = new Vector.<int>;
public var temptouchid:int = 0;
public var controlstick:int = -1;
public var controlstick_x:int = 0;
public var controlstick_y:int = 0;
public var pushleft:Boolean = false;
public var pushright:Boolean = false;
public var controlstick_xrange:int = 0;
public var controlstick_yrange:int = 0;
public var deadzone:int = 0, deadzone_inner:int = 0;
public var firstmove:Boolean = false;
public var touchPoints : uint;
public function KeyPoll( obj:DisplayObject )
{
states = new ByteArray();
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
states.writeUnsignedInt( 0 );
touchPoints = 0;
for (var i:int = 0; i < 20; i++) {
touchx.push(0);
touchy.push(0);
touchid.push(-1);
}
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
dispObj = obj;
dispObj.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
dispObj.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
dispObj.addEventListener( Event.ACTIVATE, activateListener, false, 0, true );
dispObj.addEventListener( Event.DEACTIVATE, deactivateListener, false, 0, true );
/*
dispObj.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownListener);
dispObj.addEventListener( MouseEvent.MOUSE_UP, mouseUpListener );
*/
dispObj.addEventListener( TouchEvent.TOUCH_BEGIN, touchbeginlistener);
dispObj.addEventListener( TouchEvent.TOUCH_MOVE, touchmovelistener);
dispObj.addEventListener( TouchEvent.TOUCH_END, touchendlistener );
//dispObj.addEventListener( TouchEvent.TOUCH_TAP, mouseclicker);
}
public function definestickrange(x:int, y:int, d:int):void {
/*
if (device.deviceresolution == device.ANDROID) {
//Turn d into a sensible value
d = 6;
}else {
//Ignore it and just use 6
d = 6;
}
*/
controlstick_xrange = x;
controlstick_yrange = y;
deadzone = d;
deadzone_inner = Math.min(int(d * 0.5), 1);
}
public function gettouchx():int {
if (touchPoints == 0) {
return touchx[0];
}else {
return touchx[touchPoints - 1];
}
}
public function gettouchy():int {
if (touchPoints == 0) {
return touchy[0];
}else {
return touchy[touchPoints - 1];
}
}
/*
public function mouseUpListener( e:MouseEvent ):void {
//Identify the point that's been removed, and take it away from the array
touchPoints = 0;
if (touchPoints == 0){
press = false;
click = false;
clickheld = false;
hasclicked = false;
}
}
public function mouseDownListener( e:MouseEvent ):void {
touchx[0] = e.stageX;
touchy[0] = e.stageY;
touchid[0] = 1;
touchPoints=1;
press = true;
click = true;
clickheld = true;
hasclicked = true;
}
*/
public function touchbeginlistener( e:TouchEvent ):void {
touchx[touchPoints] = e.stageX;
touchy[touchPoints] = e.stageY;
touchid[touchPoints] = e.touchPointID;
if (controlstick == -1) {
//Consider this for the controlstick point
if (touchx[touchPoints] < controlstick_xrange) {
if (touchy[touchPoints] > controlstick_yrange) {
controlstick = touchid[touchPoints];
controlstick_x = touchx[touchPoints];
controlstick_y = touchy[touchPoints];
pushleft = false;
pushright = false;
firstmove = true;
}
}
}
touchPoints++;
press = true;
click = true;
clickheld = true;
hasclicked = true;
}
public function touchendlistener( e:TouchEvent ):void {
//Identify the point that's been removed, and take it away from the array
temptouchid = e.touchPointID;
if (temptouchid == controlstick) {
controlstick = -1;
pushleft = false;
pushright = false;
firstmove = false;
controlstick_x = -1;
controlstick_y = -1;
}
for (var i:int = 0; i < touchPoints; i++) {
if (touchid[i] == temptouchid) {
for (var j:int = i; j < touchPoints; j++) {
touchx[j] = touchx[j + 1];
touchy[j] = touchy[j + 1];
touchid[j] = touchid[j + 1];
}
i = touchPoints + 1;
touchPoints--;
}
}
if (touchPoints == 0){
press = false;
click = false;
clickheld = false;
hasclicked = false;
}
}
public function touchmovelistener(e:TouchEvent):void {
//Identify the touch point that's moving, and update it's coordinates
temptouchid = e.touchPointID;
for (var i:int = 0; i < touchPoints; i++) {
if (touchid[i] == temptouchid) {
touchx[i] = e.stageX;
touchy[i] = e.stageY;
if (touchid[i] == controlstick) {
if (firstmove) {
if (touchx[i] < controlstick_x) {
pushleft = true; pushright = false;
firstmove = false;
controlstick_x = touchx[i] + deadzone;
controlstick_y = touchy[i];
}else if (touchx[i] > controlstick_x) {
pushleft = false; pushright = true;
firstmove = false;
controlstick_x = touchx[i] - deadzone;
controlstick_y = touchy[i];
}
}else{
if (touchx[i] < controlstick_x - deadzone) {
pushleft = true; pushright = false;
controlstick_x = touchx[i] + deadzone;
controlstick_y = touchy[i];
}else if (touchx[i] > controlstick_x + deadzone) {
pushleft = false; pushright = true;
controlstick_x = touchx[i] - deadzone;
controlstick_y = touchy[i];
}else if (touchx[i] >= controlstick_x - deadzone_inner &&
touchx[i] <= controlstick_x + deadzone_inner) {
pushleft = false; pushright = false;
}
}
}
}
}
}
public function visitsite(t:String):void {
gotosite = t;
}
/*
public function mouseclicker(e:TouchEvent):void {
touchx = e.stageX;
touchy = e.stageY;
if (gotosite == "NG") {
//API.loadNewgrounds();
gotosite = "";
}else if (gotosite != "") {
var link:URLRequest = new URLRequest(gotosite);
navigateToURL(link, "_blank");
gotosite = "";
}
}
*/
private function keyDownListener( ev:KeyboardEvent ):void
{
states[ ev.keyCode >>> 3 ] |= 1 << (ev.keyCode & 7);
if (ev.keyCode == 27){
ev.preventDefault();
}else if (ev.keyCode == Keyboard.BACK) {
// user hit the back button on Android device
ev.preventDefault();
ev.stopImmediatePropagation();
}
}
private function keyUpListener( ev:KeyboardEvent ):void
{
states[ ev.keyCode >>> 3 ] &= ~(1 << (ev.keyCode & 7));
}
private function activateListener( ev:Event ):void
{
for( var i:int = 0; i < 8; ++i )
{
states[ i ] = 0;
}
}
private function deactivateListener( ev:Event ):void
{
for( var i:int = 0; i < 8; ++i )
{
states[ i ] = 0;
}
}
public function isDown( keyCode:uint ):Boolean
{
return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) != 0;
}
public function isUp( keyCode:uint ):Boolean
{
return ( states[ keyCode >>> 3 ] & (1 << (keyCode & 7)) ) == 0;
}
}
}