[練習中]8月のカレンダー
[メモ]
papervision3Dの練習
すごく強引に作ってます…
もう少し勉強して、コードをすっきり、自動で毎月の数字やカレンダーを作ってくれるようにゆくゆくはしたいです~
カレンダーズームアップ後のcubeには、ブログ的なことができないかと…
とりあえず勉強不足ですが、やっていると色々勉強になりました!!
コードはすごく汚いです…
/**
* Copyright Tamanegi_kenshi ( http://wonderfl.net/user/Tamanegi_kenshi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/2D29
*/
//[メモ]
//papervision3Dの練習
//すごく強引に作ってます…
//もう少し勉強して、コードをすっきり、自動で毎月の数字やカレンダーを作ってくれるようにゆくゆくはしたいです~
//カレンダーズームアップ後のcubeには、ブログ的なことができないかと…
//とりあえず勉強不足ですが、やっていると色々勉強になりました!!
//コードはすごく汚いです…
package {
import flash.ui.ContextMenuBuiltInItems;
import flash.display.Sprite;
import flash.events.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.events.InteractiveScene3DEvent;
import caurina.transitions.Tweener;
//[SWF(backgroundColor="#000000")]
public class FlashTest extends Sprite {
private var camera:Camera3D;
private var scene:Scene3D;
private var viewport:Viewport3D;
private var renderer:BasicRenderEngine;
private var cubeArr:Array = [];
//objectのマウスイベントの判定変数
private var isRoll:Boolean = false;
private var isClick:Boolean = false;
private var test:Array = [];
private var angleX:Number = -90;
//クリックしたobjectのx.y.z
private var obX:Number = 0;
private var obY:Number = 0;
private var obZ:Number = 0;
//objectクリック時のcameraの位置
private var cameX:Number = 0;
private var cameZ:Number = 0;
//クリック時のカメラの動作(trueで正面に移動する,falseは元に戻る)?
private var isCame:Boolean = false;
//最初の形の各objectのx,y,z配列
private var firstX:Array = [];
private var firstY:Array = [];
private var firstZ:Array = [];
private var firstScale:Array = [];
private var firstAng:int = 0;
//カレンダーの形のobjectのx,y,z配列
private var calenderX:Array = [];
private var calenderY:Array = [];
private var calenderZ:Array = [];
private var calenderScale:Array = [];
public function FlashTest() {
init();
}//FlashTest
private function init():void{
//Camera3Dの設定
camera = new Camera3D();
camera.z = -500;
//Scene3Dの設定
scene = new Scene3D();
//BasicRenderEngineの設定
renderer= new BasicRenderEngine();
//Viewport3Dの設定
viewport = new Viewport3D(465, 465);
viewport.interactive = true;
viewport.buttonMode = true;
addChild(viewport);
//first配列の中身(8を作るための)
for(var l:int = 0; l < 31; l++){
if(l < 15){
var radi1:Number = (360 / 15 * l + firstAng) * Math.PI / 180;
firstX[l] = Math.cos(radi1) * 150;
firstY[l] =150 + Math.sin(radi1) * 150;
firstZ[l] = 200;
} else {
var radi2:Number = (360 / 16 * l + firstAng) * Math.PI / 180;
firstX[l] = Math.cos(radi2) * 150;
firstY[l] = -150 + Math.sin(radi2) * 150;
firstZ[l] = 200;
}
}
//複数のobjectの設定(カレンダーを作るための)
for(var i:int = 0; i < 5; i++){
for(var j:int = 0; j < 7; j++){
var material:ColorMaterial;
if(j == 0){
material = new ColorMaterial(0xcc0000);
} else{
material = new ColorMaterial(0xcccccc);
}
material.interactive = true;
material.doubleSided = true;
var materials:MaterialsList = new MaterialsList({all:material});
var cube:Cube = new Cube(materials, 50, 50, 50);
scene.addChild(cube);
cubeArr.push(cube);
var caleX:int = -210 + j * 70;
calenderX.push(caleX);
var caleY:int = 140 - i * 70;
calenderY.push(caleY);
var laseZ:int = 0;
calenderZ.push(cube.z);
calenderScale.push(1);
//objiectにイベント
// cube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
cube.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onOver);
cube.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onOut);
}}//for
for(var k:int = 0; k < cubeArr.length; k++){
cubeArr[k].x = firstX[k];
cubeArr[k].y = firstY[k];
cubeArr[k].z = firstZ[k];
if(k >= 31){
cubeArr[k].visible = false;
}
}
//ENTER_FRAME
addEventListener(Event.ENTER_FRAME, onEnter);
//sgateクリックイベント
stage.addEventListener(MouseEvent.CLICK, onStClick);
}//init
private function onStClick(event:MouseEvent):void{
addEventListener(Event.ENTER_FRAME, onFirst);
}//onStClick
private function onFirst(event:Event):void{
for(var i:int = 0; i < 31; i++){
var vx:Number = (calenderX[i] - cubeArr[i].x) / 10;
var vy:Number = (calenderY[i] - cubeArr[i].y) / 10;
var vz:Number = (0 - cubeArr[i].z) / 10;
cubeArr[i].x += vx;
cubeArr[i].y += vy;
cubeArr[i].z += vz;
//カレンダーになった時の処理
if(cubeArr[0].x < calenderX[0] + 0.1 && cubeArr[10].x < calenderX[10] + 0.1){
cubeArr[i].x = calenderX[i];
cubeArr[i].y = calenderY[i];
cubeArr[i].z = 0;
//カレンダーになる処理を終了させる
removeEventListener(Event.ENTER_FRAME, onFirst);
stage.removeEventListener(MouseEvent.CLICK, onStClick);
//objectがクリックイベントをできるようにする
cubeArr[i].addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
}//if
}//for
}//onFirst
//ロールオーバーイベント
private function onOver(event:InteractiveScene3DEvent):void{
isRoll = true;
test.push(event.target);
// if(test.length <= 10){
// test.shift();
//}
if(event.target == test[test.length - 2]){
Tweener.removeAllTweens();
}
}//onOver
//ロールアウトイベント
private function onOut(event:InteractiveScene3DEvent):void{
Tweener.addTween(event.target, {rotationZ:0, rotationY:0, rotationZ:0, time:1});
isRoll =false;
}//onOut
//クリックイベント
private function onClick(event:InteractiveScene3DEvent):void{
isRoll =false;
//viewport.interactive = false;
if(isClick == false){
isCame = true;
//クリック時のobjectの位置
obX = event.target.x;
obY = event.target.y;
obZ = event.target.z;
//移動中はマウスイベントをできないようにする
viewport.interactive = false;
viewport.buttonMode = false;
Tweener.removeAllTweens();
Tweener.addTween(event.target, {x:0, y:0, z:-350, scaleX:3, scaleY:3, scaleZ:0.5, rotationZ:0, rotationY:0, transition:"easeOutCirc", time:3, onComplete:endUp});
function endUp():void{
isClick = true;
//移動終了後クリックできるようにする
viewport.interactive = true;
viewport.buttonMode = true;
}
} else if(isClick == true){
isCame = false;
//移動中はマウスイベントをできないようにする
viewport.interactive = false;
viewport.buttonMode = false;
//Tweener.removeAllTweens();
Tweener.addTween(event.target, {x:obX, y:obY, z:obZ, scaleX:1, scaleY:1, scaleZ:1, rotationZ:0, rotationY:0, transition:"easeOutCirc", time:3, onComplete:endOut});
function endOut():void{
//移動終了後クリックできるようにする
viewport.interactive = true;
viewport.buttonMode = true;
isClick = false;
}
}
}//onClick
private function onEnter(event:Event):void{
//objectのマウスオーバー時のうごき
if(isRoll == true && isClick == false){
test[test.length - 1].rotationZ += 5;
test[test.length - 1].rotationY += 5;
}
if(isClick == false){
//カメラを原点中心に回転させる
angleX += (232 - mouseX) / 500;
camera.x = Math.cos(angleX * Math.PI / 180) * 500;
cameX = camera.x;
camera.z = Math.sin(angleX * Math.PI / 180) * 500;
cameZ = camera.z;
//objectがクリックされた時
} else if(isClick == true){
//objectがアップ時のカメラの正面へ移動する
if(isCame == true){
var cameraX:Number = (0 - camera.x) / 10;
var cameraZ:Number = (-500 - camera.z) / 10;
camera.x += cameraX;
camera.z += cameraZ;
//objectが元に戻る時、
//カメラがクリックされた時の位置に移動する
} else if(isCame == false){
var cameraXreturn:Number = (cameX - camera.x) / 10;
var cameraZreturn:Number = (cameZ - camera.z) / 10;
camera.x += cameraXreturn;
camera.z += cameraZreturn;
}
}
//カメラを原点に向ける
var x1:Number = 0 - camera.x;
var z1:Number = 0 - camera.z;
var angle:Number = Math.atan2(x1, z1);
camera.rotationY = angle * 180 / Math.PI;
//BasicRenderEngineで表示する
renderer.renderScene(scene, camera, viewport);
}//onClick
}//class
}//package