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

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

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

Регистрация: Mar 2007
Адрес: Таиланд
Сообщений: 121
Отправить сообщение для grunerasta с помощью ICQ
По умолчанию APE - привязать constraint не к центру

Имеется частица, к которой привязана конструкция из констрейнтов (типа гибкой цепочки), нужно привязать эту цепочку не к центру частицы, а к некой другой точке, отстоящей каким-то образом в стороне от центра. Внизу эта цепочка, извиняюсь если чо за грязный код, первый и последний констрейнт привязаны к двум шарам, которые передаются в конструктор как g1 и g2.

Ну и еще раз задача: сделать так, чтобы эти крайние констрейнты привязывались не к центру шаров, а например к краю, к какой-то другой точке в общем.

Спасибо.

Код:
package {
	
	import flash.events.MouseEvent;
	
	import org.cove.ape.*;
	
	public class Sharf extends Group {
		
		public var bridgeParticles:Array;
		private var bridgeConns:Array;
		
		private var downHandler:Function;
		private var upHandler:Function;
		
		public function Sharf(colB:uint, colC:uint, colD:uint, g1:Group, g2:Group,downHandlerF:Function=null,upHandlerF:Function=null) {	
			
			downHandler=downHandlerF;
			upHandler=upHandlerF;
			
			colC=colB;
			
			var globalFriction:Number=0.5;
			
			var bx:Number = g1.particles[0].px;
			var by:Number = g1.particles[0].py;
			var bsize:Number = 6;
			var yslope:Number = 0;
			var particleSize:Number = 1;
			
			bridgeParticles=new Array();
			bridgeConns=new Array();
			
			var segments:Number=8;
			var stifness:Number=1;
			var constraintCollidable:Boolean=true;

			var particle1:CircleParticle;
			var particle2:CircleParticle;
			for(var i:Number=0;i<segments;i++)
			{
				bridgeParticles[i] = new CircleParticle(bx,by,particleSize);
				bridgeParticles[i].setStyle(1, 0xFF0000, 1, colB);
				bridgeParticles[i].friction=globalFriction;
				bridgeParticles[i].mass=0.1;
				bridgeParticles[i].sprite.buttonMode=true;
				
				bx += bsize;
				by += yslope;
				
				bridgeParticles[i].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
				addParticle(bridgeParticles[i]);
				if(i==0)
				{
					particle1=g1.particles[0];
					particle2=bridgeParticles[i];					
				}else{
					particle1=bridgeParticles[i-1]
					particle2=bridgeParticles[i];					
				}
				bridgeConns[i] = new SpringConstraint(particle1, particle2, 
					stifness, constraintCollidable, particleSize*2, 1,true);
				bridgeConns[i].setStyle(1, colC, 0, colB);
				SpringConstraint(bridgeConns[i]).fixedEndLimit=1;
				addConstraint(bridgeConns[i]);
				bridgeConns[i].sprite.buttonMode=true;
				bridgeConns[i].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
			}
			bridgeConns[segments] = new SpringConstraint(bridgeParticles[segments-1], g2.particles[0], 
				stifness, constraintCollidable, particleSize*2, 1,true);
			bridgeConns[segments].setStyle(1, colC, 0, colB);
			addConstraint(bridgeConns[segments]);
			bridgeConns[segments].sprite.buttonMode=true;
			bridgeConns[segments].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);

			var bridgeConn:SpringConstraint = new SpringConstraint(g1.particles[0], g2.particles[0], 
					0.005, false, 1, 1,true);
			bridgeConn.setStyle(1, 0xFFFF00, 0, 0xFF0000);
			//addConstraint(bridgeConn);
		}
		
		public function startListeners():void
		{
			for each (var part:CircleParticle in bridgeParticles)
			{
				part.sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
			};
			for each (var constr:SpringConstraint in bridgeConns)
			{
				constr.sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
			};
		}

		public function stopListeners():void
		{
			for each (var part:CircleParticle in bridgeParticles)
			{
				part.sprite.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
			};
			for each (var constr:SpringConstraint in bridgeConns)
			{
				constr.sprite.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
			};
		}
	}
}

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

