Направете своята безплатна регистрация и се възползвайте от пълните възможности, които предлага iTSchool

Преглед на урок

Игра "Тетрис"

Игра "Тетрис"




Поредицата на Studio-bg.com продължава, с една Уникална игра!!!
Сега ще научите, как можете да си направите играта "Тетрис" в 10 стъпки.
Едва ли има някой, който да не е играл тази игра, появила се през Юни 1985г. Създадена е от Алексей Пажитнов (Pazhitnov) на компютър "Электроника"-60 в Московския Университет по Компютърни науки (Москва, Русия). Продадени са близо милион броя за около година, която я прави най-популярната компютърна игра в историята!

А сега ще разберете, как можете да си я направите на Macromedia FLash :)

Да започваме!

1. Отворете нов документ с размери: 300 х 400. Frame rate - 18 (Увеличете, за да е по-бързо!)

2. Направете това:



Като в него полетата Ниво, Точки, Редове са Static Text, а бланките (Просто празни текстови полета) - Dynamic Text.

Вертикалната линия е на координати (в Properties):

Width: 0
Height: 400
X: 200
Y: 0


3. Сега ще се насочим към формата, която е написана вляво. Маркирайте "Натиснете за старт" и правоъгълника-фон заедно. Дайте F8 и го превърнете в символ-Movie clip с име "popup". Нагласете и Instance name в Properties също така!

4. Кликнете 2 пъти върху получения символ. Ще ви се отвори Scene 1 > Popup. Кликнете на Frame 1. Дайте F9 и напишете stop(); там! Затворете Actions като натиснете F9 отново. Кликнете на Frame 2 и дайте Десен бутон > Insert Keyframe. Направете поле за "Game Over". Кликнете на Frame 3 и просто натиснете F7:



5. Кликнете на Scene 1. Дайте Ctrl + F8. Movie Clip с име "piece". Уверете се, че сте нагласили Registration по следния начин:



6. Така. Сега направете още 6 Keyframe-a, за да станат 7! Сменете цветовете им по желание, за да стане нашият "Тетрис" по-интересен и красив. :)



7. Кликнете на Frame 1, дайте F9 и напишете stop(); там:



8. Натиснете Scene 1. Отворете Library (Ctrl + L). Кликнете с Десен бутон на piece и дайте Linkage... Нагласете, както е показано:



9. Натиснете на Frame 1. Отворете Actions (F9) и въведете този невероятно дълъг код там, съставен от 528 реда!


Код

