Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Final_diplom.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
14.44 Mб
Скачать

Appendix a: КзХан.Swf

Application source code

File name GameController.as:

package { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.text.*; import flash.utils.*; import flash.ui.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Graphics; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; // [SWF(width = 465, height = 465, frameRate = 30, backgroundColor = "#ffffff")] import Game.*; public class GameController extends MovieClip { private var currTower; private var placings, towers:Array; public var monsters, bullets:Array; private var life, timer, waveStartTime:Number; private var currGold, currWave, maxWave:Number; private var hitEscape:Boolean; public function GameController() { } public function startMenu() { btnPlay.addEventListener(MouseEvent.CLICK, gotoGame); } private function gotoGame(evt:MouseEvent) { btnPlay.removeEventListener(MouseEvent.CLICK, gotoGame); gotoAndStop("game"); } public function startGameWin() { btnRestart.addEventListener(MouseEvent.CLICK, gotoMenu); } public function startGameOver() { btnRestart.addEventListener(MouseEvent.CLICK, gotoMenu); } private function gotoMenu(evt:MouseEvent) { btnRestart.removeEventListener(MouseEvent.CLICK, gotoMenu); gotoAndStop("menu"); } public function startGame() { currGold = C.START_GOLD; currWave = 0; maxWave = C.MAX_WAVE; placings = new Array(); monsters = new Array(); towers = new Array(); bullets = new Array(); timer = 0; life = C.PLAYER_START_LIFE; setupGame(); //Initialise the UI event listeners mcGameUI.btnBuildFireTower.addEventListener( MouseEvent.CLICK, clickTowerFire); mcGameUI.btnBuildFireTower.addEventListener( MouseEvent.ROLL_OVER, showTowerFireHelp); mcGameUI.btnBuildFireTower.addEventListener( MouseEvent.ROLL_OUT, clearHelp); mcGameUI.btnBuildIceTower.addEventListener( MouseEvent.CLICK, clickTowerIce); mcGameUI.btnBuildIceTower.addEventListener( MouseEvent.ROLL_OVER, showTowerIceHelp); mcGameUI.btnBuildIceTower.addEventListener( MouseEvent.ROLL_OUT, clearHelp); mcGameUI.btnBuildLightningTower.addEventListener( MouseEvent.CLICK, clickTowerLightning); mcGameUI.btnBuildLightningTower.addEventListener( MouseEvent.ROLL_OVER, showTowerLightningHelp); mcGameUI.btnBuildLightningTower.addEventListener( MouseEvent.ROLL_OUT, clearHelp); mcGameUI.mouseEnabled = false; mcGameStage.addEventListener(Event.ENTER_FRAME,update); //Handle event when this game is being preloaded addEventListener(Event.ADDED_TO_STAGE, gameAddedToStage ); //Handle situations when this game is being run directly if (stage != null) { stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); } } private function gameAddedToStage(evt: Event):void { stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); } private function keyDownHandler(evt:KeyboardEvent):void { if (evt.keyCode == 27) //ESC Key { hitEscape = true; } } private function setupGame() { //Loop through all items on stage for (var i=0; i< mcGameStage.numChildren; i++) { var currObject = mcGameStage.getChildAt(i); //Look through the objects to see if it is class Placing if (currObject is Placing) { placings.push(currObject); currObject.gotoAndStop("off"); currObject.addEventListener(MouseEvent.ROLL_OVER, turnOnPlacing); currObject.addEventListener(MouseEvent.ROLL_OUT, turnOffPlacing); } } } private function turnOnPlacing(evt:MouseEvent) { var currPlacing = evt.currentTarget as Placing; if (currPlacing.currentLabel == "possible") currPlacing.gotoAndStop("on"); } private function turnOffPlacing(evt:MouseEvent) { var currPlacing = evt.currentTarget as Placing; if (currPlacing.currentLabel == "on") currPlacing.gotoAndStop("possible"); } private function clickTowerFire(evt:MouseEvent) { //Check if the player has already clicked on a tower if (currTower != null) { mcGameUI.removeChild(currTower); currTower = null; } if (currGold >= C.TOWER_FIRE_COST) { currGold -= C.TOWER_FIRE_COST; //Create a Fire Tower now, referenced by the variable currTower currTower = new Tower_Fire(); mcGameUI.addChild(currTower); //Turn on all placings for (var i in placings) { if (placings[i].canPlace) placings[i].gotoAndStop("possible"); } } } private function clickTowerIce(evt:MouseEvent) { //Check if the player has already clicked on a tower if (currTower != null) { mcGameUI.removeChild(currTower); currTower = null; } if (currGold >= C.TOWER_ICE_COST) { currGold -= C.TOWER_ICE_COST; //Create a Fire Tower now, referenced by the variable currTower currTower = new Tower_Ice(); mcGameUI.addChild(currTower); //Turn on all placings for (var i in placings) { if (placings[i].canPlace) placings[i].gotoAndStop("possible"); } } } private function clickTowerLightning(evt:MouseEvent) { //Check if the player has already clicked on a tower if (currTower != null) { mcGameUI.removeChild(currTower); currTower = null; } if (currGold >= C.TOWER_LIGHTNING_COST) { currGold -= C.TOWER_LIGHTNING_COST; //Create a Fire Tower now, referenced by the variable currTower currTower = new Tower_Lightning(); mcGameUI.addChild(currTower); //Turn on all placings for (var i in placings) { if (placings[i].canPlace) placings[i].gotoAndStop("possible"); } } } private function showTowerFireHelp(evt:MouseEvent) { mcGameUI.txtHelp.text = C.TOWER_FIRE_HELP; } private function showTowerIceHelp(evt:MouseEvent) { mcGameUI.txtHelp.text = C.TOWER_ICE_HELP; } private function showTowerLightningHelp(evt:MouseEvent) { mcGameUI.txtHelp.text = C.TOWER_LIGHTNING_HELP; } private function clearHelp(evt:MouseEvent) { mcGameUI.txtHelp.text = ""; } public function update(evt:Event) { if (hitEscape) { if (currTower) { //cancel build if (currTower is Tower_Fire) { //refund gold currGold += C.TOWER_FIRE_COST; } else if (currTower is Tower_Ice) { //refund gold currGold += C.TOWER_ICE_COST; } else if (currTower is Tower_Lightning) { //refund gold currGold += C.TOWER_LIGHTNING_COST; } mcGameUI.removeChild(currTower); currTower = null; for (var i in placings) { placings[i].gotoAndStop("off"); } } } hitEscape = false; if (currTower != null) { currTower.x = mouseX; currTower.y = mouseY; } if ((currWave < maxWave) && (monsters.length == 0)) { currWave++; //spawn the monsters spawnWave(currWave); } for (var i=monsters.length - 1; i >= 0; i--) { if (monsters[i].currLife > 0) { monsters[i].update(); } //Check if monster reaches the end of their path if (monsters[i].hasReachedDestination()) { monsters[i].gotoAndStop("remove"); life -= 1; } if (monsters[i].currentLabel == "remove") { mcGameStage.removeChild(monsters[i]); monsters.splice(i,1); //Award Gold currGold += C.MONSTER_GOLD; } } //Update all the towers for (var i in towers) { towers[i].update(); } //Update all the bullets for (var i=bullets.length - 1; i >= 0; i--) { bullets[i].update(); if (bullets[i].currentLabel == "remove") { mcGameStage.removeChild(bullets[i]); bullets.splice(i,1); } } //Check for end game if (life <= 0) { gameOver(); //stop all subsequent code in this update to run return; } else if ((currWave == maxWave) && (monsters.length == 0)) { gameWin(); } mcGameUI.txtLife.text = String(life); mcGameUI.txtGold.text = String(currGold); mcGameUI.txtWave.text = String(currWave) + " / " + String(maxWave); } private function gameOver() { mcGameStage.removeEventListener(Event.ENTER_FRAME,update); stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); for (var i in placings) { placings[i].removeEventListener(MouseEvent.ROLL_OVER, turnOnPlacing); placings[i].removeEventListener(MouseEvent.ROLL_OUT, turnOffPlacing); } gotoAndStop("gameOver"); } private function gameWin() { mcGameStage.removeEventListener(Event.ENTER_FRAME,update); stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); for (var i in placings) { placings[i].removeEventListener(MouseEvent.ROLL_OVER, turnOnPlacing); placings[i].removeEventListener(MouseEvent.ROLL_OUT, turnOffPlacing); } gotoAndStop("gameWin"); } //public functions for children to invoke public function placeTowerAt(xPos,yPos) { currTower.x = xPos; currTower.y = yPos; mcGameStage.addChild(currTower); towers.push(currTower); currTower.setActive(); currTower = null; for (var i in placings) { placings[i].gotoAndStop("off"); } } //Spawning of monsters private function spawnMonster(xPos, yPos) { var monsterToSpawn = new Monster(); monsterToSpawn.x = xPos; monsterToSpawn.y = yPos; monsters.push(monsterToSpawn); mcGameStage.addChild(monsterToSpawn); } private function spawnMonster1(xPos, yPos) { var monsterToSpawn1 = new Monster1(); monsterToSpawn1.x = xPos; monsterToSpawn1.y = yPos; monsters.push(monsterToSpawn1); mcGameStage.addChild(monsterToSpawn1); } private function spawnMonster2(xPos, yPos) { var monsterToSpawn2 = new Monster2(); monsterToSpawn2.x = xPos; monsterToSpawn2.y = yPos; monsters.push(monsterToSpawn2); mcGameStage.addChild(monsterToSpawn2); } private function spawnBoss(xPos, yPos) { var monsterToSpawn = new Boss(); monsterToSpawn.x = xPos; monsterToSpawn.y = yPos; monsters.push(monsterToSpawn); mcGameStage.addChild(monsterToSpawn); } private function spawnWave(currWave) { if (currWave == 1) { spawnMonster(C.MONSTER_START_X, C.MONSTER_START_Y); } else if (currWave == 2) { for (var i = 0; i < 2; i++) { spawnMonster1(C.MONSTER_START_X_1 - 40*i, C.MONSTER_START_Y_1); } } else if (currWave == 3) { for (var i = 0; i < 4; i++) { spawnMonster2(C.MONSTER_START_X_2 - 40*i, C.MONSTER_START_Y_2); } } else if (currWave == 4) { for (var i = 0; i < 7; i++) { spawnMonster1(C.MONSTER_START_X_1 - 40*i, C.MONSTER_START_Y_1); } } else if (currWave == 5) { spawnBoss(C.BOSS_START_X - 40*i, C.BOSS_START_Y); } }

}

}

