Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.01.2011, 01:57
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 1  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Attention блоки\фигуры для игры

Делая игру дошел до точки где надо хорошо обдумать а правильно ли я начал делать ...?
вот собственно вопросы по коду:
1)задумался о соприкосновении блоков.
2)также линия сгорания.
3)центральный куб, который будет осью при rotation,можно конечно через if else, ну это куча лишнего кода...
Код AS3:
	package elements
{
    import flash.display.*;
    import flash.events.*;
	import flash.text.*;
	import flash.utils.*
 
    public class Blocks extends Sprite
    {
        ////////////////////////////////////////////////////////////////////
        // Public properties
        ////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////
        // Private properties
        ////////////////////////////////////////////////////////////////////
        private var tetrisblock1: Sprite;
        private var tetrisblock2: Sprite;
        private var tetrisblock3: Sprite;
		private var tetrisblock4: Sprite;
 
		private var n1:int;
 
		private var move:Number = 20;
 
		private var tf:TextField;
 
		private var key_left:Boolean = false;
        private var key_right:Boolean = false;
		private var key_Up:Boolean = false;
 
		private var blockButton: Sprite;
 
		private var delay:uint = 400;
        private var repeat:uint ;
        private var myTimer:Timer = new Timer(delay, repeat);
		private var statusTextField:TextField = new TextField();        
        private var inputTextField:TextField = new TextField();
 
        ////////////////////////////////////////////////////////////////////
        // Public methods
        ////////////////////////////////////////////////////////////////////
		        public function Blocks()
        {
            this.tetrisblock1 = this.makeSquare();
            this.tetrisblock2 = this.makeSquare();
            this.tetrisblock3 = this.makeSquare();
			this.tetrisblock4 = this.makeSquare();
 
			this.blockButton = new  Sprite();
            var field: TextField = new TextField();
            field.defaultTextFormat = new TextFormat('calibri', 12);
            field.text = 'ReBlock';
            field.selectable = false;
            this.blockButton.addChild(field);
 
            var trigger: Sprite = new Sprite();
            trigger.graphics.beginFill(0xff00ff, 0.3);
            trigger.graphics.drawRect( -3, -3, field.textWidth + 8, field.textHeight + 8);
            trigger.graphics.endFill();
            this.blockButton.addChild(trigger);
            this.blockButton.buttonMode = true;
            this.blockButton.x = 245;
            this.blockButton.y = 150;
            this.addChild(this.blockButton);
 
			myTimer.start();
			myTimer.addEventListener(TimerEvent.TIMER, blockDown);
            myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler);
 
			this.blockButton.addEventListener(MouseEvent.CLICK, this.this_onAddedToBlock);
 
			addEventListener(Event.ADDED_TO_STAGE, this_onAddedToBlock);
			addEventListener(Event.ENTER_FRAME, moveBlocks);
 
 
        }
 
		public function rect():void
		{
			this.tetrisblock1.x = 0
			this.tetrisblock1.y = 0
			this.tetrisblock2.x = 20
			this.tetrisblock2.y = 0
			this.tetrisblock3.x = 0
			this.tetrisblock3.y = 20
			this.tetrisblock4.x = 20
			this.tetrisblock4.y = 20
		}
		    public function line():void
		{
			this.tetrisblock1.x = 0
			this.tetrisblock1.y = 0
			this.tetrisblock2.x = 20
			this.tetrisblock2.y = 0
			this.tetrisblock3.x = 40
			this.tetrisblock3.y = 0
			this.tetrisblock4.x = 60
			this.tetrisblock4.y = 0
		}
		public function snake():void
		{
			this.tetrisblock1.x = 0
			this.tetrisblock1.y = 0
			this.tetrisblock2.x = 20
			this.tetrisblock2.y = 0
			this.tetrisblock3.x = 20
			this.tetrisblock3.y = 20
			this.tetrisblock4.x = 40
			this.tetrisblock4.y = 20
		}
		public function plus():void
		{
			this.tetrisblock1.x = 0
			this.tetrisblock1.y = 0
			this.tetrisblock2.x = 20
			this.tetrisblock2.y = 0
			this.tetrisblock3.x = 40
			this.tetrisblock3.y = 0
			this.tetrisblock4.x = 20
			this.tetrisblock4.y = 20
		}
		public function horse():void
		{
			this.tetrisblock1.x = 0
			this.tetrisblock1.y = 0
			this.tetrisblock2.x = 20
			this.tetrisblock2.y = 0
			this.tetrisblock3.x = 40
			this.tetrisblock3.y = 0
			this.tetrisblock4.x = 40
			this.tetrisblock4.y = 20	
		}
        ////////////////////////////////////////////////////////////////////
        // Private methods
        ////////////////////////////////////////////////////////////////////
        private function makeSquare() : Sprite
        {
            var spr: Sprite = new Sprite();
            spr.graphics.beginFill(0xff00ff, 0.3);
            spr.graphics.drawRect(0, 0, 20, 20);
            spr.graphics.endFill();
            this.addChild(spr);
            return spr;
 
 
        }
		private function blockDown(e:TimerEvent):void
		{
            repeat--;
            trace('таймера осталось : ' +repeat);	
		if (tetrisblock1.y < 380 &&
		tetrisblock2.y < 380 && 
		tetrisblock3.y < 380 && 
		tetrisblock4.y < 380 )	{
		tetrisblock1.y += move;
		tetrisblock2.y += move;
		tetrisblock3.y += move;
		tetrisblock4.y += move;
		trace('двигаюсь');}
 
		if ( tetrisblock4.y >= 380 && tetrisblock4.y <=400)	{
        myTimer.removeEventListener(TimerEvent.TIMER, blockDown);
		trace('застыл');}
		}
        private function completeHandler(e:TimerEvent):void {
            trace('конец!'); 
 
        }
        ////////////////////////////////////////////////////////////////////
        // Listeners
        ////////////////////////////////////////////////////////////////////
		private function this_text():void
		{
			var tf: TextField = new TextField();
			this.addChild(tf);
            var format: TextFormat = new TextFormat('Calibri', 18, 0xcccccc, true);
            tf.defaultTextFormat = format;
 
			tf.width = 200;
            tf.height = 40;
            tf.text = 'fail';
			tf.selectable = false;
 
			tf.x = 240;
			tf.y = 120
 
            tf.width = tf.textWidth + 4;
            tf.height = tf.textHeight + 4;
		}
        private function this_onAddedToBlock(e:Event) : void
        {
			removeEventListener(Event.ADDED_TO_STAGE, this_onAddedToBlock);
		    myTimer.addEventListener(TimerEvent.TIMER, blockDown);
			this.n1 = int(Math.round(Math.random() * 100));
			if (n1 >=  0 && n1 < 20) { rect();  } 
			if (n1 >= 20 && n1 < 40) { line(); }
			if (n1 >= 40 && n1 < 60) { snake(); }
			if (n1 >= 60 && n1 < 80) { plus();  }
			if (n1 >= 80 && n1 <= 100) { horse();  }				
		}
		private function key_down(e:KeyboardEvent):void
		{
	        trace('нажал'+e.keyCode);
	        if (e.keyCode == 37)
	        {
		        key_left = true;
			}
 
	        if (e.keyCode == 39)
	        {		
		        key_right = true;
			}
			if (e.keyCode == 38)
	        {		
		        key_Up = true;
			}
        }
        private function key_up(e:KeyboardEvent):void
        {
	        trace('отпустил'+e.keyCode);
			if (e.keyCode == 37)
			{
				key_left = false;;
			}
			if (e.keyCode == 39)
			{
				key_right = false;
			}
			if (e.keyCode == 38)
	        {		
		        key_Up = false;
			}
		}
		private function moveBlocks(e:Event):void
		{
				moveBlock();
				stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
				stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
		}
		private function moveBlock():void
		{
			if (tetrisblock1.x >=20 &&
			tetrisblock2.x > 10 && 
			tetrisblock3.x > 10 && 
			tetrisblock4.x > 10 ) {
					if (key_left)	  {
						tetrisblock1.x -= move;
						tetrisblock2.x -= move;
						tetrisblock3.x -= move;
						tetrisblock4.x -= move;
						trace('left'); }}
 
			if (tetrisblock1.x < 220&&
			tetrisblock2.x < 220&&
			tetrisblock3.x < 220&&
			tetrisblock4.x < 220){
					if (key_right){
						tetrisblock1.x += move;
						tetrisblock2.x += move;
						tetrisblock3.x += move;
						tetrisblock4.x += move;
						trace('right'); }}
		    if ( line || snake || plus || horse ) 
			{
				if (key_Up) { tetrisblock1.rotation += 90;
				              tetrisblock2.rotation += 90;
							  tetrisblock3.rotation += 90;
							  tetrisblock4.rotation += 90;
				}
				}
 
		}
	}
}
Исходник полностью рабочий.
Сори что все в одном классе как все доделаю сразу все распределю...
P.S.код начеркал за денек,двигаюсь в правильном направлении ?


