Avatar billede Slettet bruger
13. april 2007 - 16:03 Der er 14 kommentarer og
1 løsning

Hvor mange knapper kan registreres ad gangen?

Hej eksperter!

Jeg er ved at lave et lille spil i Flash, hvor man styrer et fly rundt i rummet.
Man navigerer med piletasterne og skyder på Z. Der er bare et problem: Hvis spilleren holder Z samt eksempeltvis PIL OP og PIL HØJRE nede og så slipper PIL HØJRE og trykker på PIL VENSTRE fortsætter flyet ligeud.
Hvorfor registrerer Flash Player ikke dette input?
Avatar billede alexander_j Nybegynder
13. april 2007 - 16:38 #1
Fordi din kode er opsat forkert!
Avatar billede Slettet bruger
13. april 2007 - 19:01 #2
Godt svar!
Avatar billede Slettet bruger
13. april 2007 - 19:04 #3
Når nu du er så klar i din udtalelse, vil du så ikke selv have æren af at se på dem???
Her!


----- Aero.fla: Frame 1 (eneste frame) -----

("BACKGROUND_blue", "BACKGROUND", 0);
_root.createEmptyMovieClip("OVERLAY", 1);
_root.createEmptyMovieClip("MISSILES", 2);
_root.createEmptyMovieClip("OBJECTS", 3);
attachMovie("INTERFACE", "INTERFACE", 4);
OBJECTS.attachMovie("PLAYER", "PLAYER", 0);
OBJECTS.PLAYER._x = Stage.width/2;
OBJECTS.PLAYER._y = Stage.height/2;
OBJECTS.PLAYER._rotation = 270;

FRICTION = new Number(1.01);

function COOLDOWN(_OBJECT:String):Void {
    _root.OBJECTS[_OBJECT].COOLDOWN = false;
}

function EFFECT_SPIN(_OBJECT:String):Void {
    _root.OBJECTS[_OBJECT].HEALTH -= .05*_root.OBJECTS[_OBJECT].EFFECTS_TIME[_root.OBJECTS[_OBJECT].C];
    _root.OBJECTS[_OBJECT].ARMOR -= .0025*_root.OBJECTS[_OBJECT].EFFECTS_TIME[_root.OBJECTS[_OBJECT].C];
    _root.OBJECTS[_OBJECT]._rotation += .2*_root.OBJECTS[_OBJECT].EFFECTS_TIME[_root.OBJECTS[_OBJECT].C];
    _root.OBJECTS[_OBJECT].VECTORS_X.push(.0025*_root.OBJECTS[_OBJECT].EFFECTS_TIME[_root.OBJECTS[_OBJECT].C]*Math.cos(_root.OBJECTS[_OBJECT]._rotation*Math.PI/180));
    _root.OBJECTS[_OBJECT].VECTORS_Y.push(.0025*_root.OBJECTS[_OBJECT].EFFECTS_TIME[_root.OBJECTS[_OBJECT].C]*Math.sin(_root.OBJECTS[_OBJECT]._rotation*Math.PI/180));
    SYMBOLS.ATTACH("OVERLAY", "FIRE_5x5_15", {_x:_root.OBJECTS[_OBJECT]._x, _y:_root.OBJECTS[_OBJECT]._y, _alpha:_root.OBJECTS[_OBJECT].EFFECTS_TIME[_root.OBJECTS[_OBJECT].C]});
}

function TEMP_FUNC():Void {
    EFFECTS.APPLY("PLAYER", "EFFECT_SPIN", 100);
    SYMBOLS.ATTACH("OVERLAY", "EXPLOSION_10x10_10", {_x:_root.OBJECTS.PLAYER._x, _y:_root.OBJECTS.PLAYER._y});
}
setInterval(TEMP_FUNC, 10000, null);


----- Aero.fla: PLAYER (MovieClip) -----

///// VARIABLES /////

// Controls
var FORWARD:Number = new Number(38);
var BACKWARDS:Number = new Number(40);
var LEFT:Number = new Number(37);
var RIGHT:Number = new Number(39);
var PRIMARY:Number = new Number(90);

// Data
var HEALTH:Number = new Number(1000);
var ARMOR:Number = new Number(100);
var AMMUNITION:Number = new Number(100);
var COOLDOWN:Boolean = new Boolean();

