Antworten auf deine Fragen:
Neues Thema erstellen

Grundlage eines sich drehenden und schießendes Towers

JestaBlunt

Nicht mehr ganz neu hier

hi,

habs mal endlich geschafft, dass ich das movieclip in richtung maus drehe, sogar mit beschränkung von -180 bis 180 grad, also kein nach hinten schießen (falls wer da ein richtig erklärendes tutorial kennt, bitte mir sagen, würd gern verstehen, inwiefern das funkt mathematisch ;) )

jetzt fehlt mir die helfende idee, um schüsse zu programmieren...wenn ich jetzt zb jede sekunden einmal schießen könnte, speichere ich mal die mausposition...und dann? würde ja ein schuss-array erstellen aus schuss objekten, aber weiß nicht genau wie ich dann die endposition berechnen soll...zb kann ich ja direkt vor meiner kanone schießen, aber der schuss sollte bis außerhalb der stage fliegen...

also, falls wer dafür ein gut geschriebenes tut weiß...bitte posten...oder auch direkte hilfen ^^

peace, jesta blunt

edit: und wie bekomm ich die start-position des schusses? weil der oder die sollen ja vom rohr ausgehen...
 

AW: Grundlage eines sich drehenden und schießendes Towers

falls es wen interessiert:

for each ( bullet in arrBullets ) {
if( bullet.x < 600 && bullet.x > -50 && bullet.y < 450 && bullet.y > -50 ) {
bullet.x += Math.cos((bullet.rotation-90)*Math.PI/180)*9;
bullet.y += Math.sin((bullet.rotation-90)*Math.PI/180)*9;
} else {
if( bulletHolder.contains(bullet) ) {
bulletHolder.removeChild(bullet);
arrBullets.splice(arrBullets.indexOf(bullet), 1);
}
}
}

-----
geht allerdings von der mitte der kanone aus, für doppelrohrige muss man da noch was ändern, aber beschäftig mich jetzt erstmals mit grundlegenderem wie saubere programmierung und so, damit ich nicht, wie hier, die übersicht verlier nach einiger zeit...oder...weniger leicht halt ^^

edith sagt: im editier-modus is die struktur des codes ok, nachm ok drücken verschwinden leider die leerräume...
 
AW: Grundlage eines sich drehenden und schießendes Towers

Hi JestaBlunt,

Nun ja, prinzipiell ist die Berechnung einfach. Um nachher nicht zusätzlich 90 Grad addieren zu müssen, sorge dafür, daß Turm und Geschoß am Anfang nach rechts zeigen. Der Grund liegt im Einheitskreis, auf den sich die trigonometrischen Funktionen beziehen: eine Drehung nach rechts entspricht einer Drehung von 0 Grad. Wenn also die grafischen Elemente innerhalb Deiner MCs nach rechts zeigen, haben sie eine Drehung von 0 Grad. Bei allen anderen Drehungen muß der abweichende Wert zusätzlich berücksichtigt werden (ist in Deinem Skript z.B. der Fall).

Wenn der Turm mehr als ein Rohr enthält, muß zusätzlich zur Drehung des Turmes auch die Drehung der Rohre relativ zum Turm berücksichtigt werden, um die Geschosse exakt an der Mündung positionieren zu können. Das geht zum Glück ebenfalls ziemlich einfach, da sich die Rohre relativ zum Turm nie anders positionieren, die entsprechende Drehung muß also nur einmal ermittelt werden. In meinem Beispiel gehe ich davon aus, daß sich der RegPunkt im Rohr aus Gründen der Vereinfachung an der Mündung befindet.