Последний раз редактировалось GrafMine; 05.01.2011 в 18:56.
Старый 07.01.2011, 00:06
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 2  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Up нужны советы.

Старый 07.01.2011, 00:09
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 3  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
По коду сложно судить, плохо читается. Лучше расскажите на словах как делаете, а там уж подскажем.

Старый 07.01.2011, 01:46
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 4  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Проще говоря я делаю тетрис, во Flash Develop я остановился над задачей появления второго блока на сцене и их "столкновние".
Зарание спасибо.

Старый 08.01.2011, 18:26
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Я бы всё поле делал как двумерный массив. В массиве есть 2 значения: 0 и 1. 1 - есть блок, 0 - нет блока. Блок движется вниз. Например, блок состоит из 4 "элементов", при движении вниз мы проверяем, может ли каждый блок пройти вниз. Если может - сдвигаем. Если не может - значит записываем в этот двумерный массив единицами места, где блок находится и проверяем, не образовалась ли линия, заполненная единицами.

Старый 08.01.2011, 18:48
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 6  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Я бы всё поле делал как двумерный массив. В массиве есть 2 значения: 0 и 1. 1 - есть блок, 0 - нет блока. Блок движется вниз. Например, блок состоит из 4 "элементов", при движении вниз мы проверяем, может ли каждый блок пройти вниз. Если может - сдвигаем. Если не может - значит записываем в этот двумерный массив единицами места, где блок находится и проверяем, не образовалась ли линия, заполненная единицами.
+1
Думаю такие игры, как и платформеры проще делать через двумерный массив, чем отслеживать столкновения и тп.