// Physics
var ACCELERATION:Number = new Number(.1);
var STEERING:Number = new Number(5);

// Vectors
var VECTORS_X:Array = new Array();
var VECTORS_Y:Array = new Array();
var VECTOR_X:Number = Number(0);
var VECTOR_Y:Number = Number(0);

// Effects
var EFFECTS_NAME:Array = new Array();
var EFFECTS_TIME:Array = new Array();

// Loop
var C:Number = new Number(0);
onEnterFrame = function() {
    VECTORS_X.splice(0);
    VECTORS_Y.splice(0);
    COOLDOWN = true;
    for (C=0; C<EFFECTS_NAME.length; C++) {
        if (EFFECTS_TIME[C]>0) {
            _root[EFFECTS_NAME[C]].apply(this, [_name]);
            EFFECTS_TIME[C]--;
        }
    }
    if (Key.isDown(LEFT) && !Key.isDown(RIGHT)) {
        _rotation -= STEERING;
    }
    if (Key.isDown(RIGHT) && !Key.isDown(LEFT)) {
        _rotation += STEERING;
    }
    if (Key.isDown(FORWARD) && !Key.isDown(BACKWARDS)) {
        VECTORS_X.push(ACCELERATION*Math.cos(_rotation*Math.PI/180));
        VECTORS_Y.push(ACCELERATION*Math.sin(_rotation*Math.PI/180));
    }
    if (Key.isDown(BACKWARDS) && !Key.isDown(FORWARD)) {
        VECTORS_X.push(-1*ACCELERATION*Math.cos(_rotation*Math.PI/180));
        VECTORS_Y.push(-1*ACCELERATION*Math.sin(_rotation*Math.PI/180));
    }
    if (Key.isDown(PRIMARY) && COOLDOWN && AMMUNITION>0) {
        SYMBOLS.ATTACH("MISSILES", "MISSILE_player_primary", {_x:this._x, _y:this._y, _rotation:this._rotation});
        EFFECTS.APPLY("PLAYER", "COOLDOWN", 10);
        AMMUNITION--;
    }
    for (C=0; C<VECTORS_X.length; C++) {
        VECTOR_X += VECTORS_X[C];
        VECTOR_Y += VECTORS_Y[C];
    }
    VECTOR_X /= _root.FRICTION;
    VECTOR_Y /= _root.FRICTION;
    _x += VECTOR_X;
    _y += VECTOR_Y;
    SYMBOLS.ATTACH("OVERLAY", "SMOKE_10x10_25", {_x:this._x, _y:this._y});
    if (_x < 0 || _x > Stage.width || _y < 20 || _y > Stage.height-20) {
        HEALTH = 0;
    }
    if (HEALTH <= 0) {
        SYMBOLS.ATTACH("OVERLAY", "EXPLOSION_20x20_20", {_x:this._x, _y:this._y});
        this.removeMovieClip();
    }
}


----- DIGITS.as -----

class DIGITS {
   
    public static function ROUND(_NUMBER:Number, _DIGITS:Number, _ADD:Boolean):String {
        if (_ADD && _DIGITS>0) {
            var RETURN:String = new String((Math.round(_NUMBER*Math.pow(10, _DIGITS))/Math.pow(10, _DIGITS)).toString());
            if (RETURN.indexOf(".", 0) == -1) {
                RETURN += ".";
            }
            while (RETURN.length < ((Math.floor(_NUMBER)).toString()).length+_DIGITS+1) {
                RETURN += "0";
            }
            return RETURN;
        } else {
            return (Math.round(_NUMBER*Math.pow(10, _DIGITS))/Math.pow(10, _DIGITS)).toString();
        }
    }
   
}


----- EFFECTS.as -----

class EFFECTS {
   
    public static function APPLY(_OBJECT:String, _EFFECT:String, _DURATION:Number):Void {
        _root.OBJECTS[_OBJECT].EFFECTS_NAME.push(_EFFECT);
        _root.OBJECTS[_OBJECT].EFFECTS_TIME.push(_DURATION);
    }
   
}


----- SYMBOLS.as -----

class SYMBOLS {
   
    private static var MAX:Number = new Number(1000);
    private static var DEPTH:Array = new Array();
   
