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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 05.11.2012, 04:54
boldusev вне форума Посмотреть профиль Отправить личное сообщение для boldusev Найти все сообщения от boldusev
  № 1  
boldusev

Регистрация: Jun 2012
Сообщений: 6
Cool Помогите новичку

Я новичок в ас3, нубчик.
Пишу игру пинтбол.
При написании кода столкнулся с маленькой проблемой. А именно поведение объекта на сцене.
Грубо говоря - мячик отбивается от правой и левой стенки по y. По х бегают 2 пада, плеера и кома, они отбивают мячик, и при пропуске им засчитывается проигрыш.
Не могу не как настроить правильное отбивание. Кто может помочь?

Вот сам код класса.
Код AS3:
package  
{
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	/**
	 * ...
	 * @author ZiK
	 */
	public class GameScreen extends gamefull_swc 
	{
 
		private var goSpeedX:int = 5; //скорость движения по Х
		private var goSpeedY:int = 5;// по У
		private var destX:int;//
		private var destY:int;//
		private var isHit:Boolean = false;// если ударяется то, мячик отбивается?
		private var easing:uint = 3;// анимация
		public var endGamper:uint = 3;
		private var isHit_bottom:Boolean;
		private var ball_ax:Number = 5;
		public var scorePlayer:uint;
		public var scoreComps:uint;
 
		public function GameScreen() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			trace("Игра создана");
			addEventListener(Event.REMOVED_FROM_STAGE, destroy);
 
			stage.addEventListener (Event.ENTER_FRAME, ballGo);// создание слушателя ентерфрейм
			uPlayer.addEventListener (Event.ENTER_FRAME, uplayerGo);// применяем листенер к юплееру для анимации
			uPad.addEventListener (Event.ENTER_FRAME, moveEnemy);
 
			uPlayer.y = 43;// выставляем координаты появления на сцене
 
			uPad.y = stage.stageHeight - uPad.height - 25;
 
			playerScore.x = 25;//
 
			playerScore.title_txt.text = "Player Score";//
			resetBallposition();
 
			compScore.x = stage.stageWidth - compScore.width - 25;//
			compScore.title_txt.text = "Comp Score";//
			setScore();	
		}
 
 
 
		///<summary>Меняет очки игроков на экране</summary>
		private function setScore():void
		{
			playerScore.com_txt.text = String(scorePlayer);
			compScore.com_txt.text = String(scoreComps);
			if (scorePlayer != 0 || scoreComps != 0)
			{
				resetBallposition();
			}
 
		}
 
		///<summary>Восстанавливать позицию мяча на экране!!!!!</summary>
		private function resetBallposition():void 
		{
			stage.removeEventListener (Event.ENTER_FRAME, ballGo);
			uball.x = stage.stageWidth  / 2;
			uball.y = stage.stageHeight  / 2;
			stage.addEventListener (MouseEvent.CLICK, resetBall);
		}
 
		private function resetBall(e:MouseEvent):void 
		{
			stage.removeEventListener (MouseEvent.CLICK, resetBall);
			stage.addEventListener (Event.ENTER_FRAME, ballGo);
			if (scoreComps == endGamper || scorePlayer == endGamper)
			{
				endGame();
			}
		}
 
		private function endGame():void 
		{
			dispatchEvent(new Event(CustomEvent.END_GAME));
		}
 
 
		///<summary>Не позволяет заходить игроку за экран, и добавляет плавную анимацию</summary>
		private function uplayerGo(e:Event):void 
		{
 
			if (uPlayer.x > stage.stageWidth - uPlayer.width)//если игрок по у выходит по всоте, то мы восоту эт отнимаем?
			{
				uPlayer.x > stage.stageWidth - uPlayer.width;//
			}
 
			uPlayer.x += (mouseX - uPlayer.x) / easing;// сама анимация
 
		}
 
		///<summary>все действия связанные с мячиком</summary>
		private function ballGo(e:Event):void 
		{
 
			trace ("Высота" +uball.x, "стейдж" + stage.stageWidth);
			// Отбивание от нижней стенки.
			if (uball.x > 798)
			{
				goSpeedX *= -1;
 
			}
			// Отбивание от правой стенки
			else if (uball.y > (stage.stageHeight - uball.height))
			{
				goSpeedY *= -1;
				scorePlayer++;
				setScore();
				//isHit = !isHit;
 
 
			}
			// отбивание от верхней
			else if (uball.x <= 0)
			{
				goSpeedX *= -1;
				scoreComps++;
				setScore();
			}
			// От левой
			else if (uball.x <= 0)
			{
				goSpeedX *= -1;
 
 
 
 
			}
			// отбивание от панели игрока
			else if (uPlayer.hitTestObject(uball))
			{
				goSpeedY *= -1;
				checkHitLocation(uPlayer);
			}
			else if (uPad.hitTestObject(uball))
			{
				goSpeedY *= -1;
				checkHitLocation(uPad);
			}
 
 
			uball.x += goSpeedX;
			uball.y += goSpeedY;
 
		}
 
		private function moveEnemy(e:Event):void
		{
			var enemyTargetX:Number;
			var enemyuPadX:Number = Math.random() * 10 - 5;
 
			enemyTargetX = uball.x - uPad.height/2 + enemyuPadX;
 
			if(enemyTargetX <= 0)
			{
				enemyTargetX = 0;
			}
			else if(enemyTargetX >= stage.stageWidth - uPad.width)
			{
				enemyTargetX = stage.stageWidth - uPad.width;
			}
 
			uPad.x += (enemyTargetX - uPad.x) / easing;
		}
		/// <summary>Изменяет угол отскока мяча от панели</summary>
		private function checkHitLocation(paddle:MovieClip):void
		{
			var hitPercent:Number; // Cоздержит степень изменения угла отскока
			var ballPosition:Number = paddle.y - uball.y; // вычисляем разницу между положением панели и мячика
			hitPercent = (ballPosition / (paddle.width - uball.width)) - .5;
			goSpeedY = hitPercent * ball_ax;	
			goSpeedY *= Math.round(Math.random() - 1);
			goSpeedX *= 1.05;
			ball_ax++;
		}
 
		private function destroy(e:Event):void 
		{
			removeEventListener(Event.REMOVED_FROM_STAGE, destroy);
			stage.removeEventListener (Event.ENTER_FRAME, ballGo);// создание слушателя ентерфрейм
			uPlayer.removeEventListener (Event.ENTER_FRAME, uplayerGo);// применяем листенер к юплееру для анимации
			uPad.removeEventListener (Event.ENTER_FRAME, moveEnemy);
		}
	}
 
}
Функция отвечающая за отбивания мяча ballGo.
За рандомное отбивание от падов checkHitLocation.

ping.swf   (17.0 Кб)
Вложения
Тип файла: swf ping.swf (17.0 Кб, 83 просмотров)


Последний раз редактировалось boldusev; 05.11.2012 в 05:12.
Старый 05.11.2012, 07:24
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 2  
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
при отбиваниях нужно еще и радиус мяча учитывать.
Код AS3:
if (uball.x > 798 - uball.width*0.5)
	{
	       goSpeedX *= -1;
 
	}
вы пояснили, что вас не устраивают отскоки, а что именно вас не устраивает не объявнили.
что мяч не отбивается от нижней доски? когда мяч у вас проходит через нижнюю доску

здесь вы изменяете скорость y на противоположную
Код AS3:
else if (uPad.hitTestObject(uball))
			{
				goSpeedY *= -1;
				checkHitLocation(uPad);
			}
здесь вы еще раз изменяете ее на противоположную (когда рандом возвращает -1), тоесть она остается такой же
Код AS3:
     goSpeedY *= Math.round(Math.random() - 1);
я думаю последнюю строку нужно убрать


Последний раз редактировалось Isfet; 05.11.2012 в 07:42.
Старый 05.11.2012, 09:36
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 3  
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Название темы не отражает сути вопроса.

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 10:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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