Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package;
- import flash.display.Sprite;
- import flash.geom.ColorTransform;
- import flixel.util.FlxPath;
- import openfl.Assets;
- import flash.display.BlendMode;
- import flixel.FlxObject;
- import flixel.FlxG;
- import flixel.tile.FlxTile;
- import flixel.FlxSprite;
- import flixel.FlxState;
- import flixel.group.FlxGroup;
- import flixel.text.FlxText;
- import flixel.tile.FlxTilemap;
- import flixel.tweens.FlxTween;
- import flixel.tweens.FlxEase;
- import flixel.util.FlxColor;
- import flixel.math.FlxMath;
- import flixel.math.FlxPoint;
- import flixel.addons.editors.ogmo.FlxOgmoLoader;
- import flixel.system.FlxSound;
- import zerolib.ZSpotLight;
- import crashdumper.CrashDumper;
- import crashdumper.SessionData;
- import haxe.CallStack;
- import flixel.addons.weapon.FlxWeapon;
- import flixel.util.FlxTimer;
- import flixel.util.FlxAxes;
- /**
- * Atari 2600 Breakout
- *
- * @author Davey, Photon Storm
- * @link http://www.photonstorm.com/archives/1290/video-of-me-coding-breakout-in-flixel-in-20-mins
- */
- class PlayState extends FlxState
- {
- private var _bat:Bat;
- private var _ball:Ball;
- private var Border:FlxSprite;
- private var BackScreen:FlxSprite;
- private var _walls:FlxGroup;
- private var _leftWall:FlxSprite;
- private var _leftWallB:FlxSprite;
- private var _rightWall:FlxSprite;
- private var _topWall:FlxSprite;
- private var _topWallB:FlxSprite;
- private var _bottomWall:FlxSprite;
- private var Bricks:FlxGroup;
- private var Scene:FlxOgmoLoader;
- private var Base:FlxTilemap;
- private var Screen:FlxTilemap;
- private var _scoreText:FlxText;
- private var _scoreDisplay:FlxText;
- private var _levelText:FlxText;
- private var _levelDisplay:FlxText;
- private var _livesText:FlxText;
- private var _liveDisplay:FlxText;
- private var _score:Int = 0;
- private var _lives:Int = 5;
- private var _extralife:Int = 500;
- //Liquids
- public static var lava1 : Liquid;
- public static var lavas1 : FlxTypedGroup<Liquid>;
- public static var lava2 : Liquid;
- public static var lavas2 : FlxTypedGroup<Liquid>;
- public var ScreenNumber:Int;
- public var playerBullets:FlxTypedGroup<Bullet>;
- public var BallGroup:FlxTypedGroup<Ball>;
- public var PowerGroup:FlxTypedGroup<PowerBrick>;
- public var Streamer:FlxWeapon;
- //private var weapon:FlxWeapon = new FlxWeapon("arma", null, Bullet);
- private var _sndCoin:FlxSound;
- public var EndClock:FlxTimer;
- public var EndNum:Float = 4;
- public var EndTag:FlxText;
- public var Title:FlxText;
- public var NextGame:FlxText;
- private var GameEndText:FlxText;
- public var ExitDoor:Exit;
- public var isGameOver:Bool;
- private var _paused:Bool = false;
- override public function create():Void
- {
- FlxG.sound.playMusic("Action", 1, true);
- BackScreen = new FlxSprite(16, 16, "images/BackDropA.png");
- add(BackScreen);
- #if !android
- FlxG.mouse.visible = false;
- #end
- ScreenNumber = 1;
- _bat = new Bat(268, 426);
- _ball = new Ball(320, 240);
- _walls = new FlxGroup();
- BallGroup = new FlxTypedGroup<Ball>();
- PowerGroup = new FlxTypedGroup<PowerBrick>();
- Bricks = new FlxGroup();
- createWalls();
- LoadLevel(ScreenNumber);
- add(PowerGroup);
- add(Bricks);
- //Streamer = new FlxWeapon("arma");
- //Streamer.fireFrom = _bat;
- add(_bat);
- playerBullets = new FlxTypedGroup<Bullet>();
- add(playerBullets);
- add(BallGroup);
- BallGroup.add(_ball);
- //GUI
- ////////////////////////////////////////////////////////////////////////
- createGui();
- /////////////////////////////////////////////////////////////////////////
- _sndCoin = FlxG.sound.load("sounds/Coin01.mp3");
- //EndClock = new FlxTimer().time = EndNum;
- isGameOver = false;
- }
- function createText(x:Float, y:Float, ?text:String, FontSize:Int, W:Float)
- {
- var text = new FlxText(x, y, W, text);
- text.setFormat(null, FontSize, FlxColor.BLACK,CENTER);
- text.setBorderStyle(OUTLINE, FlxColor.WHITE, 2);
- return text;
- }
- private function createGui():Void
- {
- // A text to display the score
- var format6 = new FlxTextFormat(0xFF0000, false, false, 0xFFFFFF);
- _scoreText = createText(368, 32, "Score: ", 16, 400);
- _scoreText.addFormat(format6, -1, -1);
- add(_scoreText);
- _scoreDisplay = new FlxText(364, 52, 400, "" + 0);
- _scoreDisplay.setFormat(null, 16, FlxColor.WHITE, CENTER, OUTLINE);
- add(_scoreDisplay);
- _levelText = createText(368, 132, "Level: ", 16, 400);
- _levelText.addFormat(format6, -1, -1);
- add(_levelText);
- _levelDisplay = new FlxText(364, 164, 400, "" + 0);
- _levelDisplay.setFormat(null, 16, FlxColor.WHITE, CENTER, OUTLINE);
- add(_levelDisplay);
- _livesText = createText(368, 194, "Lives: ", 16, 400);
- _livesText.addFormat(format6, -1, -1);
- add(_livesText);
- _liveDisplay = new FlxText(364, 218, 400, "" + _lives);
- _liveDisplay.setFormat(null, 16, FlxColor.WHITE, CENTER, OUTLINE);
- add(_liveDisplay);
- EndTag = createText(-32, FlxG.height / 2, "Ready in: " + EndNum, 16, FlxG.width);
- EndTag.addFormat(format6, -1, -1);
- EndTag.visible = false;
- add(EndTag);
- GameEndText = createText(-64,240, "Game Over!",48,FlxG.width);
- GameEndText.addFormat(format6, -1, -1);
- GameEndText.visible = false;
- add(GameEndText);
- GameEndText.screenCenter(FlxAxes.Y);
- NextGame = createText(-64,340, "Press X To Restart!",16,FlxG.width);
- NextGame.addFormat(format6, -1, -1);
- NextGame.visible = false;
- add(NextGame);
- //NextGame.screenCenter(FlxAxes.X);
- }
- private function createWalls():Void
- {
- _leftWall = new FlxSprite(0, 256, "images/LeftPipeA.png");
- _leftWall.immovable = true;
- _walls.add(_leftWall);
- _leftWallB = new FlxSprite(0, 32, "images/LeftPipeB.png");
- _leftWallB.immovable = true;
- _walls.add(_leftWallB);
- _rightWall = new FlxSprite(482, 0,"images/RightPipe.png");
- _rightWall.immovable = true;
- _walls.add(_rightWall);
- _topWall = new FlxSprite(0, 0,"images/TopPipeA.png");
- _topWall.immovable = true;
- _walls.add(_topWall);
- _topWallB = new FlxSprite(256, 0,"images/TopPipeB.png");
- _topWallB.immovable = true;
- _walls.add(_topWallB);
- _bottomWall = new FlxSprite(0, 464);
- _bottomWall.makeGraphic(640, 16, FlxColor.GRAY);
- _bottomWall.immovable = true;
- _bottomWall.visible = false;
- //_walls.add(_bottomWall);
- add(_bottomWall);
- add(_walls);
- }
- //Clean Out Everything
- private function CleanScreen():Void
- {
- remove(Bricks);
- remove(Screen);
- remove(playerBullets);
- remove(lavas1);
- remove(EndTag);
- remove(ExitDoor);
- remove(BallGroup);
- remove(PowerGroup);
- }
- private function LoadLevel(Screen:Int):Void
- {
- if(ScreenNumber!=1) CleanScreen();
- //Each screen is a ogmo level now
- Scene = new FlxOgmoLoader("data/Screen"+ Std.string(ScreenNumber) + ".oel");
- Base = Scene.loadTilemap("images/TileSet.png", 32, 16, "Bricks");
- for (i in 1...31) Base.setTileProperties(i, FlxObject.ANY, leftHit);
- add(Base);
- Scene.loadEntities(placeEntities, "Squares"); //Layering issue
- add(Bricks);
- add(playerBullets);
- lavas1 = new FlxTypedGroup<Liquid>();
- var delta = 0;
- var r : Bool = false;
- for (i in 0 ... 20)
- {
- if (!r) delta ++;
- else delta --;
- if (delta == 10) r = true;
- if (delta == 0) r = false;
- lava1 = new Liquid(0 + (i * 32), 472 - (delta-delta/2) * 2, delta/50,0xBBFC0C12,0xBB10A9FC,true,false ); // 2500 pour pas les voir au start. lower for this game
- lavas1.add(lava1);
- }
- add(lavas1);
- _ball.reset(_bat.getMidpoint().x, _bat.getMidpoint().y - 16);
- _ball.elasticity = 1;
- _ball.maxVelocity.set(200, 430);
- _ball.velocity.y = 200;
- add(BallGroup);
- add(PowerGroup);
- BallGroup.add(_ball);
- add(EndTag);
- }
- private function placeEntities(entityName:String, entityData:Xml):Void
- {
- var x:Int = Std.parseInt(entityData.get("x"));
- var y:Int = Std.parseInt(entityData.get("y"));
- var eType:Int = Std.parseInt(entityData.get("eType"));
- var isPow:Int = Std.parseInt(entityData.get("isPow"));
- var pCast:Int = Std.parseInt(entityData.get("PowType"));
- if (entityName == "Brick1") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick2") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick3") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick4") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick5") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick6") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick7") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick8") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick9") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick10") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick11") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick12") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick13") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick14") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick15") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick16") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick17") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick18") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick19") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick20") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick21") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick22") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick23") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick24") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick25") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick26") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick27") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- if (entityName == "Brick28") Bricks.add(new Brick(x, y, eType,isPow,pCast));
- //if (entityName == "PowerUp") PowerGroup.add(new PowerBrick(x, y, eType));
- }
- private function onVictory():Void
- {
- if (isGameOver == false)
- {
- for (all in BallGroup) all.halt();
- EndNum = 4;
- ScreenNumber += 1;
- EndTag.visible = false;
- if (ScreenNumber <= 10) LoadLevel(ScreenNumber);
- }
- }
- private function GameOver():Void
- {
- _ball.kill();
- _bat.kill();
- GameEndText.visible = true;
- NextGame.visible = true;
- }
- private function onLostLife():Void
- {
- if (isGameOver == false)
- {
- EndNum = 4;
- EndTag.visible = false;
- _bat.revive();
- _bat.reset(268, 426);
- _ball.revive();
- _ball.reset(_bat.getMidpoint().x, _bat.getMidpoint().y - 16);
- _ball.init();
- BallGroup.add(_ball);
- add(_ball);
- }
- }
- override public function update(elapsed:Float):Void
- {
- if (FlxG.keys.justPressed.P)
- {
- _paused = !_paused;
- }
- /*
- if (!_paused)
- {
- _ball.velocity.x = 200;
- _ball.velocity.y = 200;
- }*/
- if (_paused)
- {
- //_ball.velocity.x = 0;
- //_ball.velocity.y = 0;
- return;
- }
- FlxG.watch.add(this, "ScreenNumber", "ScreenIs");
- //End State
- #if !android
- if (FlxG.keys.justReleased.R)
- {
- FlxG.resetState();
- }
- if (FlxG.keys.justReleased.X && isGameOver == true)
- {
- FlxG.camera.fade(FlxColor.BLACK, 1, false, FadeOut, false);
- }
- #end
- FlxG.collide(BallGroup, Base,leftHit);
- FlxG.collide(BallGroup, Screen);
- if (FlxG.overlap(BallGroup, _walls))
- {
- FlxG.collide(BallGroup, _walls);
- FlxG.sound.play("Smack", 1, false);
- }
- /*
- if (_ball.overlaps(_walls))
- {
- FlxG.collide(BallGroup, _walls);
- FlxG.sound.play("Smack", 1, false);
- }*/
- FlxG.collide(_bat, BallGroup, ping);
- FlxG.collide(BallGroup, Bricks, scoreBricks);
- FlxG.collide(BallGroup, PowerGroup, PowerBricks);
- //Bullets
- FlxG.collide(playerBullets, Bricks);
- FlxG.overlap(playerBullets, Bricks,scoreBricksShot);
- //FlxG.overlap(_ball, Bricks, scoreBricks);
- _scoreDisplay.text = "" + _score;
- _levelDisplay.text = "" + ScreenNumber;
- _liveDisplay.text = "" + _lives;
- //Game Over
- if (_lives < 0)
- {
- isGameOver = true;
- GameOver();
- }
- //Bricks clear
- // Fade out to victory screen stuffs
- if (Bricks.countLiving() <= 0)
- {
- if (isGameOver == false)
- {
- _ball.velocity.x = 0;
- _ball.velocity.y = 0;
- if (EndNum == 4) FlxG.sound.play("RoundEnd", 1, false);
- if (EndNum > 0) EndNum -= elapsed;
- EndTag.visible = true;
- EndTag.text = "Ready in: " + Std.int(EndNum);
- if (EndNum <= 0)
- {
- EndNum = 4;
- onVictory();
- }
- }
- }
- //Lose Ball at bottom
- //FlxG.overlap(BallGroup, _walls)
- //if (_ball.overlaps(_bottomWall)) -Original
- FlxG.overlap(BallGroup, _bottomWall, ExtraLoss);
- if (isGameOver == false)
- {
- if (BallGroup.countLiving() <= 0)
- {
- BallGroup.kill();
- _bat.kill();
- if (EndNum == 4) FlxG.sound.play("Death", 1, false);
- if (EndNum > 0) EndNum -= elapsed;
- EndTag.visible = true;
- if (_lives > 0) EndTag.text = "Ready in: " + Std.int(EndNum);
- else
- {
- EndTag.text = ("Waiting...");
- EndNum = 0;
- }
- if (EndNum <= 0 && isGameOver == false)
- {
- _lives -= 1;
- EndNum = 4;
- onLostLife();
- }
- }
- } else
- {
- EndNum = 0;
- EndTag.visible = false;
- EndTag.text = ("Waiting...");
- isGameOver = true;
- GameOver();
- }
- /*
- if (FlxG.overlap(BallGroup, _bottomWall))
- {
- if (isGameOver == false)
- {
- for (single in BallGroup)
- {
- if (single.overlaps(_bottomWall)) single.kill();
- }
- if (BallGroup.countLiving() <= 0)
- {
- BallGroup.kill();
- _bat.kill();
- if (EndNum == 4) FlxG.sound.play("Death", 1, false);
- if (EndNum > 0) EndNum -= elapsed;
- EndTag.visible = true;
- if (_lives > 0) EndTag.text = "Ready in: " + Std.int(EndNum);
- else
- {
- EndTag.text = ("Waiting...");
- EndNum = 0;
- }
- if (EndNum <= 0 && isGameOver == false)
- {
- _lives -= 1;
- EndNum = 4;
- onLostLife();
- }
- }
- } else
- {
- EndNum = 0;
- EndTag.visible = false;
- EndTag.text = ("Waiting...");
- isGameOver = true;
- GameOver();
- }
- }
- */
- //1 up
- while (_score >= _extralife)
- {
- FlxG.sound.play("RoundEnd",1);
- _score += 7;
- _extralife += 500;
- _lives++;
- }
- if (_lives < 0) _liveDisplay.text = ("0");
- if (FlxG.keys.pressed.SPACE)
- {
- var pB = new Bullet(_bat.getMidpoint().x, _bat.getMidpoint().y);
- playerBullets.add(pB);
- }
- if (FlxG.keys.justPressed.E)
- {
- var pB2 = new Ball(_ball.getMidpoint().x, _ball.getMidpoint().y);
- BallGroup.add(pB2);
- }
- if (FlxG.keys.justPressed.S)
- {
- _lives--;
- }
- super.update(elapsed);
- }
- public function ExtraLoss(life:FlxObject,impact:FlxObject):Void
- {
- if (Std.is(life, Ball))
- {
- life.kill();
- }
- }
- private function FadeOut():Void
- {
- FlxG.switchState(new MenuState());
- }
- private function PowerBricks(Ba:Ball,B:PowerBrick):Void
- {
- for (i in 0...3)
- {
- if (B.eType == i)
- {
- var B1 = new Ball(Ba.x + 16, Ba.y);
- BallGroup.add(B1);
- var B2 = new Ball(Ba.x - 16, Ba.y);
- BallGroup.add(B2);
- var B3 = new Ball(Ba.x, Ba.y + 16);
- BallGroup.add(B3);
- B1.init();
- B2.init();
- B3.init();
- }
- }
- B.kill();
- }
- private function scoreBricksShot(Shot:Bullet, B:Brick):Void
- {
- if (B.alive && B.exists && Shot.alive && Shot.exists )
- {
- /*
- _sndCoin.play(true);
- _money++;
- _hud.updateHUD(_health, _money);
- */
- _score += 7;
- Shot.kill();
- B.kill();
- }
- }
- private function scoreBricks(Ba:Ball,B:Brick):Void
- {
- if (B.alive && B.exists)
- {
- //Power Up Bricks
- if (B.isPower == 1 && B.eType == 1)
- {
- var B1 = new Ball(Ba.x + 16, Ba.y);
- BallGroup.add(B1);
- var B2 = new Ball(Ba.x - 16, Ba.y);
- BallGroup.add(B2);
- var B3 = new Ball(Ba.x, Ba.y + 16);
- BallGroup.add(B3);
- B1.init();
- B2.init();
- B3.init();
- }
- /*
- _sndCoin.play(true);
- _money++;
- _hud.updateHUD(_health, _money);
- */
- _score += 7;
- B.kill();
- }
- }
- private function leftHit(Tile:FlxObject, Particle:FlxObject):Void
- {
- removeTile(cast Tile);
- }
- private function hit(Ball:FlxObject, Brick:FlxObject):Void
- {
- Brick.exists = false;
- }
- private function removeTile(Tile:FlxTile):Void
- {
- //Screen.setTileByIndex(Tile.mapIndex, 0, true);
- Base.setTileByIndex(Tile.mapIndex, 0, true);
- }
- private function ping(BatZ:Bat, BallZ:Ball):Void
- {
- FlxG.sound.play("Smack", 1, false);
- var batmid:Int = Std.int(BatZ.x) + 20;
- var ballmid:Int = Std.int(BallZ.x) + 3;
- var diff:Int;
- if (ballmid < batmid)
- {
- // Ball is on the left of the bat
- diff = batmid - ballmid;
- BallZ.velocity.x = ( -10 * diff);
- }
- else if (ballmid > batmid)
- {
- // Ball on the right of the bat
- diff = ballmid - batmid;
- BallZ.velocity.x = (10 * diff);
- }
- else
- {
- // Ball is perfectly in the middle
- // A little random X to stop it bouncing up!
- BallZ.velocity.x = 2 + FlxG.random.int(0, 8);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement