Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 10-04-2010, 15:44   #1 (permalink)
Neuer User
 
Benutzerbild von Timyy
 
Registriert seit: Nov 2009
Beiträge: 223
Question Ball fällt durch linien(hitTestPoint)

Hallo,

Ich habe ein kleines Spiel programmiert in welchem am unteren bildschrimrand regelmäßig waagerechte linien erscheinen. Diese linien enthalten kleine Lücken in welche der ball, den man mit den pfeiltasten steuern kann, hindurchfallen kann. Die linien steigen immer nach oben.
Das Ziel ist es, dass der Ball nie ganz oben ankommt, sondern immer so weit unten wie nur möglich bleibt.

Die hitTests habe ich mithilfe der shapeFlag methode durchgeführt.
Mein Problem ist jetzt, dass sobald der ball, (nur ungenau) die obere hälfte des Spielfelds erreicht hat, er langsam durch die linien hindurchfällt. Wie in Treibsand oder ähnnlichem.
Ich habe leider keine Ahnung an was dies liegen könnte und deshalb frage ich euch, ob jemand eine Vermutung oder Lösung etc. hat.

Ich habe die fla. und swf. datei einmal angehängt.

Schonmal danke im vorraus!

fla-datei:
FallDown.zip
Angehängte Dateien
Dateityp: swf FallDown.swf (49,5 KB, 17x aufgerufen)
Timyy ist offline   Mit Zitat antworten
Alt 10-04-2010, 15:50   #2 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Kann die Datei nicht öffnen, gehe aber mal davon aus, dass du den Ball beim hitTest nicht weit genug nach oben verschiebst (nimmst du da einen festen Wert?).
Also in AS 2.0 würde ich das wohl so ungefähr machen:
PHP-Code:
while(ball.hitTest(linie))
{
ball._y -=1

Kann jetzt auch alles Käse sein, was ich geschrieben habe
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 10-04-2010, 15:56   #3 (permalink)
Neuer User
 
Benutzerbild von Timyy
 
Registriert seit: Nov 2009
Beiträge: 223
hmm, ok, da du die datei nicht öffnen kannst schreibe ich hier einfach mal den kompletten Code:

PHP-Code:
import com.greensock.*;
import com.greensock.plugins.*;
TweenPlugin.activate([TintPlugin]);

var 
speedX:Number 0;
var 
speedY:Number 0;
var 
beschleunigung:Number 0.1;
var 
schwerKraft:Number 0.01;
var 
bremsen:Number 0.03;

var 
richtungX:String "keine";

//-------------
//Tasten
//-------------

stage.addEventListener(KeyboardEvent.KEY_DOWNtasten);
stage.addEventListener(KeyboardEvent.KEY_UPtastenHoch);

//Runter:
function tasten(evt:KeyboardEvent){
    if(
evt.keyCode == Keyboard.RIGHT){
        
richtungX "rechts";
    }
    if(
evt.keyCode == Keyboard.LEFT){
        
richtungX "links";
    }
}

//Hoch
function tastenHoch(evt:KeyboardEvent){
    if(
evt.keyCode == Keyboard.RIGHT || evt.keyCode == Keyboard.LEFT){
        
richtungX "keine";
    }
}

//----------------
//ballBewegung
//----------------
var berührpunktUY:Number ball_mc.height/2;

ball_mc.addEventListener(Event.ENTER_FRAMEballBewegung);

function 
ballBewegung(evt:Event){
    
ball_mc.+= speedX;
    
ball_mc.+= speedY;
    
ball_mc.rotation += speedX;
    
    if(
richtungX == "rechts"){
        if(
speedX 4){
            
speedX += beschleunigung;
        }
    }
    if(
richtungX == "links"){
        if(
speedX > -4){
            
speedX -= beschleunigung;
        }
    }
    if(
richtungX == "keine"){
        if(
speedX 0){
            
speedX -= bremsen;
        }
        if(
speedX 0){
            
speedX += bremsen;
        }
    }
    
    
//Kollision
    
var kollisionUY:Number ball_mc.berührpunktUY;
    
    for(var 
eleStriche in striche){
        if(
striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
            
speedY = -geschwindigkeit;
        }
        if(!
striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
            
speedY += schwerKraft;
        }
        if(
ball_mc.>= stage.stageHeight ball_mc.height/&& !striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
            
ball_mc.stage.stageHeight ball_mc.height/2;
            
speedY 0;
            if(
richtungX == "rechts"ball_mc.rotation += 1;
            if(
richtungX == "links"ball_mc.rotation -= 1;
        }
    }
}

//----------------------
//Striche
//----------------------

var striche:Array = [];

var 
punkte:int 0;

var 
spawnZeit:Number 1000;
var 
geschwindigkeit 0.5;

var 
timer:Timer = new Timer(spawnZeit);

timer.addEventListener(TimerEvent.TIMERstrichTimer);
function 
strichTimer(evt:TimerEvent){
    var 
zahl:Number Math.floor(Math.random() * (1));
    if(
zahl == 1){
        var 
strich1_mc:strich1 = new strich1;
        
strich1_mc.stage.stageWidth/2;
        
strich1_mc.stage.stageHeight;
        
addChild(strich1_mc);
        
striche.push(strich1_mc);
    }
    if(
zahl == 2){
        var 
strich2_mc:strich2 = new strich2;
        
strich2_mc.stage.stageWidth/2;
        
strich2_mc.stage.stageHeight;
        
addChild(strich2_mc);
        
striche.push(strich2_mc);
    }
    if(
zahl == 3){
        var 
strich3_mc:strich3 = new strich3;
        
strich3_mc.stage.stageWidth/2;
        
strich3_mc.stage.stageHeight;
        
addChild(strich3_mc);
        
striche.push(strich3_mc);
    }
    if(
zahl == 4){
        var 
strich4_mc:strich4 = new strich4;
        
strich4_mc.stage.stageWidth/2;
        
strich4_mc.stage.stageHeight;
        
addChild(strich4_mc);
        
striche.push(strich4_mc);
    }
    if(
zahl == 5){
        var 
strich5_mc:strich5 = new strich5;
        
strich5_mc.stage.stageWidth/2;
        
strich5_mc.stage.stageHeight;
        
addChild(strich5_mc);
        
striche.push(strich5_mc);
    }
    if(
zahl == 6){
        var 
strich6_mc:strich6 = new strich6;
        
strich6_mc.stage.stageWidth/2;
        
strich6_mc.stage.stageHeight;
        
addChild(strich6_mc);
        
striche.push(strich6_mc);
    }
    if(
zahl == 7){
        var 
strich7_mc:strich7 = new strich7;
        
strich7_mc.stage.stageWidth/2;
        
strich7_mc.stage.stageHeight;
        
addChild(strich7_mc);
        
striche.push(strich7_mc);
    }
    
    
punkte++;
    
punkte_txt.text "Punkte: " punkte;
    
geschwindigkeit += 0.015;
    
trace(timer.delay);
    
timer.delay -= 6;
}

timer.start();

//Bewegung

addEventListener(Event.ENTER_FRAMEstrichBewegung);


function 
strichBewegung(evt:Event){
    for(var 
ele in striche){
        
striche[ele].-= geschwindigkeit;
        
TweenLite.to(striche[ele], 2, {tint:0x00F0FF});
    }

Ich verschiebe den Ball immer um den betrag, um den auch die linien nach oben verschoben werden nach oben.
Ich habe auch schon überlegt ob es damit zusammenhängen könnte aber da der Ball in der unteren hälfte des spielfeldes ja einwandfrei funktioniert, kann es denke ich nicht daran liegen.
Timyy ist offline   Mit Zitat antworten
Alt 10-04-2010, 16:04   #4 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Zitat:
Zitat von Timyy Beitrag anzeigen
Ich habe auch schon überlegt ob es damit zusammenhängen könnte aber da der Ball in der unteren hälfte des spielfeldes ja einwandfrei funktioniert, kann es denke ich nicht daran liegen.
Ich denke schon, da Flash ja nicht gerade für seine Genauigkeit bekannt ist... Und außerdem, nimm hier mal else if() sonst werden ggf. beide if nacheinander erfüllt:
PHP-Code:
for(var eleStriche in striche){
        if(
striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
            
speedY = -geschwindigkeit;
        }
        else if(!
striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
            
speedY += schwerKraft;
        }
        if(
ball_mc.>= stage.stageHeight ball_mc.height/&& !striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
            
ball_mc.stage.stageHeight ball_mc.height/2;
            
speedY 0;
            if(
richtungX == "rechts"ball_mc.rotation += 1;
            if(
richtungX == "links"ball_mc.rotation -= 1;
        }
    } 
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 10-04-2010, 16:17   #5 (permalink)
Neuer User
 
Benutzerbild von Timyy
 
Registriert seit: Nov 2009
Beiträge: 223
ok, dann liegt es wahrscheinlich an der genauigkeit von flash. Doch wie würdest du das Problem jetzt lösen? Wenn ich einfach den betrag erhöhe um den der ball verschoben wird, geht der ball an den funktionierenden Stellen zu schnell nach oben. Und den Betrag erst ab einer bestimmten Höhe zu erhöhen funktioniert auch nicht da dieser "Treibsandeffekt" ja immer auf unterschiedlichen Höhen auftritt.

Ich hoffe du/jemand könnt mir weiterhelfen
Timyy ist offline   Mit Zitat antworten
Alt 10-04-2010, 16:28   #6 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Kannst du mal eine CS3 Datei hochladen?
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 10-04-2010, 16:36   #7 (permalink)
Neuer User
 
Registriert seit: Aug 2008
Beiträge: 205
Ich würde nur ein enterframe-Listener registrieren.
Z.B:
PHP-Code:
addEventListener(Event.ENTER_FRAMEgameLoop); 
In der function gameloop rufst Du dann strichbewegung und deine ballbewgungs-functions auf. Könnte mir vorstellen, dass es dieses Problem evtl. beseitigt.
Flashesjetzt ist offline   Mit Zitat antworten
Alt 10-04-2010, 22:41   #8 (permalink)
Neuer User
 
Benutzerbild von Timyy
 
Registriert seit: Nov 2009
Beiträge: 223
Zitat:
Könnte mir vorstellen, dass es dieses Problem evtl. beseitigt.
Habe deinen Vorschlag einmal getesten und es klappt leider nicht. Nichts hat sich geändert und das Problem besteht weiterhin.

Zitat:
Kannst du mal eine CS3 Datei hochladen?
Wie kann ich eine CS4 datei in CS3 umwandeln?
Timyy ist offline   Mit Zitat antworten
Alt 11-04-2010, 00:08   #9 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.496
"speichern unter..." und dann cs3.fla

schieb doch das noch ein
PHP-Code:
            while(striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
                
ball_mc.y--;
                
kollisionUYball_mc.berührpunktUY;
            } 
oftmals reicht das

mfg

sx
__________________

flintfabrik.de

Geändert von shin10 (11-04-2010 um 00:09 Uhr)
shin10 ist offline   Mit Zitat antworten
Alt 11-04-2010, 12:01   #10 (permalink)
Neuer User
 
Benutzerbild von Timyy
 
Registriert seit: Nov 2009
Beiträge: 223
Danke shin10,

Deine Lösung funktioniert einwandfrei.

Falls doch noch jemand die fertige fla-datei haben möchte, kann er sie hier downloaden: Flash Dateien.zip

Nochmal Danke an alle
Timyy ist offline   Mit Zitat antworten
Alt 11-04-2010, 13:11   #11 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Zitat:
Zitat von shin10 Beitrag anzeigen
schieb doch das noch ein
PHP-Code:
            while(striche[eleStriche].hitTestPoint(ball_mc.xkollisionUYtrue)){
                
ball_mc.y--;
                
kollisionUYball_mc.berührpunktUY;
            } 
oftmals reicht das

mfg

sx
Mein Reden ... (so ungefähr)
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 11-04-2010, 17:04   #12 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.496
Zitat:
Zitat von Der Frager Beitrag anzeigen
Mein Reden ... (so ungefähr)
hoppala, deine schleife war so kompakt - hab ich glatt übersehen
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
ball, hittest, hittestpoint, shapeflag

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
hitTestObject - hitTestPoint? dr.mc.coy ActionScript 3 6 04-05-2009 09:30
hitTestPoint bei Instanzen broud ActionScript 3 6 22-04-2008 09:53
Linien durch den Bildschirm LordCash ActionScript 1 6 29-01-2003 12:59
linien durch actionscript propaganda ActionScript 1 10 06-12-2002 20:59
Linien per zufall horizontal durch den film schicken... LordCash ActionScript 1 6 06-11-2002 09:52


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele