Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Abi quadtree'de/grid'i/spatial dat... ja boididega. märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
yodalr
Kreisi kasutaja
yodalr

liitunud: 19.11.2003




sõnum 25.02.2008 00:53:02 Abi quadtree'de/grid'i/spatial dat... ja boididega. vasta tsitaadiga

Üritan siin ühte mängu meisterdada aga viimased paar nädalat on üks kood mu pead vaevanud, kuna mu skill lihtsamast skriptimisest kaugemale veel ei ulatu vajaks veidi abi.

Kõigepealt checkata siia: http://www.lrstudio.eu/si/

Kui boidide arv ületab 30 piiri hakkab fps kukkuma, põhjus on väga lihtne - kasv on O(n'astmes'2). Sth. iga boid kontrollib igas frame'is ennast teiste boididega - mida rohkem boide seda rohkem arvutusi*arvutusi...

Anyway kui oleks võimalik see kontrollimine taandada ainult lähimate isenditeni oleks arvutusi kõvasti vähem.

Kuna pm. ma peale AS2 muid keeli ei oska ja flashi alal ühtegi õpetust sellele ei leidu olen üritanud muudest keeltest quadtrees'i/gride jms. üle tuua... kahjuks edutult.

Siin on boidide kood:

enemies = 0;
obstacles = 12;
overAllSuff = enemies+obstacles;
var obs = [];
for (var j = obstacles+1; j<=enemies+obstacles; j++) {
   this.attachMovie("enemy", "matter"+j, this.getNextHighestDepth(), {_x:random(300), _y:random(300), maxSpeed:1.3});
   enemyAI = this["matter"+j];
   //enemyAI.speed = 0;
   //enemyAI.maxSpeed = 1;
   enemyAI.r = enemyAI._width/2;
   enemyAI.r2 = enemyAI.r*enemyAI.r;
   obs.push(enemyAI);
}
var n = 0;
var angle = 0;
function onEnterFrame() {
   for (var a = 0; a<obs.length; a++) {
      for (var b = a+1; b<obs.length; b++) {
         if (a != b) {
            var ba = obs[a];
            var bb = obs[b];
            var diff = ba.getDifference(bb);
            ajust(ba, bb, diff.distance, diff.angle);
            ajust(bb, ba, diff.distance, diff.angle += Math.PI);
         }
      }
      //what are the boids following
      var angle = obs[a].getAngle(john_faust);
      //the speen on which the enemyAI turn themselves the higher the faster they turn
      if (obs[a].maxSpeed<1.3) {
         obs[a].maxSpeed += 0.08;
      }
      else if (obs[a].maxSpeed>1.3) {
         obs[a].maxSpeed = 1.3;
      }
      obs[a].tick();
      obs[a].ajust(angle, -0.533);
   }
   function ajust(a:boid, b:boid, distance, angle) {
      if (distance<60) {
         if (distance<30) {
            //Refract
            //the distance of buddy enemyAI the nr 40 must be same as above
            a.ajust(angle, (30-distance)/10);
         } else {
            //Move together
            a.ajust(angle, -0.01);
         }
         //Ajust angle
         a.addMovement(b, -0.01);
      }
   }
}


laiendus:
class boid extends MovieClip {
   public var xspeed:Number;
   public var yspeed:Number;
   public var xs:Number;
   public var ys:Number;
   private var maxSpeed:Number;
   function boid() {
      xspeed = maxSpeed;
      yspeed = maxSpeed;
   }
   function tick() {
      if (xspeed<0) {
         var x_preSpeed = xspeed*-1;
      } else {
         var x_preSpeed = xspeed;
      }
      if (yspeed<0) {
         var y_preSpeed = yspeed*-1;
      } else {
         var y_preSpeed = yspeed;
      }
      var speed = (y_preSpeed+x_preSpeed);
      xs = xspeed/speed;
      ys = yspeed/speed;
      if (speed>maxSpeed) {
         speed = maxSpeed;
         xspeed = xs*speed;
         yspeed = ys*speed;
      }
      this._x += xspeed;
      this._y += yspeed;
      if (this._x<-333.1) {
         this._x = -333;
      }
      if (this._x>333.1) {
         this._x = 333;
      }
      if (this._y<-244.1) {
         this._y = -244;
      }
      if (this._y>276.1) {
         this._y = 276;
      }
      _rotation = (180/Math.PI)*Math.atan2(yspeed, xspeed)+90;
   }
   public function getDistance(n:boid) {
      return Math.sqrt(Math.pow(this._x-n._x, 2)+Math.pow(this._y-n._y, 2));
   }
   public function getAngle(n:boid) {
      return Math.atan2(this._y-n._y, this._x-n._x);
   }
   public function getDifference(n:boid) {
      var oX = this._x-n._x;
      var oY = this._y-n._y;
      return {distance:Math.sqrt(oX*oX+oY*oY), angle:Math.atan2(oY, oX)};
   }
   public function get nX() {
      return _x;
   }
   public function get nY() {
      return _y;
   }
   public function ajustVector(x:Number, y:Number) {
      xspeed += x;
      yspeed += y;
   }
   public function ajust(angle:Number, power:Number) {
      xspeed += Math.cos(angle)*power;
      yspeed += Math.sin(angle)*power;
   }
   public function addMovement(n:boid, power:Number) {
      xspeed += (xspeed-n.xspeed)*power;
      yspeed += (yspeed-n.yspeed)*power;
   }
}


Kui kellelgi on kogemusi on abi rohkem kui teretulnud.

_________________
kraater.ee
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Abi quadtree'de/grid'i/spatial dat... ja boididega.
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.