Старый 09.01.2011, 00:59
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 7  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Я бы всё поле делал как двумерный массив. В массиве есть 2 значения: 0 и 1. 1 - есть блок, 0 - нет блока. Блок движется вниз. Например, блок состоит из 4 "элементов", при движении вниз мы проверяем, может ли каждый блок пройти вниз. Если может - сдвигаем. Если не может - значит записываем в этот двумерный массив единицами места, где блок находится и проверяем, не образовалась ли линия, заполненная единицами.
Спасибо за идею, вот я решил её попробовать :
Код AS3:
package 
{
	import flash.display.*;
	import flash.events.*;
 
	public class Main extends Sprite 
	{
		private var world:Array = [
		[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
		[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
		[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]];
		//=Фигуры
		private var figure1:Array = [
		   [1, 1, 0, 0],
		   [0, 1, 0, 0],
		   [0, 1, 0, 0],
		   [0, 0, 0, 0]];
               //=======
		private var container_world:MovieClip;
		private var container_figure:MovieClip;
 
		public function Main():void 
		{
			addEventListener(Event.ADDED_TO_STAGE,initGame);
		}
 
		private function initGame(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE,initGame);
			container_world = new MovieClip  ;
			container_figure = new MovieClip  ;
			showWorld();
			showFigures();
		}
		private function showWorld():void {
			addChild(container_world);
			for (var i:int=0; i < world.length; i++) {
				for (var j:int=0; j < world[i].length; j++) {
					var world_tail:Block=new Block;
					world_tail.x=i * 20;
					world_tail.y=j * 20;
					container_world.addChild(world_tail);
				}
			}
		}
		private function showFigures():void 
		{
			addChild(container_figure);
			for (var i:int=0; i < figure1.length; i++) {
				for (var j:int=0; j < figure1[i].length; j++) {
					var blok:BlockF=new BlockF;	
					blok.x=i * 20;
					blok.y=j * 20;
		                        container_figure.addChild(blok);
				}
			}
		}
 
	}
 
}
Сразу вопросы по коду:
1)как сделать проверку в массиве на 1 или 0 ? 0 = белый блок, 1 = черный блок...?
Немного полазил в инете и немного преобразовал под себя, вот что вышло с массивом:
Код AS3:
for (var j in figure1)
{
    for (var i in figure1[j]) 
    {
        var square:Shape = new Shape();
        var squareMC:MovieClip = new MovieClip();
        if (figure1[j][i] == 0)
        {
            square.graphics.beginFill(0x9CD55E);
            square.graphics.drawRect(0, 0, 20, 20);
            square.graphics.endFill();
 
        } else if (figure1[j][i] == 1)
        {
            square.graphics.beginFill(0x000000);
            square.graphics.drawRect(0, 0, 20, 20);
            square.graphics.endFill();
        }
        squareMC.addChild(square);
        squareMC.x =i * 20;
        squareMC.y =j * 20;
        addChild(squareMC);
    }
}
Переделать под этот исходник программу? или первый всетаки лучше?
2)как массив сдвинуть с места?


Последний раз редактировалось GrafMine; 09.01.2011 в 03:49.
Старый 13.01.2011, 00:35
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 8  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Up нужны советы.

Старый 13.01.2011, 01:01
andrew911 вне форума Посмотреть профиль Отправить личное сообщение для andrew911 Найти все сообщения от andrew911
  № 9  
Ответить с цитированием
andrew911

Регистрация: Mar 2007
Сообщений: 545
1)
Код AS3:
if(myArray[i] == 1)
{
...
}
else if(myArray[i] == 0)
{
...
}
2) Зачем сдвигать? Забиваете старое положение фигуры 0, новое 1



http://code.google.com/p/bigroom/wiki/TetrisGameEngine
http://wonderfl.net/c/3jal


Последний раз редактировалось andrew911; 13.01.2011 в 01:11.
Старый 13.01.2011, 01:46
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 10  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от andrew911 Посмотреть сообщение
1)
Код AS3:
if(myArray[i] == 1)
{...}
else if(myArray[i] == 0)
{...}
2) Зачем сдвигать? Забиваете старое положение фигуры 0, новое 1
http://code.google.com/p/bigroom/wiki/TetrisGameEngine
http://wonderfl.net/c/3jal
Огромное спасибо,за вторую ссылку буду разбираться...

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:51.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.