FlxG.touches and multiple camera



  • Hello!

    I'm starting a new little platformer game for Android and I struggle to set up some in-game controls.

    On one camera I display the level and the character, and on a second camera I display four buttons (left/right/A/B). My problem is that my part of the code who is supposed to detect if the player touch the screen where the buttons are, no longer work since I put the buttons on the second camera.

    Here's my PlayState class code:

    class PlayState extends FlxState
    {
    	var _map:TiledMap;
    	var _mWalls:FlxTilemap;
    	var _mBackground:FlxTilemap;
    	var _player:Player;
    
    	var btnA:FlxSprite;
    	var btnB:FlxSprite;
    	var btnLeft:FlxSprite;
    	var btnRight:FlxSprite;
    
    	var cameraLevel:FlxCamera;
    	var cameraHUD:FlxCamera;
    
    	override public function create():Void
    	{
                    //We set up the cameras
    		cameraLevel = new FlxCamera(0, 0, FlxG.width, FlxG.height);
    		cameraLevel.bgColor = FlxColor.TRANSPARENT;
    		cameraHUD = new FlxCamera(0, 0, FlxG.width, FlxG.height);
    		cameraHUD.bgColor = FlxColor.TRANSPARENT;
    		FlxG.cameras.reset(cameraLevel);
    		FlxCamera.defaultCameras = [cameraLevel];
    		camera.zoom = 6;
    
                    //We create the level
    		_map = new TiledMap(AssetPaths.rogue__tmx);
    		FlxG.worldBounds.set(0, 0, FlxG.width, FlxG.height);
    
    		_mBackground = new FlxTilemap();
    		_mBackground.loadMapFromArray(cast(_map.getLayer("background"), TiledTileLayer).tileArray, _map.width, _map.height, AssetPaths.tileset__png, _map.tileWidth, _map.tileHeight, FlxTilemapAutoTiling.OFF, 1, 1, 3);
    		_mBackground.follow();
    		_mBackground.setTileProperties(1, FlxObject.ANY);
    		add(_mBackground);
    
    		_mWalls = new FlxTilemap();
    		_mWalls.loadMapFromArray(cast(_map.getLayer("platform"), TiledTileLayer).tileArray, _map.width, _map.height, AssetPaths.tileset__png, _map.tileWidth, _map.tileHeight, FlxTilemapAutoTiling.OFF, 1, 1, 3);
    		_mWalls.follow();
    		_mWalls.setTileProperties(2, FlxObject.NONE);
    		_mWalls.setTileProperties(3, FlxObject.NONE);
    		_mWalls.setTileProperties(4, FlxObject.NONE);
    		_mWalls.setTileProperties(5, FlxObject.NONE);
    		_mWalls.setTileProperties(6, FlxObject.NONE);
    		_mWalls.setTileProperties(7, FlxObject.NONE);
    		_mWalls.setTileProperties(8, FlxObject.NONE);
    		_mWalls.setTileProperties(9, FlxObject.NONE);
    		_mWalls.setTileProperties(10, FlxObject.NONE);
    		_mWalls.setTileProperties(11, FlxObject.NONE);
    		_mWalls.setTileProperties(12, FlxObject.NONE);
    		add(_mWalls);
    
                    //We create and place the player on the level
    		_player = new Player();
    		var tmpMap:TiledObjectLayer = cast _map.getLayer("entities");
    		for (e in tmpMap.objects)
    		{
    			placeEntities(e.name, e.xmlData.x);
    		}
    		add(_player);
    
    		FlxG.camera.follow(_player, TOPDOWN, 1);
    
                    //We create the controls
    		btnLeft = new FlxSprite( 40, FlxG.height - 130 );
    		btnLeft.makeGraphic( 90, 90, FlxColor.GRAY );
    		add(btnLeft);
    
    		btnRight = new FlxSprite( btnLeft.x + 130, FlxG.height - 130 );
    		btnRight.makeGraphic( 90, 90, FlxColor.GRAY );
    		add(btnRight);
    
    		btnA = new FlxSprite( FlxG.width - 130, FlxG.height - 130 );
    		btnA.makeGraphic( 90, 90, FlxColor.BLUE );
    		add(btnA);
    
    		btnB = new FlxSprite( btnA.x - 130, FlxG.height - 130 );
    		btnB.makeGraphic( 90, 90, FlxColor.RED );
    		add(btnB);
    
    		btnA.scrollFactor.set(0, 0);
    		btnB.scrollFactor.set(0, 0);
    		btnRight.scrollFactor.set(0, 0);
    		btnLeft.scrollFactor.set(0, 0);
    
                    //We add the controls to the second camera
    		FlxG.cameras.add(cameraHUD);
    		btnA.cameras = [cameraHUD];
    		btnB.cameras = [cameraHUD];
    		btnLeft.cameras = [cameraHUD];
    		btnRight.cameras = [cameraHUD];
    
    		super.create();
    	}
    
    	override public function update(elapsed:Float):Void
    	{
    		super.update(elapsed);
    
    		for (touch in FlxG.touches.list)
    		{
    			if (touch.pressed)
    			{
    				if (touch.overlaps(btnLeft, cameraHUD))
    				{
    					_player.animation.play("run");
    					_player.flipX = true;
    					_player.acceleration.x = -_player.speed;
    				}
    				if (touch.overlaps(btnRight, cameraHUD))
    				{
    					_player.animation.play("run");
    					_player.flipX = false;
    					_player.acceleration.x = _player.speed;
    				}
    			}
    			else
    			{
    				_player.animation.play("idle");
    				_player.acceleration.x = 0;
    			}
    
    		}
    
    		FlxG.collide(_player, _mWalls);
    	}
    
    	function placeEntities(entityName:String, entityData:Xml):Void
    	{
    		var x:Int = Std.parseInt(entityData.get("x"));
    		var y:Int = Std.parseInt(entityData.get("y"));
    		if (entityName == "player")
    		{
    			_player.x = x;
    			_player.y = y;
    		}
    	}
    }
    

    And also, if someone got any clue about why the player doesn't collide with the walls :D

    I don't think the other parts of my code are needed, but let me know!


Log in to reply
 

Looks like your connection to HaxeFlixel was lost, please wait while we try to reconnect.