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

Вернуться   Форум Flasher.ru > Блоги > Lecosson

Оценить эту запись

генератор ландшафта

Запись от Lecosson размещена 21.12.2013 в 17:51
Обновил(-а) Котяра 23.12.2013 в 19:26

Визуализируем карту высот. Просьба к гуру не плеваться. Просто побочный эффект другой работы, может кто-нибудь заставит Бискупа нервно курить - вот и пригодится.
Генератор ландшафтов
tergen.swf   (2.0 Кб)

Код:
Код AS3:
package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.ColorTransform;
	import flash.geom.Rectangle;
 
	[SWF(width=500,height=300,backgroundColor=0xF1F1F1,frameRate=25)]
	public class pragma extends Sprite
	{
		private const SIZEX:Number = 60;
		private const SIZEY:Number = SIZEX;
		private const CELLSIZE:Number = 4;
		private const MAXHEIGHT:Number = 200;
		private const HEIGHTSTEP:Number = CELLSIZE;
		private const RELIEFSMOOTH:Number = 20;
		private const WATERLEVEL:Number = 40;
		private const STEPS:int = 5;
		private var RELIEFNOISEFACTOR:Number = 0;
		private var seed:int = 777;
 
		public function pragma() {
			stage?onAddedToStage():addEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
		}
 
		private function onAddedToStage(event:Event=null):void {
			removeEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			addEventListener(Event.ENTER_FRAME,iterate);
		}
 
		private function iterate(fakedata:*=null):void {
			rebuild();
			RELIEFNOISEFACTOR+=1/STEPS;
			if (RELIEFNOISEFACTOR>=1) {
				seed++;
				RELIEFNOISEFACTOR=0;
			}
		}
 
		private var bd:BitmapData = new BitmapData(SIZEX, SIZEY);;
		private var bd2:BitmapData = new BitmapData(SIZEX, SIZEY);;
		private var bmp:Bitmap = new Bitmap(bd);
		private var pic:Bitmap=new Bitmap(new BitmapData(stage.stageWidth,stage.stageHeight,true)); 
		private function rebuild(fakedata:*=null):void {
			bd.perlinNoise(RELIEFSMOOTH, RELIEFSMOOTH, 3, seed, true, true, 7, true, null);
			bd.colorTransform(new Rectangle(0,0,SIZEX,SIZEY),new ColorTransform(1-RELIEFNOISEFACTOR,1-RELIEFNOISEFACTOR,1-RELIEFNOISEFACTOR));
			bd2.perlinNoise(RELIEFSMOOTH, RELIEFSMOOTH, 3, seed+1, true, true, 7, true, null);
			bd2.colorTransform(new Rectangle(0,0,SIZEX,SIZEY),new ColorTransform(RELIEFNOISEFACTOR,RELIEFNOISEFACTOR,RELIEFNOISEFACTOR));
			bd.draw(bd2,null,null,BlendMode.ADD);
			bmp.bitmapData=bd;
 
			var basex:Number = stage.stageWidth/2;
			var basey:Number = stage.stageHeight/2-CELLSIZE*SIZEY/2+stage.stageHeight/8;
			var g:Graphics = this.graphics;
 
			var cl:uint;
			var cr:uint;
			var ct:uint;
			var cm:uint;
			var clr:uint;
 
			while (this.numChildren>0) removeChildAt(this.numChildren-1);
 
			pic.bitmapData.fillRect(pic.bitmapData.rect,0x00000000);
			pic.bitmapData.lock();
 
			for (var k:uint=0; k<SIZEX; k++) {
				for (var l:uint=0; l<SIZEY; l++) {
					clr=bd.getPixel(k,l);
					var h:uint=clr&0xFF;
					var hg:Number=h/256;
					var xf:Number=2*(SIZEX-Math.abs(k-SIZEX/2))/SIZEX-1;
					var yf:Number=2*(SIZEY-Math.abs(l-SIZEY/2))/SIZEY-1;
					hg=hg*Math.sqrt(xf*yf);
					hg*=MAXHEIGHT;
					hg=hg-hg%HEIGHTSTEP;
 
					var nx:Number=basex+CELLSIZE*k-CELLSIZE*l;
					var ny:Number=basey+(CELLSIZE*k+CELLSIZE*l)/2;
					cl=(h)*0x010101;
					cr=(h-10)*0x010101;
					ct=(h+10)*0x010101;
					cm=(h-30)*0x010101;
					//left
					g.beginFill(cl,1);
					g.moveTo(nx-CELLSIZE,ny);
					g.lineTo(nx,ny+CELLSIZE/2);
					g.lineTo(nx,ny-hg+CELLSIZE/2);
					g.lineTo(nx-CELLSIZE,ny-hg);
					g.lineTo(nx-CELLSIZE,ny);
					g.endFill();
					//right
					g.beginFill(cr,1);
					g.moveTo(nx+CELLSIZE,ny);
					g.lineTo(nx,ny+CELLSIZE/2);
					g.lineTo(nx,ny-hg+CELLSIZE/2);
					g.lineTo(nx+CELLSIZE,ny-hg);
					g.lineTo(nx+CELLSIZE,ny);
					g.endFill();
					//top
					g.beginFill(ct,1);
					g.moveTo(nx-CELLSIZE,ny-hg);
					g.lineTo(nx,ny-hg+CELLSIZE/2);
					g.lineTo(nx+CELLSIZE,ny-hg);
					g.lineTo(nx,ny-hg-CELLSIZE/2);
					g.lineTo(nx-CELLSIZE,ny-hg);
					g.endFill();
					//water
					var depth:Number=(WATERLEVEL-hg)/WATERLEVEL;
					if (depth>0) {
						g.lineStyle(0,0,0);
						var wcolor:int=0x0000ff+0x100*int(0xB0*(1-depth));
						g.beginFill(wcolor,depth+0.3);
						g.moveTo(nx-CELLSIZE,ny-WATERLEVEL);
						g.lineTo(nx,ny-WATERLEVEL+CELLSIZE/2);
						g.lineTo(nx+CELLSIZE,ny-WATERLEVEL);
						g.lineTo(nx,ny-WATERLEVEL-CELLSIZE/2);
						g.lineTo(nx-CELLSIZE,ny-WATERLEVEL);
						g.endFill();
					}
					//grid
					g.lineStyle(1,cm,0.5,true);
					if (k==SIZEX-1 || l==SIZEY-1) for (var n:Number=hg; n>0; n=n-1-(n-1)%8) {
						g.moveTo(nx-CELLSIZE,ny-n);
						g.lineTo(nx,ny-n+CELLSIZE/2);
						g.lineTo(nx+CELLSIZE,ny-n);
					}
					var rect:Rectangle=new Rectangle(nx-CELLSIZE,ny-Math.max(hg,WATERLEVEL)-CELLSIZE/2,CELLSIZE*2,Math.max(hg,WATERLEVEL)+CELLSIZE);
					pic.bitmapData.draw(this,null,null,null,rect);
					g.clear();
				}
			}
 
			pic.bitmapData.unlock();
			addChild(pic);
			bmp.width=100;
			bmp.height=100;
			bmp.rotation=45;
			var hld:Sprite=new Sprite();
			addChild(hld);
			hld.addChild(bmp);
			hld.scaleY=0.5;
			hld.x=60;
			hld.y=40;
		}
	}
}
Вложения
Тип файла: rar tergen.rar (3.6 Кб, 115 просмотров)
Тип файла: rar тест жидкости.rar (40.5 Кб, 110 просмотров)
Тип файла: swf tergen.swf (2.0 Кб, 621 просмотров)
Всего комментариев 6

Комментарии

Старый 23.12.2013 17:51 samana вне форума
samana
 
Аватар для samana
Интересно! Но очень тормозит.
Старый 23.12.2013 19:09 Lecosson вне форума
Lecosson
Апдейт. На данный момент еще добавлены текущая вода (в том числе давление - если оно высокое, будет подниматься из шахты и растекаться по поверхности) и падение блоков. Просчет физики на ландшафтах в 100000 блоков занимает 1-2 сотых секунды. Тормозит рендеринг - пока не избавлюсь от ошибок расчетов, нет смысла тратить время на отрисовку.
Старый 23.12.2013 19:10 Котяра вне форума
Котяра
 
Аватар для Котяра
Отредактируйте пост. Вставьте swf в тело поста и код в тег AS3.
Старый 23.12.2013 20:19 alatar вне форума
alatar
 
Аватар для alatar
Старый 23.12.2013 23:17 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Цитата:
stage?onAddedToStage():addEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
*Достает автомат и целится в голову... бум!*
Старый 24.12.2013 01:19 Lecosson вне форума
Lecosson
Alatar, спасибо за ссылку, очень познавательно.
 
Последние записи от Lecosson

 


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


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