PDA

Volledige versie bekijken : wiskundig hoekenprobleem met radians(atan)


black_raven
%Europe/Berlin %454 %2007, 11:54
Dit probleem gaat meer over het wiskundig oplossen er van dan de actionscript, denk ik.

ik heb dus een schietspelletje met een mannetje dat zichzelf spiegeld als het de andere kant opgaat. het geweer heeft een beperking wat de hoek betreft, dus moeten de kogels dit ook hebben. voor als het mannetje naar rechts kijkt heb ik de gradens en alles al omdat ik die van het geweer al had. maar het probleem is, die stonden in graden en bij het spiegelen geeft dit geen probleem. maar omwille van de ingewikkelde berekening om de kogels te laten vertrekken staan die nog in radians en niet in graden. en ik heb al van alles geprobeerd maar ben niet zo'n wiskundig genie om te weten hoe dat werkt.

de bedoeling is dus eigenlijk dat de hoeken die ik heb dat ze gespiegeld worden over de y-as,

hieronder is de actionscript die er voor zorgt dat de kogels tussen de hoeken blijft die ik wil.



hotspot.onMouseDown = function() {
var angle:Number = Math.atan2(_ymouse-this._y, _xmouse-this._x);
var maxangle = (30/180)* Math.PI
var minangle = (-20/180)* Math.PI


if (_root.guy1._xscale>0) {
if (angle>maxangle) {
angle = maxangle;
}
if (angle<minangle) {
angle = minangle;
}

}
mss een woordje uitleg: eerst wordt opgeslagen welke hoek de muis tegenover het geweer vormt. dan worden de max en min berekent, daaronder wordt gekeken of de xscale van de speler positief is want dan gelde de hoeken voor aan die kant.
in het else deel (wat nog moet komen) zit ik dus vast.

ik ga zelf nog hard zoeken om de hoeken te vinden, ga eens in men tekenprogramma uittekenen en hopen dat ik het zo vind,

ps. ik heb nog een andere post maar die is opgelost, moet ik daar iets speciaals mee doen?

Dauntless
%Europe/Berlin %542 %2007, 14:01
Eigenlijk moet je dus gewoon je minAngle en maxAngle verdraaien zodat ze aan de andere kant gaan liggen.

Ben niet zeker, maar denk dat dit wel zou moeten werken:

hotspot.onMouseDown = function() {
var angle:Number = Math.atan2(_ymouse-this._y, _xmouse-this._x);
var maxangle = (30/180)*Math.PI;
var minangle = (-20/180)*Math.PI;


if (_root.guy1._xscale>0) {
if (angle>maxangle) {
angle = maxangle;
}
if (angle<minangle) {
angle = minangle;
}
}
else
{
angle = (angle + Math.PI)%(2 * Math.PI)

}
};

Misschien is het handiger als je gewoon de 'angle' omzet naar graden, ipv al de rest naar radialen... Dat werkt toch iets handiger :)

Ps: Je opgeloste probleem mag je gewoon zo laten. Het enige wat je 'moet' doen, is zeggen dat het opgelost is en de helpende mensen bedanken ;)

black_raven
%Europe/Berlin %557 %2007, 14:22
ik heb dit geprobeerd maar het werkte niet, maar ik ga straks verderdoen met het probleem, ik ben al wat verder geraakt, 3 van de 4 kwadranten werkt al, nu de 4de nog,

en ja het is handiger in graden maar in een ander stuk actionscript wordt cos en sin gebruikt om de richting en snelheid van de kogel te bepalen en ik weet niet zeker of mij dat lukt om het op te zetten in graden dus probeer ik eerst zo) als ik het zelf heb dan zal ik het ook hier posten, ik had het uitgetekent in een tekenprogramma en dat hielp al heel wat,

Dauntless
%Europe/Berlin %574 %2007, 14:46
Hij is niet mooi, maar hij werkt ;)

black_raven
%Europe/Berlin %773 %2007, 19:33
mmm, dat is ongeveer wat ik zoek, maar dat heb ik zelf al voor het geweer. ik gebruik de code hieronder daar voor (ongeveer zelfde als die van u) en die werkt goed.