var unitsize = 20;
var unitheight = 20;
var unitwidth = 10;
var piececount = 0;
var piecetype;
var oldlines = 0;
var speed = 10;
var frame = 1;
var level = 1;
var realpaused = false;
var levelspeed = 8;
lines = 0;
score = 0;
moviecliplist = new Array();
xx = new Array("1", "2", "3", "4");
yy = new Array("1", "1", "1", "1");
framecount = 0;
var paused = true;
var rotatedcount = 0;
unitmap = new Array();
for (var i = 0; i < unitwidth; i++)
{
	unitmap[i] = new Array();
	unitmap[i][unitheight + 1] = 1;
}
mouseListener = new Object();
mouseListener.onMouseDown = function()
{
	if (paused && realpaused == false)
	{
		for (var i = 0; i <= unitheight; i++)
		{
			for (var j = 0; j <= unitwidth; j++)
			{
				unitmap[j][i] = undefined;
			}
		}
		for (var i = 0; i < moviecliplist.length; i++)
		{
			removeMovieClip(moviecliplist[i]);
		}
		startgame();
	}
};
Mouse.addListener(mouseListener);
keyListener = new Object();
keyListener.onKeyDown = function()
{
	var key = Key.getCode();
	if (paused)
	{
		if (key == 80)
		{
			paused = false;
		}
	}
	else
	{
		if (key == 80)
		{
			realpaused = true;
			paused = true;
		}
		if (key == 38)
		{
			if (piecetype == 0)
			{
				if (rotatedcount == 0)
				{
					if (unitmap[xx[0] + 2][yy[0] - 1] == undefined && unitmap[xx[1] + 1][yy[1]] == undefined && unitmap[xx[2]][yy[2] + 1] == undefined && unitmap[xx[3] - 1][yy[3] + 2] == undefined)
					{
						xx[0] = xx[0] + 2;
						yy[0] = yy[0] - 1;
						xx[1] = xx[1] + 1;
						yy[2] = yy[2] + 1;
						xx[3] = xx[3] - 1;
						yy[3] = yy[3] + 2;
						rotatedcount++;
					}
				}
				else
				{
					if (unitmap[xx[0] - 2][yy[0] + 1] == undefined && unitmap[xx[1] - 1][yy[1]] == undefined && unitmap[xx[2]][yy[2] - 1] == undefined && unitmap[xx[3] + 1][yy[3] - 2] == undefined && currentpiece._x != 0 && currentpiece._x != 20 && currentpiece._x != 180)
					{
						xx[0] = xx[0] - 2;
						yy[0] = yy[0] + 1;
						xx[1] = xx[1] - 1;
						yy[2] = yy[2] - 1;
						xx[3] = xx[3] + 1;
						yy[3] = yy[3] - 2;
						rotatedcount = 0;
					}
				}
				reposition();
			}
			else if (piecetype == 1)
			{
				if (rotatedcount == 0)
				{
					if (unitmap[xx[0] + 1][yy[0] - 1] == undefined && unitmap[xx[2] - 1][yy[2] + 1] == undefined && unitmap[xx[3]][yy[3] - 2] == undefined)
					{
						xx[0] = xx[0] + 1;
						yy[0] = yy[0] - 1;
						xx[2] = xx[2] - 1;
						yy[2] = yy[2] + 1;
						yy[3] = yy[3] - 2;
						rotatedcount++;
					}
				}
				else if (rotatedcount == 1)
				{
					if (unitmap[xx[0] - 1][yy[0] + 1] == undefined && unitmap[xx[2] - 1][yy[2] - 2] == undefined && unitmap[xx[3]][yy[3] + 1] == undefined && currentpiece._x != 0)
					{
						xx[0] = xx[0] - 1;
						yy[0] = yy[0] + 1;
						xx[2] = xx[2] - 1;
						yy[2] = yy[2] - 2;
						yy[3] = yy[3] + 1;
						rotatedcount++;
					}
				}
				else if (rotatedcount == 2)
				{
					if (unitmap[xx[0]][yy[0] + 1] == undefined && unitmap[xx[2] + 1][yy[2]] == undefined && unitmap[xx[3] - 1][yy[3] + 1] == undefined)
					{
						yy[0] = yy[0] + 1;
						xx[2] = xx[2] + 1;
						xx[3] = xx[3] - 1;
						yy[3] = yy[3] + 1;
						rotatedcount++;
					}
				}
				else
				{
					if (unitmap[xx[0]][yy[0] - 1] == undefined && unitmap[xx[2] + 1][yy[2] + 1] == undefined && unitmap[xx[3] + 1][yy[3]] == undefined && xx[0] != 8)
					{
						yy[0] = yy[0] - 1;
						xx[2] = xx[2] + 1;
						yy[2] = yy[2] + 1;
						xx[3] = xx[3] + 1;
						rotatedcount = 0;
					}
				}
				reposition();
			}
			else if (piecetype == 2)
			{
				if (rotatedcount == 0)
				{
					if (unitmap[xx[0] + 1][yy[0] - 1] == undefined && unitmap[xx[2] + 1][yy[2]] == undefined && unitmap[xx[3]][yy[3] + 1] == undefined)
					{
						xx[0] = xx[0] + 1;
						yy[0] = yy[0] - 1;
						xx[2] = xx[2] + 1;
						yy[3] = yy[3] + 1;
						rotatedcount++;
					}
				}
				else if (rotatedcount == 1)
				{
					if (unitmap[xx[0] - 1][yy[0] + 1] == undefined && unitmap[xx[2] + 1][yy[2] - 1] == undefined && unitmap[xx[3]][yy[3] - 2] == undefined && currentpiece._x != 0)
					{
						xx[0] = xx[0] - 1;
						yy[0] = yy[0] + 1;
						xx[2] = xx[2] + 1;
						yy[2] = yy[2] - 1;
						yy[3] = yy[3] - 2;
						rotatedcount++;
					}
				}
				else if (rotatedcount == 2)
				{
					if (unitmap[xx[0]][yy[0] - 1] == undefined && unitmap[xx[2] - 1][yy[2] + 1] == undefined && unitmap[xx[3] - 1][yy[3]] == undefined)
					{
						yy[0] = yy[0] - 1;
						xx[2] = xx[2] - 1;
						yy[2] = yy[2] + 1;
						xx[3] = xx[3] - 1;
						rotatedcount++;
					}
				}
				else
				{
					if (unitmap[xx[0]][yy[0] + 1] == undefined && unitmap[xx[2] - 1][yy[2]] == undefined && unitmap[xx[3] + 1][yy[3] + 1] == undefined && xx[0] != 8)
					{
						yy[0] = yy[0] + 1;
						xx[2] = xx[2] - 1;
						xx[3] = xx[3] + 1;
						yy[3] = yy[3] + 1;
						rotatedcount = 0;
					}
				}
				reposition();
			}
			else if (piecetype == 4)
			{
				if (rotatedcount == 0)
				{
					if (unitmap[xx[0] + 1][yy[0] - 2] == undefined && unitmap[xx[1] + 1][yy[1]] == undefined)
					{
						xx[0] = xx[0] + 1;
						yy[0] = yy[0] - 2;
						xx[1] = xx[1] + 1;
						rotatedcount++;
					}
				}
				else
				{
					if (unitmap[xx[0] - 1][yy[0] + 2] == undefined && unitmap[xx[1] - 1][yy[1]] == undefined && currentpiece._x != 0)
					{
						xx[0] = xx[0] - 1;
						yy[0] = yy[0] + 2;
						xx[1] = xx[1] - 1;
						rotatedcount = 0;
					}
				}
				reposition();
			}
			else if (piecetype == 5)
			{
				if (rotatedcount == 0)
				{
					if (unitmap[xx[0] + 1][yy[0]] == undefined && unitmap[xx[1] + 1][yy[1]] == undefined && unitmap[xx[3]][yy[3] - 2] == undefined)
					{
						xx[0] = xx[0] + 1;
						xx[1] = xx[1] + 1;
						yy[3] = yy[3] - 2;
						rotatedcount++;
					}
				}
				else
				{
					if (unitmap[xx[0] - 1][yy[0]] == undefined && unitmap[xx[1] - 1][yy[1]] == undefined && unitmap[xx[3]][yy[3] + 2] == undefined && currentpiece._x != 0)
					{
						xx[0] = xx[0] - 1;
						xx[1] = xx[1] - 1;
						yy[3] = yy[3] + 2;
						rotatedcount = 0;
					}
				}
				reposition();
			}
			else if (piecetype == 6)
			{
				if (rotatedcount == 0)
				{
					if (unitmap[xx[0] + 1][yy[0] - 1] == undefined)
					{
						xx[0] = xx[0] + 1;
						yy[0] = yy[0] - 1;
						rotatedcount++;
					}
				}
				else if (rotatedcount == 1)
				{
					if (unitmap[xx[0] - 1][yy[0] + 1] == undefined && unitmap[xx[2]][yy[2] - 2] == undefined && currentpiece._x != 0)
					{
						xx[0] = xx[0] - 1;
						yy[0] = yy[0] + 1;
						yy[2] = yy[2] - 2;
						rotatedcount++;
					}
				}
				else if (rotatedcount == 2)
				{
					if (unitmap[xx[3] - 1][yy[3] + 1] == undefined)
					{
						xx[3] = xx[3] - 1;
						yy[3] = yy[3] + 1;
						rotatedcount++;
					}
				}
				else
				{
					if (unitmap[xx[2]][yy[2] + 2] == undefined && unitmap[xx[3] + 1][yy[3] - 1] == undefined && currentpiece._x != 160)
					{
						yy[2] = yy[2] + 2;
						xx[3] = xx[3] + 1;
						yy[3] = yy[3] - 1;
						rotatedcount = 0;
					}
				}
				reposition();
			}
		}
		if (key == 39 && current4piece._x != 180 && unitmap[xx[0] - 1][yy[0]] == undefined && unitmap[xx[1] - 1][yy[1]] == undefined && unitmap[xx[2] - 1][yy[2]] == undefined && unitmap[xx[3] - 1][yy[3]] == undefined && unitmap[xx[0] + 1][yy[0]] == undefined && unitmap[xx[1] + 1][yy[1]] == undefined && unitmap[xx[2] + 1][yy[2]] == undefined && unitmap[xx[3] + 1][yy[3]] == undefined)
		{
			for (var i = 0; i < 4; i++)
			{
				xx[i]++;
			}
			reposition();
		}
		if (key == 37 && currentpiece._x != 0 && unitmap[xx[0] - 1][yy[0]] == undefined && unitmap[xx[1] - 1][yy[1]] == undefined && unitmap[xx[2] - 1][yy[2]] == undefined && unitmap[xx[3] - 1][yy[3]] == undefined && unitmap[xx[0] + 1][yy[0]] == undefined && unitmap[xx[1] + 1][yy[1]] == undefined && unitmap[xx[2] + 1][yy[2]] == undefined && unitmap[xx[3] + 1][yy[3]] == undefined)
		{
			for (var i = 0; i < 4; i++)
			{
				xx[i]--;
			}
			reposition();
		}
	}
};
Key.addListener(keyListener);
gameover = function ()
{
	popup.swapDepths(5000);
	popup.gotoAndStop(2);
	realpaused = false;
	paused = true;
};
reposition = function ()
{
	currentpiece._x = xx[0] * unitsize;
	current2piece._x = xx[1] * unitsize;
	current3piece._x = xx[2] * unitsize;
	current4piece._x = xx[3] * unitsize;
	currentpiece._y = yy[0] * unitsize;
	current2piece._y = yy[1] * unitsize;
	current3piece._y = yy[2] * unitsize;
	current4piece._y = yy[3] * unitsize;
};
startgame = function ()
{
	paused = false;
	score = 0;
	lines = 0;
	level = 1;
	popup.gotoAndStop(3);
	newpiece();
};
newpieceattach = function ()
{
	if (unitmap[3][0] != undefined || unitmap[4][0] != undefined || unitmap[5][0] != undefined || unitmap[6][0] != undefined)
	{
		gameover();
	}
	else
	{
		oldlines = 0;
		for (var i = 0; i <= unitheight; i++)
		{
			if (unitmap[0][i] != undefined && unitmap[1][i] != undefined && unitmap[2][i] != undefined && unitmap[3][i] != undefined && unitmap[4][i] != undefined && unitmap[5][i] != undefined && unitmap[6][i] != undefined && unitmap[7][i] != undefined && unitmap[8][i] != undefined && unitmap[9][i] != undefined)
			{
				for (var j = 0; j < unitwidth; j++)
				{
					removeMovieClip(unitmap[j][i]);
					for (var k = 0; k < unitheight; k++)
					{
						unitmap[j][i - k]._y += unitsize;
						unitmap[j][i - k] = unitmap[j][i - k - 1];
					}
				}
				oldlines++;
				score += level * oldlines * oldlines * 100;
				lines++;
				if (lines % 10 == 0 && levelspeed > 1)
				{
					levelspeed--;
					level++;
				}
			}
		}
		xx[0] = xx[0] + 3;
		xx[1] = xx[1] + 3;
		xx[2] = xx[2] + 3;
		xx[3] = xx[3] + 3;
		_root.attachMovie("piece", "currentpiece" + piececount, piececount * 4);
		this["currentpiece" + piececount]._x = xx[0] * unitsize;
		this["currentpiece" + piececount]._y = yy[0] * unitsize;
		this["currentpiece" + piececount]._width = unitsize;
		this["currentpiece" + piececount]._height = unitsize;
		_root.attachMovie("piece", "current2piece" + piececount, piececount * 4 + 1);
		this["current2piece" + piececount]._x = xx[1] * unitsize;
		this["current2piece" + piececount]._y = yy[1] * unitsize;
		this["current2piece" + piececount]._width = unitsize;
		this["current2piece" + piececount]._height = unitsize;
		_root.attachMovie("piece", "current3piece" + piececount, piececount * 4 + 2);
		this["current3piece" + piececount]._x = xx[2] * unitsize;
		this["current3piece" + piececount]._y = yy[2] * unitsize;
		this["current3piece" + piececount]._width = unitsize;
		this["current3piece" + piececount]._height = unitsize;
		_root.attachMovie("piece", "current4piece" + piececount, piececount * 4 + 3);
		this["current4piece" + piececount]._x = xx[3] * unitsize;
		this["current4piece" + piececount]._y = yy[3] * unitsize;
		this["current4piece" + piececount]._width = unitsize;
		this["current4piece" + piececount]._height = unitsize;
		currentpiece = _root["currentpiece" + piececount];
		currentpiece.gotoAndStop(frame);
		current2piece = _root["current2piece" + piececount];
		current2piece.gotoAndStop(frame);
		current3piece = _root["current3piece" + piececount];
		current3piece.gotoAndStop(frame);
		current4piece = _root["current4piece" + piececount];
		current4piece.gotoAndStop(frame);
		moviecliplist.push(currentpiece);
		moviecliplist.push(current2piece);
		moviecliplist.push(current3piece);
		moviecliplist.push(current4piece);
	}
};
newpiece = function ()
{
	rotatedcount = 0;
	piececount++;
	var rand = (Math.floor(Math.random() * 7));
	frame = rand + 1;
	piecetype = rand;
	if (rand == 0)
	{
		for (var i = 0; i < 4; i++)
		{
			xx[i] = i;
			yy[i] = 0;
		}
	}
	else if (rand == 1)
	{
		xx[0] = 0;
		yy[0] = 0;
		xx[1] = 1;
		yy[1] = 0;
		xx[2] = 2;
		yy[2] = 0;
		xx[3] = 2;
		yy[3] = 1;
	}
	else if (rand == 2)
	{
		xx[0] = 0;
		yy[0] = 0;
		xx[1] = 1;
		yy[1] = 0;
		xx[2] = 0;
		yy[2] = 1;
		xx[3] = 2;
		yy[3] = 0;
	}
	else if (rand == 3)
	{
		xx[0] = 0;
		yy[0] = 0;
		xx[1] = 0;
		yy[1] = 1;
		xx[2] = 1;
		yy[2] = 1;
		xx[3] = 1;
		yy[3] = 0;
	}
	else if (rand == 4)
	{
		xx[0] = 0;
		yy[0] = 1;
		xx[1] = 1;
		yy[1] = 1;
		xx[2] = 1;
		yy[2] = 0;
		xx[3] = 2;
		yy[3] = 0;
	}
	else if (rand == 5)
	{
		xx[0] = 0;
		yy[0] = 0;
		xx[1] = 1;
		yy[1] = 0;
		xx[2] = 1;
		yy[2] = 1;
		xx[3] = 2;
		yy[3] = 1;
	}
	else if (rand == 6)
	{
		xx[0] = 0;
		yy[0] = 0;
		xx[1] = 1;
		yy[1] = 0;
		xx[2] = 1;
		yy[2] = 1;
		xx[3] = 2;
		yy[3] = 0;
	}
	newpieceattach();
};
_root.onEnterFrame = function()
{
	framecount++;
	current4piece._y = (yy[3] - 1) * unitsize;
	current3piece._y = (yy[2] - 1) * unitsize;
	current2piece._y = (yy[1] - 1) * unitsize;
	currentpiece._y = (yy[0] - 1) * unitsize;
	if (Key.isDown(Key.DOWN) && !paused)
	{
		score += level;
		speed = 1;
	}
	else
	{
		speed = levelspeed;
	}
	if (framecount % speed == 0)
	{
		if (!paused)
		{
			if (unitmap[xx[0]][yy[0] + 1] == undefined && unitmap[xx[1]][yy[1] + 1] == undefined && unitmap[xx[2]][yy[2] + 1] == undefined && unitmap[xx[3]][yy[3] + 1] == undefined)
			{
				current4piece._y = yy[3] * unitsize;
				current3piece._y = yy[2] * unitsize;
				current2piece._y = yy[1] * unitsize;
				currentpiece._y = yy[0] * unitsize;
				for (var i = 0; i < 4; i++)
				{
					yy[i]++;
				}
			}
			else
			{
				unitmap[xx[0]][yy[0]] = currentpiece;
				unitmap[xx[1]][yy[1]] = current2piece;
				unitmap[xx[2]][yy[2]] = current3piece;
				unitmap[xx[3]][yy[3]] = current4piece;
				newpiece();
				framecount = 7;
			}
		}
	}
};


10. Вече сме готови!!! Можете да видите крайния резултат, като натиснете Ctrl + Enter!

Ето какво се получи при мен:

[html]
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="300" height="400" title="studio-bg.com">
<param name="movie" value="http://itschool.bg/application/uploads/tutorials/img/f/tetris/tetris.swf" />
<param name="quality" value="high" />
<embed src="http://itschool.bg/application/uploads/tutorials/img/f/tetris/tetris.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="300" height="400"></embed>
</object>[/html]

Надявам се, урокът и играта да са ви харесали!

Скриптът за играта е взаимстван от: [link]http://tutorialoutpost.com[/link], като си позволих да внеса доста промени!

Ако урокът ви допада, споделете го в Twitter и Facebook или го запазете в Delicious.




Урокът е добавен от: bubsss

Коментари

Ne0nA

Gotino No ne mi izliza Level Score i linii pls help kakvo trea da e na var za praznite poleta
opitah sas oldline old score oldlevel samo line score level am ne staa ni6to

Добави коментар

Трябва да сте регистиран потребител за може да оставяте коментари! Направете своята безплатна регистрация още сега.