    public static function ATTACH(_PARENT:String, _SYMBOL:String, _ARGUMENTS:Object):MovieClip {
        if (DEPTH[_PARENT]==undefined || DEPTH[_PARENT]>=MAX-1) {
            DEPTH[_PARENT] = 0;
        } else {
            DEPTH[_PARENT]++;
        }
        return _root[_PARENT].attachMovie(_SYMBOL, "SYMBOL"+DEPTH[_PARENT], DEPTH[_PARENT], _ARGUMENTS);
    }
   
}


Enkelt, ikke? Hvor er så fejlen?
Avatar billede Slettet bruger
13. april 2007 - 19:05 #4
Hov, jeg må hellere være sød... Du skal nok fokusere på:


if (Key.isDown(LEFT) && !Key.isDown(RIGHT)) {
        _rotation -= STEERING;
    }
    if (Key.isDown(RIGHT) && !Key.isDown(LEFT)) {
        _rotation += STEERING;
    }
    if (Key.isDown(FORWARD) && !Key.isDown(BACKWARDS)) {
        VECTORS_X.push(ACCELERATION*Math.cos(_rotation*Math.PI/180));
        VECTORS_Y.push(ACCELERATION*Math.sin(_rotation*Math.PI/180));
    }
    if (Key.isDown(BACKWARDS) && !Key.isDown(FORWARD)) {
        VECTORS_X.push(-1*ACCELERATION*Math.cos(_rotation*Math.PI/180));
        VECTORS_Y.push(-1*ACCELERATION*Math.sin(_rotation*Math.PI/180));
    }
    if (Key.isDown(PRIMARY) && COOLDOWN && AMMUNITION>0) {
        SYMBOLS.ATTACH("MISSILES", "MISSILE_player_primary", {_x:this._x, _y:this._y, _rotation:this._rotation});
        EFFECTS.APPLY("PLAYER", "COOLDOWN", 10);
        AMMUNITION--;
    }


...i PLAYER MC'et :)
Avatar billede Slettet bruger
13. april 2007 - 21:02 #5
Barkluuuund? :)
Avatar billede Slettet bruger
13. april 2007 - 21:16 #6
Forresten: Har ændret styringen:

Fremad: W
Tilbage: S
Ventre: A
Højre: D
Primær ild: ENTER

Og så virker det!

Det er piletasterne der er noget galt med - og det er en generel fejl. Har nemlig også fået det testet på en anden maskine.
Avatar billede alexander_j Nybegynder
14. april 2007 - 01:47 #7
Hvorfor skal min karma skyde i sænk (lav dog det om mand)?
Du stiller et spørgsmål og ud fra de oplysninger du der giver, så giver jeg det mest fyldestgørende svar man kan - netop at din kode formodentligt er sat forkert op - for det kan sagtens virke.

Prøv at putte nedestående kode ind i frame 1 og se om den giver samme problemer som du oplevede i din egen kode - og hvis ikke så prøv at lur min kode af og integrer den med din egen!

createEmptyMovieClip("mc_plane",getNextHighestDepth());
with(mc_plane){
    lineStyle(1, 0x000000, 100);
    moveTo(5,0);
    lineTo(-5,-5);
    lineTo(-5,5);
    lineTo(5,0);
}
mc_plane.s = 0;
mc_plane.r = 0;
mc_plane.b = 0;
mc_plane.onEnterFrame = function(){
    this._rotation += this.r;
    this._x += this.s * Math.cos(Math.PI/180 * this._rotation);
    this._y += this.s * Math.sin(Math.PI/180 * this._rotation);
}

createEmptyMovieClip("mc_bullet",getNextHighestDepth());
with(mc_bullet){
    lineStyle( 0, 0x0000FF, 100 );
    moveTo( 5, 5 );
    curveTo( 6, 5, 6, 4 );
    curveTo( 6, 3, 5, 3 );
    curveTo( 4, 3, 4, 4 );
    curveTo( 4, 5, 5, 5 );
    _x = -1000;
    _y = -1000;
}