this.gun._rotation = gunangle+8;
gunangle = (Math.atan2(_ymouse-this.gun._y, _xmouse-this.gun._x)/Math.PI)*180;
if (gunangle>30) {
gunangle = 30;
}
if (gunangle<-20) {
gunangle = -20;
}

het probleem met de kogels is dat dit er ook nog bij hoort.

hotspot.onEnterFrame = function() {
for (i=bullet.length-1; i>=0; i--) {
bullet[i].B_name._x += Math.cos(bullet[i].B_angle)*20;
bullet[i].B_name._y += Math.sin(bullet[i].B_angle)*20;
}

en ik heb dit niet zelf gemakt maar aangepast en mijn wiskunde is al zo vervaagd dat ik niet weet hoe ik deze zou moeten aanpassen :)

Dauntless
%Europe/Berlin %813 %2007, 20:31
Stel de angle van je bullet dan gelijk aan de angle van je gun ?

Nog een voorbeeldje ;).

black_raven
%Europe/Berlin %964 %2007, 00:09
ok hartelijk dank, ik heb daaruit veel kunnen afleiden en heb zo men code in graden gekregen en ook in orde, ge gebruikt daar zo'n % 360. snap niet echt waar het voor staat want bij de uitleg van % staat iets van x gedeeld door y,

maarja het is gelukt en dat is wat telt, hier is de code wat ik heb dan ziet ge mss ook hoe ik de hoeken heb gedaan (komt op het zelfde neer)

hotspot.onMouseDown = function() {
var angle:Number = (Math.atan2(_ymouse-this._y, _xmouse-this._x)/Math.PI)*180;
if (_root.guy1._xscale>0) {
if (angle>30) {
angle = 30;
}
if (angle<-20) {
angle = -20;
}
}else {
if (angle>-160 and angle<0) {
angle = -160;
}
if (angle<150 and angle>0) {
angle = 150;
}
}

var mc = _root.attachMovie("bullet", "bullet"+bulletNum, bulletNum);
mc._x = this._x;
mc._y = this._y;
if (_root.guy1._xscale<0) {
mc._rotation = -_root.guy1.gun._rotation;
} else {
mc._rotation = _root.guy1.gun._rotation;
}
bullet.push({B_name:mc, B_angle:angle});
++bulletNum;
};
hotspot.onEnterFrame = function() {
for (i=bullet.length-1; i>=0; i--) {
bullet[i].B_name._x += Math.cos(bullet[i].B_angle/ 180 * Math.PI)*20;
bullet[i].B_name._y += Math.sin(bullet[i].B_angle/ 180 * Math.PI)*20;
}
if (bullet[i].B_name._x<0 or bullet[i].B_name._x>stageWidth or bullet[i].B_name._y<0 or bullet[i].B_name._x>stageHeight) {
bullet[i].B_name.removeMovieClip();
bullet[i].B_name._alpha = 0;
bullet.splice(i, 1);
}

nu gak proberen de kogels onder het geweer te krijgen want net zoals bij u voorbeeld komen ze er bovenop wat een beetje jammer is. maar dat zal wel lukken :) en anders zullen ze me hier snel terug zien :) daarna begint pas het serieuze werk, de tegenstanders en zo,

bedankt voor alles het was zeer hulpvol.
black_raven

Jan
%Europe/Berlin %971 %2007, 00:18
ge gebruikt daar zo'n % 360. snap niet echt waar het voor staat
% staat voor mod of modulo en geeft de restwaarde van de deling.
9%2 geeft 1 (want 9= 4*2+1)
723%360 geeft 3 (want 723=360*2 +3)
Ge kunt daar bijvoorbeeld mee checken of een getal even is of niet.
var counter:Number=0;
this.onEnterFrame=function(){
counter++;
if(counter%2==0)
{
trace("even");
}else{
trace("oneven");
}
}
//geeft als output afwisselend "even" en "oneven"

Jan