File name gallery.xml:

<?xml version="1.0" encoding="utf-8"?>

<GALLERY COLUMNS="5" XPOSITION="30" YPOSITION="30" WIDTH="100" HEIGHT="100">

<IMAGE FULL="full_images/image1.jpg" THUMB="thumbs/thumb1.jpg" />

<IMAGE FULL="full_images/image2.jpg" THUMB="thumbs/thumb2.jpg" />

<IMAGE FULL="full_images/image3.jpg" THUMB="thumbs/thumb3.jpg" />

<IMAGE FULL="full_images/image4.jpg" THUMB="thumbs/thumb4.jpg" />

<IMAGE FULL="full_images/image5.jpg" THUMB="thumbs/thumb5.jpg" />

<IMAGE FULL="full_images/image6.jpg" THUMB="thumbs/thumb6.jpg" />

<IMAGE FULL="full_images/image7.jpg" THUMB="thumbs/thumb7.jpg" />

<IMAGE FULL="full_images/image8.jpg" THUMB="thumbs/thumb8.jpg" />

<IMAGE FULL="full_images/image9.jpg" THUMB="thumbs/thumb9.jpg" />

<IMAGE FULL="full_images/image10.jpg" THUMB="thumbs/thumb10.jpg" />

<IMAGE FULL="full_images/image11.jpg" THUMB="thumbs/thumb11.jpg" />