Регистрация: Mar 2007
Адрес: Таиланд
Сообщений: 121
Отправить сообщение для grunerasta с помощью ICQ
Я решил залезть в исходники и сдвинуть круг от центра, теперь правда круги друг с другом не всегда сталкиваются:

Код:
/*
Copyright (c) 2006, 2007 Alec Cove

Permission is hereby granted, free of charge, to any person obtaining a copy of this 
software and associated documentation files (the "Software"), to deal in the Software 
without restriction, including without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 
permit persons to whom the Software is furnished to do so, subject to the following 
conditions:

The above copyright notice and this permission notice shall be included in all copies 
or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

/* 
TODO:
- getProjection() needs review for any possibility of precomputing
*/

package org.cove.ape {
	
	
	
	/**	
	 * A circle shaped particle. 	 
	 */
	public class CircleParticle2 extends AbstractParticle {
	
		private var _radius:Number;
		
		
		/**
		 * @param x The initial x position of this particle.
		 * @param y The initial y position of this particle.
		 * @param radius The radius of this particle.
		 * @param fixed Determines if the particle is fixed or not. Fixed particles
		 * are not affected by forces or collisions and are good to use as surfaces.
		 * Non-fixed particles move freely in response to collision and forces.
		 * @param mass The mass of the particle.
		 * @param elasticity The elasticity of the particle. Higher values mean more elasticity or 'bounciness'.
		 * @param friction The surface friction of the particle.
		 */
		 var offsetDirection:Number=1;
		public function CircleParticle2 (
				dir:Number,
				x:Number, 
				y:Number, 
				radius:Number, 
				fixed:Boolean = false,
				mass:Number = 1, 
				elasticity:Number = 0.3,
				friction:Number = 0) {
			offsetDirection=dir;
			super(x, y, fixed, mass, elasticity, friction);
			_radius = radius;
		}

		/**
		 * The radius of the particle.
		 */
		public function get radius():Number {
			return _radius;
		}		
		
		
		/**
		 * @private
		 */
		public function set radius(r:Number):void {
			_radius = r;
		}
		
		
		/**
		 * Sets up the visual representation of this CircleParticle. This method is called 
		 * automatically when an instance of this CircleParticle's parent Group is added to 
		 * the APEngine, when  this CircleParticle's Composite is added to a Group, or the 
		 * CircleParticle is added to a Composite or Group.
		 */		
		public override function init():void {
			cleanup();
			if (displayObject != null) {
				initDisplay();
			} else {
				sprite.graphics.clear();
				sprite.graphics.lineStyle(lineThickness, lineColor, lineAlpha);
				sprite.graphics.beginFill(fillColor, fillAlpha);
				sprite.graphics.drawCircle(radius*offsetDirection, 0, radius);
				sprite.graphics.endFill();
			}
			paint();
		}
		
		
		/**
		 * The default painting method for this particle. This method is called automatically
		 * by the <code>APEngine.paint()</code> method. If you want to define your own custom painting
		 * method, then create a subclass of this class and override <code>paint()</code>.
		 */			
		public override function paint():void {
			sprite.x = curr.x;
			sprite.y = curr.y;	
		}
		
		
		/**
		 * @private
		 */
		public function getProjection(axis:Vector):Interval {
			var c:Number = samp.dot(axis);
			var cos:Number=axis.x/Math.sqrt(Math.pow(axis.x,2)+Math.pow(axis.y,2));
			interval.min = c - _radius+offsetDirection*20*cos;
			interval.max = c + _radius+offsetDirection*20*cos;
			
			return interval;
		}
		
		
		/**
		 * @private
		 */
		internal function getIntervalX():Interval {
			interval.min = samp.x - _radius+_radius*offsetDirection;
			interval.max = samp.x + _radius+_radius*offsetDirection;
			return interval;
		}
		
		
		/**
		 * @private
		 */		
		internal function getIntervalY():Interval {
			interval.min = samp.y - _radius;
			interval.max = samp.y + _radius;
			return interval;
		}
	}
}

