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

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

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

Регистрация: Mar 2011
Сообщений: 6
По умолчанию Проблемы с движением

Я пытался создать бильярд и все застопорилось на одной проблеме - скорость по y (обозначена yy) постоянно равна нулю. Как я не пытался перестроить код выходила одна и та же фигня.... Опытным путем я обнаружил что проблема в классе мяча, в котором я описал торможение.

Код AS1/AS2:
package cod {
	import flash.display.MovieClip;
	import flash.events.*;
	public class ball extends MovieClip {
		public var xx:Number = 0;
		public var yy:Number = 0;
		private var a:Number = 0.1;
		private var ang:Number;
 
		public function ball() {
			addEventListener(Event.ENTER_FRAME, torm);
		}
		public function torm(event:Event):void {
			ang = Math.atan2(yy,xx);
			if(xx>a ||xx<-a) {
				xx -= Math.cos(ang)*a;
			} else {
				xx = 0;
			}
			if(yy>a||yy<-a) {
				yy -= Math.sin(ang)*a;
			} else {
				yy = 0;
			}
 
 
 
	}
 
	}
 
}
Дело в том, что в процессе выполнения кода yy приравнивается к 0, после прошествия некоторого времени мяч двигается по оси Х со скоростью ХХ. По У не движеться.

Главный код

Код AS1/AS2:
package cod {
	import flash.display.*;
	import flash.events.*;
	import flash.ui.Mouse;
 
	public class first extends MovieClip {
 
		public var ball1:ball = new ball;
		public var stol1:stol = new stol;
		public var ky1:ky = new ky;
		public var kxx:Number = 0;
		public var kyy:Number = 0;
		public var mark:Number = 0;
		public var angle:Number;
		public var force:Number = 20;
		public var t:Number = 1;
		public var t1:Number;
		public var t2:Number;
 
		public var l:Number;
		public var l2:Number;
 
		public function first() {
			addChild(stol1);
			stol1.x = 0;
			stol1.y = 0;
			addChild(ball1);
			ball1.x = 300;
			ball1.y = 300;
 
			addChild(ky1);
			ky1.x = ball1.x;
			ky1.y = ball1.y;
			ky1.visible = false;
			stage.addEventListener(Event.ENTER_FRAME, kiy);
			stage.addEventListener(MouseEvent.CLICK , cli);
			stage.addEventListener(Event.ENTER_FRAME, movee);
		}
		public function movee(event:Event):void {
			if(!(ball1.xx==0)&&(ball1.yy==0)){
 
 
			t=1;
			while(t>0){
				if(ball1.xx > 0) {
					l = 770 - ball1.x - 7;
					t1 = l/ball1.xx;
				} else if(ball1.xx < 0) {
					l = ball1.x - 37;
					t1 = -l/ball1.xx;
 
				} else if(ball1.xx == 0){
					t1 = 2;
				}
 
				if(ball1.yy > 0) {
					l2 = 400 - ball1.y - 7;
					t2 = l2/ball1.yy;
				} else if(ball1.yy < 0) {
					l2 = ball1.y - 37;
					t2 = -l2/ball1.yy;
 
				} else if(ball1.yy == 0) {
					t2 = 2;
				}
 
 
				if((t1<=t2)&&(t1<= t)) {
					t-=t1;
					ball1.x += t1*ball1.xx;
					ball1.y += t1*ball1.yy;
					ball1.xx = -ball1.xx;
				} else if ((t2<=t1)&&(t2<=t)) {
					t-=t2;
					ball1.x += t2*ball1.xx;
					ball1.y += t2*ball1.yy;
					ball1.yy = -ball1.yy;
				} else {
					ball1.x += t*ball1.xx;
					ball1.y += t*ball1.yy;
					t = 0;
				}
 
 
			}
			}		
		}
		public function kiy(event:Event):void {
			if(ball1.xx == 0 && ball1.yy == 0){
				ky1.visible = true;
 
				ky1.x = ball1.x;
				ky1.y = ball1.y;
				kxx = ball1.x - stage.mouseX;
				kyy = ball1.y - stage.mouseY;
				ky1.rotation = Math.atan2(kyy,kxx)* 360/(2*Math.PI);
				mark = 1;
				angle = Math.atan2(kyy,kxx);
			} else {
				ky1.visible = false;
 
 
				mark = 0;
 
			}
		}
		public function cli(event:MouseEvent):void {
			if(mark==1) {
			ball1.xx = -force*Math.cos(angle);
			ball1.yy = -force*Math.sin(angle);
 
			}
		}			
 
	}
}
В нем я сделал обнаружение столкновений не в кадре, а за кадром, сначала просчитываются столкновения, затем уже прорабатывается движение.*

При стирании класса мяча скрипт вобще перестает работать, хотя в ммяче заложено лишь торможение..........
Подскажите как исправить ошибку, много раз было, что флеш глючил, но щас никакие меры(копироование, переименовка) непомагают =(((

Старый 09.03.2011, 23:31
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 2  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Смотрел только 1й участок кода. В нем скорость зависит от угла. Не знаю как вы, а я не помню в реальной жизни ситуций с такой зависимостью: скорость зависит от силы удара, трения и пр. Угол (приложения силы)... Да, влияет, но он далеко не единственный, как в вашем примере.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

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

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Сообщение от PReGi0N1 Посмотреть сообщение
скорость по y (обозначена yy) постоянно равна нулю.
Дело в том, что в процессе выполнения кода yy приравнивается к 0, после прошествия некоторого времени мяч двигается по оси Х со скоростью ХХ. По У не движеться.
Так постоянно или по прошествии некоторого времени? Вообще, бейте мяч вертикально, а не горизонтально. Тогда нулем должно становиться XX. Ну а для выяснения причины ошибки посчитайте, что будет, когда xx=20 а yy=0.99, например.

Для вычисления положения мяча вообще не нужно вычислять какие-либо углы. Достаточно нормированного вектора скорости и скалярной величины скорости. При замедлении менять только скалярную величину скорости, но не вектор движения.

Старый 10.03.2011, 19:48
PReGi0N1 вне форума Посмотреть профиль Отправить личное сообщение для PReGi0N1 Найти все сообщения от PReGi0N1
  № 4  
Ответить с цитированием
PReGi0N1

Регистрация: Mar 2011
Сообщений: 6
В векторах я почти не разбираюсь, если скинете какоенибуть описание я буду весьма благодарен.
Дело происходит так - вокруг мяча крутится кий. когда нажимаем на поле мяч летит в направлении заданном кием, скорость по Х и по У определяется углом кия. Тоесть сама скорость всегда постоянна
V*V = XX*XX + YY*YY
В чем ошибка - при нажатии на поле, чем больше должен быть показатель УУ тем больше проходит времени без движения. После проишествия некоторого времени (число кадров, после которого УУ = 0) мяч начинает двигаться по оси Х.

Ну так вот суть проблемы в том что покадровая функция торможения мяча сначала полностью спускает УУ до нуля, а уже после этого начинает спускать ХХ, хотя все должно происходить одновременно. Пока УУ не будет равна нулю мяч не движеться(что абсурдно, так как функция торможения и функция движения должны быть независимы).

При стирании класса мяча скрипт вобще не выполняется ( бред тупого флеша)

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

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

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


 


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


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