<IMAGE FULL="full_images/image12.jpg" THUMB="thumbs/thumb12.jpg" />

<IMAGE FULL="full_images/image13.jpg" THUMB="thumbs/thumb13.jpg" />

<IMAGE FULL="full_images/image14.jpg" THUMB="thumbs/thumb14.jpg" />

<IMAGE FULL="full_images/image15.jpg" THUMB="thumbs/thumb15.jpg" />

<IMAGE FULL="full_images/image16.jpg" THUMB="thumbs/thumb16.jpg" />

<IMAGE FULL="full_images/image17.jpg" THUMB="thumbs/thumb17.jpg" />

<IMAGE FULL="full_images/image18.jpg" THUMB="thumbs/thumb18.jpg" />

<IMAGE FULL="full_images/image19.jpg" THUMB="thumbs/thumb19.jpg" />

<IMAGE FULL="full_images/image20.jpg" THUMB="thumbs/thumb20.jpg" />

<IMAGE FULL="full_images/image21.jpg" THUMB="thumbs/thumb21.jpg" />

<IMAGE FULL="full_images/image22.jpg" THUMB="thumbs/thumb22.jpg" />

<IMAGE FULL="full_images/image23.jpg" THUMB="thumbs/thumb23.jpg" />

<IMAGE FULL="full_images/image24.jpg" THUMB="thumbs/thumb24.jpg" />