function keyupanddown(){
    mc_plane.r = 0;
    if (Key.isDown(Key.UP) and mc_plane.s < 10) mc_plane.s++;
    if (Key.isDown(Key.DOWN) and mc_plane.s > 0) mc_plane.s--;
    if (Key.isDown(Key.RIGHT)) mc_plane.r += 5;
    if (Key.isDown(Key.LEFT)) mc_plane.r += -5;
    if (Key.isDown(90)){
        mc_bullet.duplicateMovieClip("mc_bullet"+mc_plane.b,getNextHighestDepth());
        _root["mc_bullet"+mc_plane.b]._x = mc_plane._x;
        _root["mc_bullet"+mc_plane.b]._y = mc_plane._y;
        _root["mc_bullet"+mc_plane.b]._rotation = mc_plane._rotation;
        _root["mc_bullet"+mc_plane.b].onEnterFrame = function(){
            this._x += 15 * Math.cos(Math.PI/180 * this._rotation);
            this._y += 15 * Math.sin(Math.PI/180 * this._rotation);
        }
        mc_plane.b++;
    }
}

keyListener = new Object();
keyListener.onKeyDown = function () {
    keyupanddown();
}
keyListener.onKeyUp = function () {
    keyupanddown();
}
Key.addListener(keyListener);
Avatar billede alexander_j Nybegynder
14. april 2007 - 01:53 #8
Den skal naturligvis ind i en helt tom film.

Mit eksempel lader meget tilbage at ønske - fx bør der rettes til så kuglernes movieclip bliver slettet når kuglerne ryger ud af synsfeltet og tilsvarende bør der laves noget som tager højde for hvis flyet forlader synsfeltet. Men det er jo heller ikke det dit spørgsmål går ud på - du spørger jo om piletasterne og andre taster kan registreres samtidig i flash og det kan de.
Avatar billede Slettet bruger
14. april 2007 - 08:42 #9
Det er jo godt. Og jeg mener da, at projektiler og spiller bliver slettet når de forlader skærmen... Jo, det gør de også. Kikker lige på din kode.
Avatar billede Slettet bruger
14. april 2007 - 09:05 #10
Lol, undskyld, men jeg bliver altså nødt til at sige, at din kode overhovedet ikke virker...
Avatar billede Slettet bruger
14. april 2007 - 09:06 #11
Holder jeg PIL OP eller NED nede sammen med VENSTRE ellr HØJRE og slipper sidepilen for at trykke på modsatte går det omkring et sekundt inden den reagerer...
Avatar billede Slettet bruger
14. april 2007 - 09:07 #12
*eller
Avatar billede alexander_j Nybegynder
14. april 2007 - 11:41 #13
Hmm du har vist ret, der er et problem i flash med at registrere left-, right- og up-arrow på en gang.
Hvis du afprøver nedenstående kode, som er sat op til at registrere up, down, left, right og 'z', så ses det at left-, right- og up-arrow ikke kan registreres alle tre på en gang, men det kan også ses, at det kun er i forbindelse med up og left at problemet er der.

for(var i:Number = 0; i<=4; i++){
    _root.createTextField("tf"+i, _root.getNextHighestDepth(), 0, 25*i, 50, 25);
    _root["tf"+i].text = "-";
}
function keyupanddown(){
    if (Key.isDown(38)) _root.tf0.text = "up";
    else _root.tf0.text = "-";
    if (Key.isDown(40)) _root.tf1.text = "down";
    else _root.tf1.text = "-";
    if (Key.isDown(39)) _root.tf2.text = "right";
    else _root.tf2.text = "-";
    if (Key.isDown(37)) _root.tf3.text = "left";
    else _root.tf3.text = "-";
    if (Key.isDown(90)) _root.tf4.text = "Z";
    else _root.tf4.text = "-";
}

keyListener = new Object();
keyListener.onKeyDown = function () {
    keyupanddown();
}
keyListener.onKeyUp = function () {
    keyupanddown();
}
Key.addListener(keyListener);
Avatar billede alexander_j Nybegynder
14. april 2007 - 11:48 #14
NB! pil op og ned sammen med højre virker fint i min kode, men ikke med venstre.
Så jo flash har et problem i forhold til registrering af ned og højre samtidig med at op og venstre er trykket ned.

Har ingen egentlig løsning på problemet - andet end lev med det eller brug andre taster.
Avatar billede Slettet bruger
14. april 2007 - 14:57 #15
Jeg kom frem til samme konklussion :)
Nej, så er der nok ingen løsning... men nu er jeg da sikker på at det ikke en en fejl i min kode eller på min pc ;)
Takker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester