Archive for December 1st, 2008

The Strategy Pattern – Changing Behavior

Monday, December 1st, 2008 | examples | Comments

The Strategy Pattern is used to change behavior. In this example, you change the behavior the weapon by swapping in and out weapons (and the projectiles they fire).

When looking through the code, focus on the weapons (Gun, MissleLauncher, and DartBlower) and the “fire()” function in “ShooterBasicView.as”. You’ll notice that ShooterBasicView only cares that the weapon is an “IFireable and then it’s just going to fire it.

The weapons are swapped in the document class, “ShooterMain” in the Keyboard handler.


source

*If you’d like to challenge yourself, try adding a fourth weapon that uses Planes as ammo.

Tags:

BitmapViewportMaterial Example

Monday, December 1st, 2008 | examples | Comments

You can easily render one scene into a usable material using BitmapViewportMaterial.


source

package
{
	import flash.events.Event;
	import flash.filters.GlowFilter;
 
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.BitmapViewportMaterial;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.BasicView;
	import org.papervision3d.view.BitmapViewport3D;
 
	[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
	public class BitmapViewportMaterialExample extends BasicView
	{
		private var viewport2:BitmapViewport3D;
		private var scene2:Scene3D;
		private var sphere:Sphere;
 
		private var plane:Plane;
 
		public function BitmapViewportMaterialExample()
		{
			viewport.containerSprite.filters = [new GlowFilter(0xcc0000, 1, 10, 10, 4)]; //adds a red outline to the plane
 
			//will be rendered inside of the plane
			viewport2 = new BitmapViewport3D();
			scene2 = new Scene3D();
			var light:PointLight3D = new PointLight3D();
			var sphereMaterial:FlatShadeMaterial = new FlatShadeMaterial(light, 0xcc0000);
			sphere = new Sphere(sphereMaterial, 400, 20, 20);
			scene2.addChild(sphere);
 
			//create a material of the above scene^^^
			var material:BitmapViewportMaterial = new BitmapViewportMaterial(viewport2, true);
			material.doubleSided = true;
 
			plane = new Plane(material);
			scene.addChild(plane);
 
			startRendering();
		}
 
		override protected function onRenderTick(event:Event = null):void
		{
			plane.localRotationY = viewport.containerSprite.mouseX;
			sphere.yaw(-1);			
 
			//render the material scene
			renderer.renderScene(scene2, camera, viewport2);
			//render the main scene
			renderer.renderScene(scene, camera, viewport);
		}
	}
}

Tags: ,

Carousel with proper rotation and reflection

Monday, December 1st, 2008 | examples | Comments

I’m going to go out on a limb and say that this post will be popular ;)


source

package
{
	import flash.display.Bitmap;
	import flash.events.Event;
	import flash.filters.BlurFilter;
 
	import org.papervision3d.core.effects.view.ReflectionView;
	import org.papervision3d.core.math.Quaternion;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Plane;
 
	[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
	public class ClickThenRotateCarousel extends ReflectionView
	{
		[Embed(source="assets/pic.jpg")]
		private var picAsset:Class;
 
		private const RADIUS:Number = 400;
		private const NUM_OF_PLANES:int = 9;
		private var carousel:DisplayObject3D = new DisplayObject3D();
 
		private var currentQuat:Quaternion = new Quaternion();		
		private var targetQuat:Quaternion = new Quaternion();
		private var slerp:Number = 0;
 
 
		public function ClickThenRotateCarousel()
		{
			viewportReflection.filters = [new BlurFilter(3,3,3)];
			viewport.interactive = true;
			surfaceHeight = -100; 
			camera.z = 800; //move camera to the front
 
			var pic:Bitmap = Bitmap(new picAsset());
 
			for(var i:int = 0; i < NUM_OF_PLANES; i++)
			{
				var material:BitmapMaterial = new BitmapMaterial(pic.bitmapData, true);
				material.doubleSided = true;
				material.interactive = true;
 
				var plane:Plane = new Plane(material, 100, 100);
				plane.rotationY = 360 / NUM_OF_PLANES * i;
				plane.moveForward(RADIUS);
 
				plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, objectOverHandler);
				plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, objectOutHandler);
				plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, objectClickHandler);
 
				carousel.addChild(plane);
			}
 
			scene.addChild(carousel);
 
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
 
		private function objectOverHandler(event:InteractiveScene3DEvent):void
		{
			viewport.buttonMode = true;
		}
 
		private function objectOutHandler(event:InteractiveScene3DEvent):void
		{
			viewport.buttonMode = false;
		}
 
		private function objectClickHandler(event:InteractiveScene3DEvent):void
		{
			var radians:Number = (carousel.rotationY - event.displayObject3D.rotationY) * Quaternion.DEGTORAD;
 
			slerp = 0;
			currentQuat = Quaternion.createFromMatrix(carousel.transform);
			targetQuat = Quaternion.createFromAxisAngle(0, 1, 0, radians);
		}
 
		private function enterFrameHandler(event:Event):void
		{
			slerp += (1 - slerp) * .05;
			var quat:Quaternion = Quaternion.slerp(currentQuat, targetQuat, slerp);
 
			carousel.transform = quat.matrix;
 
			singleRender();
		}
	}
}

Tags: , , , ,

Search

Recommended Books

Speaking at FITC Toronto

 

December 2008
M T W T F S S
« Nov   Jan »
1234567
891011121314
15161718192021
22232425262728
293031  

Preferred Video Tutorial Resolution

  • 1024x768 (53%, 85 Votes)
  • 1280x1024 (15%, 24 Votes)
  • 1920x1080 (15%, 24 Votes)
  • 800x600 (13%, 20 Votes)
  • 480x320 (4%, 6 Votes)
  • 640x480 (0%, 2 Votes)

Total Voters: 160

Loading ... Loading ...