Anbei Beispielcode (sorry, sehr unsauber, soll nur die prinzipielle Funktionsweise demonstrieren), der in die Hauptzeitleiste gehört (daraus sollte man dann in einer realen App zumindest eine Dokumentklasse machen, korrekter wäre z.B. eine Klasse Tower, in der alles drin ist und die über die DokKlasse instanziiert wird). Der mc gun enthält zwei Rohre (barrel1 und barrel2), die relativ zum RegPunkt von gun den gleichen Abstand einhalten, lediglich vertikal versetzt, so daß sie parallel angeordnet sind. Die Berechnung ihres Winkels ist hier vereinfacht angegeben (var barrelAngle). Formal korrekter wäre die Berechnung des Winkels für beide Rohre, so daß sie innerhalb des mcs gun beliebig positioniert werden können. Das würde einfach über eine zweite var geschehen, die von den entsprechenden Werten für battel ausgehen würde. Um die Geschosse korrekt einzufügen, muß lediglich zum Drehwinkel des Turmes noch der betreffende Winkel der Rohre innerhalb des Turmes addiert werden (bzw einmal barrelAngle und einmal -barrelAngle).

PHP:
var bullets:Array = [];
var bulletHolder:Sprite = new Sprite();
var rad2grad:Number = 180 / Math.PI;
var grad2rad:Number = Math.PI / 180;
var barrelAngle:Number = Math.atan2(gun.barrel1.y,gun.barrel1.x) * rad2grad;
var speed:Number = 10;
function rotate(e:Event) {
    var distX:Number = mouseX - gun.x;
    var distY:Number = mouseY - gun.y;
    var angle:Number = Math.atan2(distY,distX) * rad2grad;
    gun.rotation = angle;
}
function moving(e:Event) {
    if (bullets.length > 0) {
        var index:int = bullets.length - 1;
        for (var i:Number = index; i >= 0; i--) {
            bullets[i].x +=  bullets[i].speedX;
            bullets[i].y +=  bullets[i].speedY;
            if (bullets[i].x > stage.stageWidth || bullets[i].x < 0 || bullets[i].y > stage.stageHeight || bullets[i].y < 0) {
                var child:int = bullets[i].parent.getChildIndex(bullets[i]);
                bullets[i].parent.removeChildAt(child);
                bullets.splice(i,1);
            }
        }

    }
}
function fire(e:MouseEvent) {
    var angle:Number = gun.rotation;
    var bullet:Bullet = new Bullet();
    bullet.x = Math.cos((angle+barrelAngle) * grad2rad) * gun.barrel1.x+gun.x;
    bullet.y = Math.sin((angle+barrelAngle) * grad2rad) * gun.barrel1.x+gun.y;
    bullet.rotation = angle;
    bullet.speedX = Math.cos(angle * grad2rad) * speed;
    bullet.speedY = Math.sin(angle * grad2rad) * speed;
    bulletHolder.addChild(bullet);
    bullets.push(bullet);
    bullet = new Bullet();
    bullet.x = Math.cos((angle-barrelAngle) * grad2rad) * gun.barrel1.x+gun.x;
    bullet.y = Math.sin((angle-barrelAngle) * grad2rad) * gun.barrel1.x+gun.y;
    bullet.rotation = angle;
    bullet.speedX = Math.cos(angle * grad2rad) * speed;
    bullet.speedY = Math.sin(angle * grad2rad) * speed;
    bulletHolder.addChild(bullet);
    bullets.push(bullet);
}

addChild(bulletHolder);
stage.addEventListener(MouseEvent.MOUSE_MOVE,rotate);
stage.addEventListener(MouseEvent.CLICK,fire);
bulletHolder.addEventListener(Event.ENTER_FRAME,moving);

Nochmals: ist unsauber, müßte also optimiert werden, gibt aber hoffentlich die richtige Richtung an.

Viel Spaß
 
AW: Grundlage eines sich drehenden und schießendes Towers

hey, vielen dank, werde ich mir gleich zu gemüte führen...
und danke für die drei robotergesetze ;)

peace
jesta
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.969
Beiträge
1.540.178
Mitglieder
68.168
Neuestes Mitglied
Mart
Oben