Zurück   Flashforum > Flash > Flash Einsteiger

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-01-2012, 15:00   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
Movieclip nach Mauszeiger rotieren lassen

Hallo zusammen,
das wird wahrscheinlich ein etwas längerer Beitrag, aber hoffe trotzdem dass sich jemand kurz die Zeit nehmen könnte und sich mein Problem mal anschaut. ich versuche ein Auge (Movieclip) in AS3 je nach Position des Mauszeigers rotieren zu lassen.
habe folgenden Code (im www gefunden) in Frame 1 des zu rotierenden mc's (auge) kopiert und funktioniert einwandfrei:
ActionScript:
  1. stage.addEventListener(Event.ENTER_FRAME,rotate);
  2. function rotate (e:Event){ 
  3.     var theX:int = mouseX - auge.x;
  4.     var theY:int = (mouseY - auge.y) * -1;
  5.         var angle = Math.atan(theY/theX)/(Math.PI/180);
  6.     Math.atan(-5/10)/(Math.PI/180);
  7.     if (theX<0) {
  8.     angle += 180;}
  9.         if (theX>=0 && theY<0) {
  10.     angle += 360;
  11.         }
  12.         auge.rotation = (angle*-1) + 90 
  13. }
jetzt muss ich aber (Aufgabenstellung von unserem Prof.) alles komplett in AS3 und in verschiedene Klassen schreiben.
hier mal meine Klassen (nur mit dem dafür relevanten Code):

Main:
ActionScript:
  1. package  {
  2.    
  3.     import flash.display.MovieClip;
  4.     import flash.events.Event
  5.     import view.ViewStart;
  6.    
  7.     public class Main extends MovieClip {
  8.  
  9.         public var m_ViewStart : ViewStart;
  10.        
  11.         public function Main() {
  12.             startansicht();
  13.             }
  14.  
  15.         public function startansicht(){
  16.             m_ViewStart = new ViewStart();
  17.             m_ViewStart.viewstartansicht();
  18.             addChild(m_ViewStart);
  19.             }
  20.     }
  21. }

ViewStart:
ActionScript:
  1. package view {
  2.     import flash.display.MovieClip;
  3.     import data.DataAuge;
  4.     import controller.ControllerAuge;
  5.        
  6.     public class ViewStart extends MovieClip{
  7.  
  8.         public var d_auge : DataAuge;
  9.         public var c_auge : ControllerAuge;
  10.        
  11.         public function viewstartansicht(){
  12.  
  13.             d_auge = new DataAuge();
  14.             c_auge = new ControllerAuge();
  15.                  
  16.             d_auge.addauge();
  17.             addChild(d_auge);
  18.             c_auge.augerotate();       
  19.         }
  20.     }
  21. }

ControllerAuge:
ActionScript:
  1. package controller {
  2.    
  3.     import flash.display.MovieClip;
  4.     import flash.events.*;
  5.     import data.DataAuge;
  6.    
  7.     public class ControllerAuge extends MovieClip {
  8.  
  9.         public var d_augerotate : DataAuge;
  10.  
  11.         public function ControllerAuge() {
  12.             super();
  13.         }
  14.        
  15.         public function augerotate(){
  16.             d_augerotate = new DataAuge();     
  17.             stage.addEventListener(Event.ENTER_FRAME,d_augerotate.rotate);
  18.             addChild(d_augerotate);
  19.             }      
  20.     }
  21. }

DataAuge:
ActionScript:
  1. package data {
  2.    
  3.     import flash.events.*;
  4.     import flash.ui.Mouse;
  5.     import flash.display.MovieClip;
  6.    
  7.     public class DataAuge extends MovieClip {
  8.  
  9.         public function DataAuge() {
  10.             super();
  11.         }
  12.  
  13.         public var augerotate : MovieClip;
  14.  
  15.         public function addauge() {
  16.             augerotate = new auge();
  17.             augerotate.x = 200;
  18.             augerotate.y = 345;   
  19.             this.addChild(augerotate);
  20.             }
  21.  
  22.         public function rotate (e:Event) : void {
  23.             var theX : int = mouseX - augerotate.x;
  24.             var theY : int = (mouseY - augerotate.y) * -1
  25.             var angle = Math.atan(theY/theX)/(Math.PI/180)
  26.             Math.atan(-5/10)/(Math.PI/180)
  27.            if (theX<0) {
  28.                 angle += 180;
  29.                 }
  30.           if (theX>=0 && theY<0) {
  31.                 angle += 360;
  32.                 }
  33.           augerotate.rotation = (angle*-1) + 90;
  34.            
  35.             addChild(augerotate);         
  36.             }
  37.     }
  38.    
  39. }

