Toggle navigation
Sign Up
Log In
Explore
Works
Folders
Tools
Collections
Artists
Groups
Groups
Topics
Tasks
Tasks
Jobs
Teams
Jobs
Recommendation
More Effects...
ActionScript
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.text.TextField; import flash.events.Event; import flash.display.Sprite; public class FlashTest extends Sprite { //another iso experiment, now with sprite/wall sorting //sorting between walls and sprites is not good yet //(probably would work better without using the z, or if the walls werent tall) //(or by using more trickery/hacks) //(so far i just try to keep the actors away from walls) public function FlashTest() { var num:int; var i:int; mwidth = 32; mheight = 32; num = mwidth * mheight; vecGrid = new Vector.
(num, false); bd = new BitmapData(mwidth, mheight, false, 0); vecCol = Vector.
([0, 0x808080, 0x880000, 0x000088, 0x008800, 0x441288, 0x112233 ]); for (i = 0; i < 32; i++) { //mapRect(0,0,4,4,2); if (Math.random() < 0.5) { mapRect(Math.random()*mwidth,Math.random()*mheight, 1, Math.random()*16,2); } else { mapRect(Math.random()*mwidth,Math.random()*mheight,Math.random()*16,1,2); } }//nexti pic = new Bitmap(bd); pic.x = 250; pic.scaleX = 2; pic.scaleY = 2; addChild(pic); deb = new TextField(); deb.width = 320; deb.height = 240; deb.mouseEnabled = false; addChild(deb); // var a:xFrame; vecFrame = new Vector.
(maxFrame, false); num = vecFrame.length; for (i = 0; i < num; i++) { vecFrame[i] = new xFrame(); } vecAct = new Vector.
(0, false); var a:xActor; var ww:Number; var wh:Number; ww = mwidth * cw; wh = mheight * ch; for (i = 0; i < 64; i++) { a = new xActor(); a.cx = Math.random() * ww; a.cy = Math.random() * wh; a.cz = 32; //making sure to not start in wall mapRect(a.cx/cw -1,a.cy/ch-1,3,3,0); vecAct.push(a); }//nexti bd.lock(); for (i = 0; i < num; i++) { //vecGrid[i] = 1; //Math.random() * 2; bd.setPixel(i%mwidth,i/mwidth,vecCol[vecGrid[i]]); }//nexti bd.unlock(); stage.addEventListener(Event.ENTER_FRAME,onEnter); }//ctor public function mapRect(sx:int, sy:int, w:int, h:int, c:int):void { var ex:int; var ey:int; var i:int; var k:int; var yt:int; ex = sx + w; ey = sy + h; if (sy < 0) { sy = 0;} if (sy >= mheight) { return; } if (sx < 0) { sx = 0;} if (sx >= mwidth) { return;} if (ex < 0) { return; } if (ex > mwidth) { ex = mwidth;} if (ey < 0) { return; } if (ey > mheight) { ey = mheight; } for ( i = sy; i < ey; i++) { yt = i * mwidth; for (k = sx; k < ex; k++) { vecGrid[yt+k] = c; }//nextk }//nexti }//fillmap public var deb:TextField; public var bd:BitmapData; public var pic:Bitmap; public var vecCol:Vector.
; public var vecGrid:Vector.
; public var mwidth:int = 0; public var mheight:int = 0; public var cw:Number = 32; public var ch:Number = 32; public var cd:Number = 64; public var camx:Number = 0; public var camy:Number = 0; public var vecAct:Vector.
; public var vecFrame:Vector.
; public var maxFrame:int = 1024; public var it:int = 0; public function addFrame(sx:Number, sy:Number, shape:int, sortCode:int):void { if (it >= maxFrame) { return;} var a:xFrame; a = vecFrame[it]; a.sx = sx; a.sy = sy; a.shape = shape; a.sortCode = sortCode; it += 1; }//addframe public function isWall(wx:Number, wy:Number):Boolean { var tx:int; var ty:int; tx = Math.floor(wx / cw); ty = Math.floor(wy / ch); if (tx < 0) { return true; } if (ty < 0) { return true; } if (tx >= mwidth) { return true; } if (ty >= mheight) { return true; } return ( vecGrid[ty*mwidth + tx] == 2 ); }//iswall public function onEnter(e:Event):void { graphics.clear(); graphics.lineStyle(1, 0); if (pic.mouseX >= 0 && pic.mouseY >= 0 && pic.mouseX < pic.width && pic.mouseY < pic.height) { camx= pic.mouseX*cw - 128; camy = pic.mouseY*ch - 128; } //drawing tilemap it = 0; //reset frame(drawable sprite) count var offx:Number; var offy:Number; var i:int; var k:int; var num:int; var m:xActor; var sx:int; var sy:int; var ex:int; var ey:int; var yt:int; var t:int; var c:int; var rx:Number; var ry:Number; var rz:Number; var dx:Number; var dy:Number; var kw:Number; var kh:Number; var ax:Number; var ay:Number; var bx:Number; var by:Number; //screen rectangle [ax,ay]-[bx,by] ax = 0; ay = 0; bx = 465; by = 465; //ax = 100; ay = 100; bx = 300; by =300; //debug //camx += 1; kw = cw * 0.5; kh = ch * 0.5; //these should be actually dependent on tile size and calculated somehow //but i'm just guessing instead because whatever sx = Math.floor(camx / cw); sy = Math.floor(camy / ch); ex = sx + 16 + 4; ey = sy + 16 + 4; sx -= 4; sy -= 4; //deb.text = " sx " + sx + " sy " + sy + " ex " + ex + " ey " + ey; deb.text = " pmx " + pic.mouseX + " pmy " + pic.mouseY; if (sy < 0) { sy = 0;} if (sy >= mheight) { return; } if (sx < 0) { sx = 0;} if (sx >= mwidth) { return;} if (ex < 0) { return; } if (ex > mwidth) { ex = mwidth;} if (ey < 0) { return; } if (ey > mheight) { ey = mheight; } for ( i = sy; i < ey; i++) { yt = i * mwidth; for (k = sx; k < ex; k++) { t = vecGrid[yt+k]; if (t < 0) { continue; } rx = k * cw- camx; ry = i * ch- camy; rz = 0; if (t == 2) { rz = cd;} //if (t == 1) { rz = 16; } // rz = t; dx = rx - ry; dy = (rx*0.5)+(ry*0.5) - rz; dx += 200; // dy += 100; if (t == 2) { if (dx < ax-128) { continue; } if (dy < ay-128) { continue; } if (dx > bx+128) { continue; } if (dy > by+128) { continue; } // addFrame(dx, dy, 1, rx+ry+rz); //addFrame(dx, dy, 1, rx+ry+(rz/2)); //addFrame(dx, dy, 1, rx+ry+16); addFrame(dx,dy,1,(rx+kw)+(ry+kh)+(cd*0.5)); continue; }//endif if (dx+cw < ax-cw) { continue; } if (dy+ch < ay-ch) { continue; } if (dx-cw > bx+cw) { continue; } if (dy-ch > by) { continue; } c = vecCol[t]; // if (t != 2) { graphics.beginFill(c, 0.5); graphics.moveTo(dx, dy); graphics.lineTo(dx+cw,dy+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.lineTo(dx-cw, dy+kh); graphics.lineTo(dx,dy); graphics.endFill(); // continue; }//endif /* graphics.beginFill(c, 1); graphics.moveTo(dx, dy); graphics.lineTo(dx+cw,dy+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.lineTo(dx-cw, dy+kh); graphics.lineTo(dx,dy); graphics.endFill(); //wall graphics.beginFill(0x202020,1); graphics.moveTo(dx+cw,dy+kh); graphics.lineTo(dx+cw,dy+cd+kh); graphics.lineTo(dx+cw-cw,dy+cd+kh+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.endFill(); graphics.beginFill(0x404040,1); graphics.moveTo(dx-cw, dy+kh); graphics.lineTo(dx-cw, dy+cd+kh); graphics.lineTo(dx+cw-cw,dy+cd+kh+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.endFill(); */ }//nextk }//nexti //update actors num = vecAct.length; for (i = 0; i < num; i++) { m = vecAct[i]; m.vz -= 0.2; m.vx *= 0.99; m.vy *= 0.99; if (m.vz < 0 && m.cz <= 16) { m.cz = 16; m.vz *= -0.5; if (m.vz <0.4) { m.vz= 0;} } if (m.vx < 0 && isWall(m.cx - 16, m.cy)) { m.vx *= -0.5;} if (m.vx > 0 && isWall(m.cx + 16, m.cy)) { m.vx *= -0.5;} if (m.vy < 0 && isWall(m.cy, m.cy-16)) { m.vy *= -0.5;} if (m.vy > 0 && isWall(m.cy, m.cy+16)) { m.vy *= -0.5;} m.cx += m.vx; m.cy += m.vy; m.cz += m.vz; if (isWall(m.cx-15,m.cy) && !isWall(m.cx+16,m.cy)) { m.cx+=1;} else if (isWall(m.cx+15,m.cy) && !isWall(m.cx-16,m.cy)) { m.cx-=1;} if (isWall(m.cx, m.cy-15) && !isWall(m.cx,m.cy+16)) {m.cy +=1;} else if (isWall(m.cx, m.cy+15) && !isWall(m.cx,m.cy-16)) {m.cy -=1;} if (m.cz<=17) {m.w += 1 + Math.random()*3; } if (m.w >= 40) { m.w = 0; m.vx += (Math.random()-Math.random())*3; m.vy += (Math.random()-Math.random())*3; if (Math.random() <= 0.3 && m.cz <= 17 ) { m.vz = 4+ Math.random()*4; } } rx = m.cx - camx; ry = m.cy - camy; rz = m.cz; dx = rx - ry; dy = (rx*0.5)+(ry*0.5) - rz; dx += 200; //check if on screen //todo -- shadow should be tested separately if (dx < ax - 16) { continue;} if (dx > bx + 16) { continue; } if (dy < ay -16) { continue;} if (dy > by + 16) {continue;} addFrame(dx, dy, isWall(m.cx,m.cy) ? 4: 2, rx+ry+rz); //shadow rx = m.cx - camx; ry = m.cy - camy; rz = 0; dx = rx - ry; dy = (rx*0.5)+(ry*0.5) - rz; dx += 200; addFrame(dx, dy, 3, rx+ry+rz); }//nexti //graphics.drawRect(ax,ay,bx,by); radixSort(vecFrame,it); //draw frames(sprites) var a:xFrame; for (i = 0; i < it; i++) { a = vecFrame[i]; dx = a.sx; dy = a.sy; if (a.shape == 1) //wall { graphics.beginFill(0x802080, 1); graphics.moveTo(dx, dy); graphics.lineTo(dx+cw,dy+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.lineTo(dx-cw, dy+kh); graphics.lineTo(dx,dy); graphics.endFill(); graphics.beginFill(0x202020,1); graphics.moveTo(dx+cw,dy+kh); graphics.lineTo(dx+cw,dy+cd+kh); graphics.lineTo(dx+cw-cw,dy+cd+kh+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.endFill(); graphics.beginFill(0x404040,1); graphics.moveTo(dx-cw, dy+kh); graphics.lineTo(dx-cw, dy+cd+kh); graphics.lineTo(dx+cw-cw,dy+cd+kh+kh); graphics.lineTo(dx+cw-cw,dy+kh+kh); graphics.endFill(); continue; }//endif if (a.shape == 2) { graphics.beginFill(0x440000, 1); graphics.drawCircle(dx, dy, 16); graphics.endFill(); graphics.beginFill(0xFFaaaa,1); graphics.drawCircle(dx-4, dy-4, 4); graphics.endFill(); continue; }//endif if (a.shape == 3) { graphics.beginFill(0, 1); graphics.drawEllipse(dx-8,dy-4,16,8); graphics.endFill(); continue; }//endif if (a.shape == 4) { graphics.beginFill(0x004400, 1); graphics.drawCircle(dx, dy, 16); graphics.endFill(); graphics.beginFill(0xaaFFaa,1); graphics.drawCircle(dx-4, dy-4, 4); graphics.endFill(); }//endif }//nexti }//onenter //update: //radix sorting fixed public var tempVec:Vector.
= new Vector.
(4096, false); public var tempBuck:Vector.
= new Vector.
(256, false); public function radixSort(vec:Vector.
, num:int):void { var a:xFrame; var temp:Vector.
; var buck:Vector.
; var i:int; var k:uint; var shift:int; var g:int; //todo -- in the prototype it was set in the wrong way if (vec.length < num) { num = vec.length; } temp = tempVec; //todo -- resize when vec is larger than max if (temp.length < num) { return; } buck = tempBuck; shift = 0; while (shift < 32) { //reset bucket for (k = 0; k < 256; k++) { buck[k] = 0; } for (i = 0; i < num; i++) { g = (vec[i].sortCode >> shift) &0xFF; //% 256; //if (g < 0) { g = -g; } buck[g]++; } for (i = 1; i < 256; i++) { buck[i] += buck[i - 1]; } for (i = num - 1; i >= 0; i--) { g = (vec[i].sortCode >> shift) &0xFF; // % 256; //if (g < 0) { g = -g; } temp[--buck[g] ] = vec[i]; } for (i = 0; i < num; i++) { vec[i] = temp[i]; } shift += 8; }//wend }//radixsort }//classend } internal class xActor { public var cx:Number = 0; public var cy:Number = 0; public var cz:Number = 0; public var vx:Number = 0; public var vy:Number = 0; public var vz:Number = 0; public var w:int = 0; }//xactor internal class xFrame { public var sx:Number = 0; public var sy:Number = 0; public var sortCode:int = 0; public var shape:int = 0; }//frame
Join Effecthub.com
Working with Global Gaming Artists and Developers!
Login
Sign Up
Or Login with Your Email Address:
Email
Password
Remember
Or Sign Up with Your Email Address:
Your Email
This field must contain a valid email
Set Password
Password should be at least 1 character
Stay informed via email