|
|
|||||
Регистрация: Jun 2012
Сообщений: 6
|
Помогите новичку
Я новичок в ас3, нубчик.
Пишу игру пинтбол. При написании кода столкнулся с маленькой проблемой. А именно поведение объекта на сцене. Грубо говоря - мячик отбивается от правой и левой стенки по y. По х бегают 2 пада, плеера и кома, они отбивают мячик, и при пропуске им засчитывается проигрыш. Не могу не как настроить правильное отбивание. Кто может помочь? Вот сам код класса. 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); } } } За рандомное отбивание от падов checkHitLocation. Последний раз редактировалось boldusev; 05.11.2012 в 05:12. |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
при отбиваниях нужно еще и радиус мяча учитывать.
вы пояснили, что вас не устраивают отскоки, а что именно вас не устраивает не объявнили. что мяч не отбивается от нижней доски? когда мяч у вас проходит через нижнюю доску здесь вы изменяете скорость y на противоположную здесь вы еще раз изменяете ее на противоположную (когда рандом возвращает -1), тоесть она остается такой же я думаю последнюю строку нужно убрать Последний раз редактировалось Isfet; 05.11.2012 в 07:42. |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Название темы не отражает сути вопроса.
|
Часовой пояс GMT +4, время: 10:07. |
|
« Предыдущая тема | Следующая тема » |
|
|