<IMAGE FULL="full_images/image25.jpg" THUMB="thumbs/thumb25.jpg" />

</GALLERY>

File name Tower_Fire .as:

package Game

{

import flash.display.MovieClip;

import flash.events.*;

import flash.geom.*;

public class Tower_Fire extends MovieClip

{

private var isActive:Boolean;

private var range,cooldown,damage:Number;

public function Tower_Fire()

{

isActive = false;

range = C.TOWER_FIRE_RANGE;

cooldown = C.TOWER_FIRE_COOLDOWN;

damage = C.TOWER_FIRE_DAMAGE;

this.mouseEnabled = false;

}

public function setActive()

{

isActive = true;

}

public function update()

{

if (isActive)

{

var monsters = GameController(root).monsters;

if (cooldown <= 0)

{

for (var j = 0; j < monsters.length; j++)

{

var currMonster = monsters[j];

if ((Math.pow((currMonster.x - this.x),2)

+ Math.pow((currMonster.y - this.y),2)) < this.range)

{

//spawn new bullet

var bulletRotation = (180/Math.PI)*

Math.atan2((currMonster.y - this.y),

(currMonster.x - this.x));

var newBullet = new Bullet(currMonster.x,currMonster.y,

"fire",currMonster,this.damage,bulletRotation);

newBullet.x = this.x;

newBullet.y = this.y;

GameController(root).bullets.push(newBullet);

GameController(root).mcGameStage.addChild(newBullet);

this.cooldown = C.TOWER_FIRE_COOLDOWN;

break;

}

}

}

else

{

this.cooldown -= 1;

}

}

}

}

}

File name Boss.as:

package Game { import flash.display.MovieClip; import flash.events.*; import flash.geom.*; public class Boss extends MovieClip { public var currLife:Number; private var maxLife, gold, speed, currIndex, slowTimer:Number; private var checkPoints:Array; public function Boss() { maxLife = C.BOSS_LIFE; currLife = maxLife; speed = C.BOSS_SPEED; currIndex = 0; checkPoints = new Array(); checkPoints.push(new Point(2,257)); checkPoints.push(new Point(112,226)); checkPoints.push(new Point(158,185)); checkPoints.push(new Point(138,57)); checkPoints.push(new Point(222,40)); checkPoints.push(new Point(299,82)); checkPoints.push(new Point(395,113)); checkPoints.push(new Point(450,75)); checkPoints.push(new Point(525,49)); checkPoints.push(new Point(600,49)); } public function update() { var finalSpeed:Number; if (slowTimer > 0) { finalSpeed = speed / 2; slowTimer--; } else finalSpeed = speed; if (currIndex < checkPoints.length) { if (this.x < checkPoints[currIndex].x) this.x += Math.min(finalSpeed, Math.abs(this.x - checkPoints[currIndex].x)); else if (this.x > checkPoints[currIndex].x) this.x -= Math.min(finalSpeed, Math.abs(this.x - checkPoints[currIndex].x)); if (this.y < checkPoints[currIndex].y) this.y += Math.min(finalSpeed, Math.abs(this.y - checkPoints[currIndex].y)); else if (this.y > checkPoints[currIndex].y) this.y -= Math.min(finalSpeed, Math.abs(this.y - checkPoints[currIndex].y)); if ((this.x == checkPoints[currIndex].x) && (this.y == checkPoints[currIndex].y)) { currIndex += 1; } } if (currLife > 0) mcLifeBar.width = Math.floor((currLife/maxLife)* C.LIFEBAR_MAX_WIDTH); else mcLifeBar.width = 0; } public function takeDamage(amtDamage) { if (this.currLife <= 0) return; this.currLife -= amtDamage; if (this.currLife <= 0) { this.gotoAndPlay("death"); } } public function slowDown(amt) { slowTimer = amt; } public function hasReachedDestination() { return (this.currIndex == checkPoints.length); } } }