Старый 05.12.2007, 09:12
island вне форума Посмотреть профиль Отправить личное сообщение для island Посетить домашнюю страницу island Найти все сообщения от island
  № 3  
Ответить с цитированием
island
 
Аватар для island

Регистрация: Jul 2006
Адрес: nsk
Сообщений: 93
Отправить сообщение для island с помощью ICQ
Лучше не стоит править внутренности методов движка, назначение которых не понятно - иначе все посыпется)
Если нужно прицепить цепочку не к центру объекта, сделайте последний составным (из частиц и связей) с партиклом в том месте, куда надо прицепить цепочку.

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

Регистрация: Mar 2007
Адрес: Таиланд
Сообщений: 121
Отправить сообщение для grunerasta с помощью ICQ
Ну назначение их, в общем понятны:
getProjection - Проекция на некую ось
getIntervalX, getIntervalX - проекции на вертикальные оси, надо полагать отвечают за столкновения, в моем случае есть 2 шара, к одному нужно привязать цепочку справа, к другому - слева, вот и подписал offsetDirection*20*cos, где cos - угол наклона этой оси к горизонту, а offsetDirection - передаваемый параметр в конструктор, либо +1, либо -1, в зависимости от того, справа, или слева должна быть точка, кстати ситуация как раз такая, что эта точка не тудет центром тяжести и круг относительно нее вращаться не будет. Интересный момент в том, что с другими частицами CircleParticle2 сталкивается нормально, а вот друг с другом - почему-то через раз.

Старый 05.12.2007, 17:19
island вне форума Посмотреть профиль Отправить личное сообщение для island Посетить домашнюю страницу island Найти все сообщения от island
  № 5  
Ответить с цитированием
island
 
Аватар для island

Регистрация: Jul 2006
Адрес: nsk
Сообщений: 93
Отправить сообщение для island с помощью ICQ
Это хак. Может быть он локально и решит какую-то задачу, но глобально начнут появляться неприятные сюрпризы. APE построен на алгоритме разделяющих осей и методы getProjection, getIntervalX, getIntervalY выдают проекции частицы на произвольную, горизонтальную и вертикальную оси соответственно. Если вы залезете внутрь и начнете выдавать то, что вам хочется, вместо того, что есть на самом деле - ждите беды =)
Ну это все имхо. Задайте этот вопрос в гугл-группе, может там дадут более компетентный ответ.

Старый 07.12.2007, 23:52
Freeeeeeeman вне форума Посмотреть профиль Отправить личное сообщение для Freeeeeeeman Найти все сообщения от Freeeeeeeman
  № 6  
Ответить с цитированием
Freeeeeeeman
[+4 05.12.07]
[+1 11.01.08]

Регистрация: Nov 2007
Сообщений: 51
Подскажите где взять туториалы по APE?
Cамому ничего не получается.

или по другим физ. движкам.


Последний раз редактировалось etc; 08.12.2007 в 00:40.
Старый 10.12.2007, 15:39
grunerasta вне форума Посмотреть профиль Отправить личное сообщение для grunerasta Найти все сообщения от grunerasta
  № 7  
Ответить с цитированием
grunerasta
 
Аватар для grunerasta

Регистрация: Mar 2007
Адрес: Таиланд
Сообщений: 121
Отправить сообщение для grunerasta с помощью ICQ
island, глобально релиз в пятницу =)), ждать когда авторы сподобятся сами это сделать не могу - значит будет хак
Freeeeeeeman, туториалы в разработке, учи по исходникам демки

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

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

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


 


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


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