praegune kellaaeg 16.06.2024 01:21:51
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
yodalr
Kreisi kasutaja
liitunud: 19.11.2003
|
25.02.2008 00:53:02
Abi quadtree'de/grid'i/spatial dat... ja boididega. |
|
|
Ü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 |
|
|
|
lisa lemmikuks |
|
|
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.
|