File name Bullet.as:

package Game { import flash.display.MovieClip; import flash.events.*; import flash.geom.*; public class Bullet extends MovieClip { private var speed,damage,targetX,targetY:Number; private var targetRef:*; public function Bullet(targetX,targetY,type,targetRef,damage,rotate) { this.targetX = targetX; this.targetY = targetY; this.gotoAndStop(type); this.targetRef = targetRef; this.damage = damage; this.rotation = rotate; this.speed = C.BULLET_SPEED; } public function update() { this.x += this.speed * Math.cos(Math.PI * this.rotation/180); this.y += this.speed * Math.sin(Math.PI * this.rotation/180); if (this.hitTestPoint(targetX,targetY)) { if (this.currentLabel == "lightning") { var monsters = GameController(root).monsters; for (var i = 0; i < monsters.length; i++) { var currMonster = monsters[i]; if ((Math.pow((currMonster.x - this.x),2) + Math.pow((currMonster.y - this.y),2)) < C.LIGHTNING_AOE_RANGE) { currMonster.takeDamage(this.damage); } } } else if (this.currentLabel == "ice") { this.targetRef.slowDown(C.TOWER_ICE_SLOW_AMOUNT); this.targetRef.takeDamage(this.damage); } else { this.targetRef.takeDamage(this.damage); } this.gotoAndStop("remove"); } } } }

File name C.as:

package Game { public class C { //GENERAL public static const GAME_WIDTH:Number = 600; public static const GAME_HEIGHT:Number = 500; public static const GAME_FPS:Number = 30; //Game public static const PLAYER_START_LIFE:Number = 15; public static const START_GOLD:Number = 100; public static const MAX_WAVE:Number = 5; //Towers public static const TOWER_FIRE_COST:Number = 60; public static const TOWER_ICE_COST:Number = 80; public static const TOWER_LIGHTNING_COST:Number = 110; public static const TOWER_FIRE_HELP:String = "Fire Tower\nCost:"+TOWER_FIRE_COST+"\nThis tower deals high damage to a single target"; public static const TOWER_ICE_HELP:String = "Ice Tower\nCost:"+TOWER_ICE_COST+"\nThis tower deals low damage, but slows a monster"; public static const TOWER_LIGHTNING_HELP:String = "Lightning Tower\nCost:"+TOWER_LIGHTNING_COST+"\nThis tower deals splash lightning damage to a group of close enemies"; public static const TOWER_FIRE_RANGE:Number = 10000; public static const TOWER_ICE_RANGE:Number = 10000; public static const TOWER_LIGHTNING_RANGE:Number = 10000; public static const LIGHTNING_AOE_RANGE:Number = 350000000; public static const TOWER_FIRE_COOLDOWN:Number = 15; public static const TOWER_ICE_COOLDOWN:Number = 10; public static const TOWER_LIGHTNING_COOLDOWN:Number = 30; public static const TOWER_FIRE_DAMAGE:Number = 6; public static const TOWER_ICE_DAMAGE:Number = 3; public static const TOWER_LIGHTNING_DAMAGE:Number = 2; public static const TOWER_ICE_SLOW_AMOUNT:Number = 90; //Monsters public static const MONSTER_START_X:Number = 0; public static const MONSTER_START_Y:Number = 140; public static const MONSTER_START_X_1:Number = 0; public static const MONSTER_START_Y_1:Number = 230; public static const MONSTER_START_X_2:Number = 0; public static const MONSTER_START_Y_2:Number = 330; public static const MONSTER_GOLD:Number = 15; public static const MONSTER_LIFE:Number = 30; public static const MONSTER_SPEED:Number = 2; public static const BOSS_LIFE:Number = 500; public static const BOSS_SPEED:Number = 1; public static const BOSS_START_X:Number = 2; public static const BOSS_START_Y:Number = 255; public static const LIFEBAR_MAX_WIDTH:Number = 20; //Bullets public static const BULLET_SPEED:Number = 5; } }

File name Monster.as:

package Game

{

import flash.display.MovieClip;

import flash.events.*;

import flash.geom.*;

public class Monster extends MovieClip

{

public var currLife:Number;

private var maxLife, gold, speed, currIndex, slowTimer:Number;

private var checkPoints:Array;

public function Monster()

{

maxLife = C.MONSTER_LIFE;

currLife = maxLife;

speed = C.MONSTER_SPEED;

currIndex = 0;

checkPoints = new Array();

checkPoints.push(new Point(0,140));

checkPoints.push(new Point(585,140));

}

public function update()

{

var finalSpeed:Number;

if (slowTimer > 0)

{

finalSpeed = speed / 2;

slowTimer--;

}

else

finalSpeed = speed;

if (currIndex < checkPoints.length)

{

//move in the direction of the checkpoint

if (this.x < checkPoints[currIndex].x)

this.x += Math.min(finalSpeed, Math.abs(this.x -

checkPoints[currIndex].x));

else if (this.x > checkPoints[currIndex].x)

this.x -= Math.min(finalSpeed, Math.abs(this.x -

checkPoints[currIndex].x));

if (this.y < checkPoints[currIndex].y)

this.y += Math.min(finalSpeed, Math.abs(this.y -

checkPoints[currIndex].y));

else if (this.y > checkPoints[currIndex].y)

this.y -= Math.min(finalSpeed, Math.abs(this.y -

checkPoints[currIndex].y));

if ((this.x == checkPoints[currIndex].x) &&

(this.y == checkPoints[currIndex].y))

{

currIndex += 1;

}

}

if (currLife > 0)

mcLifeBar.width = Math.floor((currLife/maxLife)*

C.LIFEBAR_MAX_WIDTH);

else

mcLifeBar.width = 0;

}

public function takeDamage(amtDamage)

{

if (this.currLife <= 0)

return;

this.currLife -= amtDamage;

if (this.currLife <= 0)

{

this.gotoAndPlay("death");

}

}

public function slowDown(amt)

{

slowTimer = amt;

}

public function hasReachedDestination()

{

return (this.currIndex == checkPoints.length);

}

}

}

File name Placing.as:

package Game

{

import flash.display.MovieClip;

import flash.events.*;

import flash.geom.*;

public class Placing extends MovieClip

{

public var canPlace:Boolean;

public function Placing()

{

canPlace = true;

this.addEventListener(MouseEvent.CLICK, placeTower);

}

public function placeTower(evt:MouseEvent)

{

this.removeEventListener(MouseEvent.CLICK,placeTower);

canPlace = false;

GameController(root).placeTowerAt(this.x, this.y);

}

}

}

File name preloader.as:

package Game {

import flash.display.MovieClip;

import flash.events.*;

dynamic public class preloader extends MovieClip {

public function preloader() {

addEventListener(Event.ENTER_FRAME, Update);

}

public function Update(e : Event):void {

var bytesLoaded:Number = stage.loaderInfo.bytesLoaded;

var bytesTotal:Number = stage.loaderInfo.bytesTotal;

var s:String = "";

var percent:Number = 0;

if (bytesTotal>0){

percent = Math.floor(bytesLoaded/bytesTotal*100);

s = percent+"% ("+

Math.round(bytesLoaded/1024)+"kb / "+

Math.round(bytesTotal/1024)+"kb)";

}

this.txt.text="Loading... "+s;

this.progressbar.gotoAndStop(percent+1);

if (bytesLoaded==bytesTotal || bytesTotal==0){

removeEventListener(Event.ENTER_FRAME, Update);

play();

}

}

}

}

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]