bekomme jetzt immer folgende fehlermeldung und weiß nicht mehr weiter
Zitat:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at controller::ControllerAuge/augerotate()
at view::ViewStart/viewstartansicht()
at Main/startansicht()
at Main()
wäre super wenn mir jemand helfen könnte!
DANKE schon mal im voraus!

Geändert von Martin Kraft (07-01-2012 um 15:11 Uhr)
student1 ist offline   Mit Zitat antworten
Alt 07-01-2012, 15:15   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.164
Lösch mal das »stage.« in Zeile 17 von ControllerAuge!

Ansonsten solltest Du überall dort, wo Du MovieClips verwendest, besser auf Sprites zurückgreifen. MovieClips benötigt man in AS3 nämlich nur noch, wenn sie wirklich Zeitleisten Animationen enthalten.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (07-01-2012 um 15:17 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 07-01-2012, 15:24   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
Hallo Martin,
DANKE für die schnelle Antwort!
habe das "stage" gelöscht und bekomme jetzt folgenden Fehler:
Zitat:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at data:ataAuge/rotate()
werde das mit den Sprites jetzt mal versuchen. bin ziemlicher Neuling in AS und wusste gar nicht dass es die gibt aber danke für den Tipp!
sollte aber doch eigentlich so auch schon funktionieren, oder?
Viele Grüße
student1 ist offline   Mit Zitat antworten
Alt 07-01-2012, 16:26   #4 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
umständlich, in mehrerlei Hinsicht.

mal davon abgesehen, dass man diese Berechnung in AS3 auch als einzeiler formulieren kann, folgendes:
- deine Controller-Klasse ist momentan völlig überflüssig, und dient höchstens der Verwirrung
- dafür kapselt DataAuge den View und spielt selber controller.
- ViewStart ist eine Komposition aus View und Controller. später durchaus mal sinvoll, aber jetzt solltest du sie erstmal weglassen, bis der restliche Code läuft.
- ist dir eigentlich aufgefallen, dass du 2 DataAugen erzeugst? einen in ViewStart, und einen in ControllerAuge.
und da kommt jetzt dieser Fehler her:
bei dem in ControllerAuge rufst du zwar rotate() auf (Event-Listener), aber du initialisierst das Objekt nicht mit addauge().
und bei dem in ViewStart rufst du zwar addauge() auf, aber rotate() nicht.


hier mal ein Beispiel:
PHP-Code:
//mein Auge
package
{
    
import flash.display.Shape;

    class 
Auge extends Shape
    
{
        public function 
Auge() 
        {
            
graphics.lineStyle(1,0x8080FF);
            
graphics.drawCircle(0020);
            
graphics.lineStyle();
            
            
graphics.beginFill(0x8080FF);
            
graphics.drawCircle(7011);
            
            
graphics.beginFill(0x000000);
            
graphics.drawCircle(707);
            
graphics.endFill();
        }
    }

einfach irgendwas sichtbares, völlig dumm, nur Grafik.
(kann natürlich auch animiert sein, nur solltest du darauf achten, dass die Animation sich nicht mit dem Controller beisst)

PHP-Code:
//mein Controller:
package
{
    
import flash.display.DisplayObject;
    
import flash.events.Event;
        
    class 
Controller
    
{
        private var 
_target:DisplayObject;
        
        public function 
Controller(target:DisplayObject)
        {
            
_target target;
            
_target.addEventListener(Event.ENTER_FRAMEloop);
        }
        
        private function 
loop(e:Event):void 
        
{
            
_target.rotation += Math.atan2(_target.mouseY_target.mouseX) * 180 Math.PI;
            
//_target.rotation += Math.atan2(_target.mouseY, _target.mouseX) * 5;        //mit easing
        
}
    }

nur Programmlogik: kennt sein Zielobjekt, und was es damit machen soll. mehr muss er nicht wissen oder sein. Bspw. ist der Controller (hier) auch kein Anzeigeobjekt, wie bei dir.

PHP-Code:
//Aufruf (in Main):
var auge:Auge = new Auge();
    
auge.220;
    
auge.180;
addChild(auge);
var 
controller:Controller = new Controller(auge); 
also kürzer gehts nicht mehr. View erstellen, positionieren und auf die Bühne bringen, dann Controller erstellen, und mit dem View bekannt machen.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 08-01-2012, 12:38   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
hallo thomas
also dein code hat mir schon mal sehr geholfen. DANKE!!
auch wenn dein einzeiler bei der berechnung mein "auge" um den Nullpunkt der Bühne dreht und nicht um seinen eigenen Mittelpunkt. aber da kann ich ja meine Berechnung wieder verwenden.
das mit den verschiedenen klassen und verkapselungen ist durchaus beabsichtigt. ich weiß dass es alles etwas umständlich ist und würde es am liebsten auch einfacher machen. aber es handelt sich um eine semesterarbeit und das ist alles so vorgegeben (besteht ja nicht nur aus diesen 4 klassen, sondern soll demnächst ein spiel mit mehreren leveln werden).
gruß
student1 ist offline   Mit Zitat antworten
Alt 08-01-2012, 17:15   #6 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
auch wenn dein einzeiler bei der berechnung mein "auge" um den Nullpunkt der Bühne dreht und nicht um seinen eigenen Mittelpunkt. aber da kann ich ja meine Berechnung wieder verwenden.
nun der Code dreht das Auge um seinen nullpunkt, nicht um seinen Mittelpunkt.
Öffne das Symbol mal in der Bibliothek, und schau mal wo da sein Nullpunkt angezeigt wird (müsste ein kleines graues Kreuz sein).

Zitat:
das mit den verschiedenen klassen und verkapselungen ist durchaus beabsichtigt. ich weiß dass es alles etwas umständlich ist und würde es am liebsten auch einfacher machen. aber es handelt sich um eine semesterarbeit und das ist alles so vorgegeben (besteht ja nicht nur aus diesen 4 klassen, sondern soll demnächst ein spiel mit mehreren leveln werden).
dann solltest du dir genau anschauen, was genau da vorgeben ist. gerade wenn es ein Spiel wird, wird die Sache an sich schon komplex genug werden, da muss man das ganze nicht noch unnötig aufblasen.
und vor allen Dingen wollte ich dir zeigen, dass nicht alle Objekte in die Anzeigeliste gehören/müssen. Controler bspw.

noch zwei Anmerkungen zur zukünftigen Performance deines Spiels:
- ENTER_FRAME kann ein absoluter performance-killer sein. benutze den Event-listener nicht öfters als nötig. am besten du machst einen main-loop, der dann alles andere aufruft
PHP-Code:
addEventListener(Event.ENTER_FRAMEmainloop);
...
function 
mainLoop(e:Event):void
{
    
moveEyes()
    
movePlayers();
    
hitTests();
    ...

ist viel schneller, als wenn jedes Objekt seinen eigenen Listener hätte.

- du solltest versuchen die Anzahl der Objekte in der Anzeigeliste zu reduzieren, und die Verschachtelungstiefe auch möglichst flach zu halten.
in deinem Code oben hattest du 4 Objekte ineinander verschachtelt, um dieses Auge zu bewegen. das bedeutet, dass 4 Objekte gerendert werden müssen für dieses eine Auge.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bilder rotieren lassen hexakymion Flash Einsteiger 3 07-04-2009 11:03
Movieclip nach bestätigen zu ende laufen lassen Jay-alai Flash Einsteiger 10 08-02-2006 16:51
bild rotieren lassen ?! sonicwave3 Flash 4 und Flash 5 1 08-04-2004 17:15
nach Movieclip Hauptfilm automatisch weiterlaufen lassen der_maddes Flash 4 und Flash 5 2 03-11-2003 13:28


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele