史上最简单的3D森林
生活随笔
收集整理的這篇文章主要介紹了
史上最简单的3D森林
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
// 一種簡單的樹類
package {
import flash.display.Sprite;
public class Tree extends Sprite {
?? public var xpos:Number = 0;
public var ypos:Number = 0;
?? public var zpos:Number = 0;
?? public function Tree() {
init();
?? }
?? public function init():void {
graphics.lineStyle(0, 0x00ff00); // 樹的顏色
graphics.lineTo(0, -140 - Math.random() * 20);?? // 樹干
graphics.moveTo(0, -30 - Math.random() * 30);
graphics.lineTo(Math.random() * 80 - 40, // 隨機生成的樹枝
-100 - Math.random() * 40);
graphics.moveTo(0, -60 - Math.random() * 40);
graphics.lineTo(Math.random() * 60 - 30,
-110 - Math.random() * 20);
?? }
}
}
------------------------------------------------------------------------------
// 利用簡單樹組成的森林
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
[SWF(backgroundColor=0x000000)];?? // 設置背景為黑色,但不知為什么無效
public class Trees extends Sprite {
??? private var trees:Array; // 存放所有的樹
??? private var numTrees:uint = 100;??? // 定義100顆夠了
??? private var fl:Number = 250; // 屏幕距離眼睛一般設置為200--300
??? private var vpX:Number = stage.stageWidth / 2; // 物體太小后消失點
??? private var vpY:Number = stage.stageHeight / 2;
??? private var floor:Number = 50; // 水平面高度
??? private var vz:Number = 0; // Z軸透視深度速度
??? private var friction:Number = 0.98; // 阻尼系數(shù)
??? public function Trees() {
?? init();
??? }
??? private function init():void {
?? trees = new Array();
?? for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = new Tree(); // 生成樹
trees.push(tree);
tree.xpos = Math.random() * 2000 - 1000;
tree.ypos = floor;
tree.zpos = Math.random() * 10000;
addChild(tree); //
?? }
?? addEventListener(Event.ENTER_FRAME, onEnterFrame);
?? stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
??? }
??? private function onEnterFrame(event:Event):void {
?? for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = trees;
move(tree);
?? }
?? vz *= friction; // 阻尼后的Z軸方向的速度
?? sortZ(); // Z軸消隱
??? }
??? private function onKeyDown(event:KeyboardEvent):void {?? // 加減速控制
?? if (event.keyCode == Keyboard.UP) {
vz -= 1;
?? } else if (event.keyCode == Keyboard.DOWN) {
vz += 1;
?? }
??? }
??? private function move(tree:Tree):void {
?? tree.zpos += vz; // 更新移動距離(速度)
?? if (tree.zpos < -fl) { // 如果樹走到眼睛后面,則移動到遠處
tree.zpos += 10000;
?? }
?? if (tree.zpos > 10000 - fl) {?? // 如果樹太遠,大于屏幕外1000則移回
tree.zpos -= 10000;
?? }
?? var scale:Number = fl / (fl + tree.zpos);?? // 計算透視深度系數(shù)
?? tree.scaleX = tree.scaleY = scale;
?? tree.x = vpX + tree.xpos * scale;
?? tree.y = vpY + tree.ypos * scale;
?? tree.alpha =?? scale * .7 + .3; // 不同距離用不同的alpha混色,顯示大氣透視(朦朧感)
??? }
??? private function sortZ():void {
?? trees.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
?? for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = trees;
setChildIndex(tree, i);
?? }
??? }
}
}
package {
import flash.display.Sprite;
public class Tree extends Sprite {
?? public var xpos:Number = 0;
public var ypos:Number = 0;
?? public var zpos:Number = 0;
?? public function Tree() {
init();
?? }
?? public function init():void {
graphics.lineStyle(0, 0x00ff00); // 樹的顏色
graphics.lineTo(0, -140 - Math.random() * 20);?? // 樹干
graphics.moveTo(0, -30 - Math.random() * 30);
graphics.lineTo(Math.random() * 80 - 40, // 隨機生成的樹枝
-100 - Math.random() * 40);
graphics.moveTo(0, -60 - Math.random() * 40);
graphics.lineTo(Math.random() * 60 - 30,
-110 - Math.random() * 20);
?? }
}
}
------------------------------------------------------------------------------
// 利用簡單樹組成的森林
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
[SWF(backgroundColor=0x000000)];?? // 設置背景為黑色,但不知為什么無效
public class Trees extends Sprite {
??? private var trees:Array; // 存放所有的樹
??? private var numTrees:uint = 100;??? // 定義100顆夠了
??? private var fl:Number = 250; // 屏幕距離眼睛一般設置為200--300
??? private var vpX:Number = stage.stageWidth / 2; // 物體太小后消失點
??? private var vpY:Number = stage.stageHeight / 2;
??? private var floor:Number = 50; // 水平面高度
??? private var vz:Number = 0; // Z軸透視深度速度
??? private var friction:Number = 0.98; // 阻尼系數(shù)
??? public function Trees() {
?? init();
??? }
??? private function init():void {
?? trees = new Array();
?? for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = new Tree(); // 生成樹
trees.push(tree);
tree.xpos = Math.random() * 2000 - 1000;
tree.ypos = floor;
tree.zpos = Math.random() * 10000;
addChild(tree); //
?? }
?? addEventListener(Event.ENTER_FRAME, onEnterFrame);
?? stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
??? }
??? private function onEnterFrame(event:Event):void {
?? for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = trees;
move(tree);
?? }
?? vz *= friction; // 阻尼后的Z軸方向的速度
?? sortZ(); // Z軸消隱
??? }
??? private function onKeyDown(event:KeyboardEvent):void {?? // 加減速控制
?? if (event.keyCode == Keyboard.UP) {
vz -= 1;
?? } else if (event.keyCode == Keyboard.DOWN) {
vz += 1;
?? }
??? }
??? private function move(tree:Tree):void {
?? tree.zpos += vz; // 更新移動距離(速度)
?? if (tree.zpos < -fl) { // 如果樹走到眼睛后面,則移動到遠處
tree.zpos += 10000;
?? }
?? if (tree.zpos > 10000 - fl) {?? // 如果樹太遠,大于屏幕外1000則移回
tree.zpos -= 10000;
?? }
?? var scale:Number = fl / (fl + tree.zpos);?? // 計算透視深度系數(shù)
?? tree.scaleX = tree.scaleY = scale;
?? tree.x = vpX + tree.xpos * scale;
?? tree.y = vpY + tree.ypos * scale;
?? tree.alpha =?? scale * .7 + .3; // 不同距離用不同的alpha混色,顯示大氣透視(朦朧感)
??? }
??? private function sortZ():void {
?? trees.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
?? for (var i:uint = 0; i < numTrees; i++) {
var tree:Tree = trees;
setChildIndex(tree, i);
?? }
??? }
}
}
總結
以上是生活随笔為你收集整理的史上最简单的3D森林的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC文档地址
- 下一篇: 归纳一下:C#线程同步的几种方法