Avatar billede Slettet bruger
25. oktober 2003 - 11:31 Der er 44 kommentarer

hjælp til et spil

Hej E.

Jeg er igang med et astroids spil, og det der virker for mig lige nu, er mit rumskib, og min highscore.
Men til mine spørgsmål:

Hvordan får jeg en sten til at flyve rundt tilfældigt?

Hvordan laver jeg en laser kanon, der skyder på mellemrums tasten?

Og, hvordan laver jeg sådan at man mister et liv, når man rammer en sten?
Avatar billede alexander_j Nybegynder
25. oktober 2003 - 16:44 #1
Flyver tilfældigt rundt? prøv at se mit svar i det her spørgsmål: http://www.eksperten.dk/spm/269449
Avatar billede Slettet bruger
25. oktober 2003 - 17:39 #2
jeg har fået et script der gør præcis det der (fra en på IRC) men, det jeg gerne vil have er at den fortsætter ligeud, ud over kanten, og kommer ind igen på den anden side, ligesom rumskibet gør
Avatar billede alexander_j Nybegynder
25. oktober 2003 - 19:48 #3
Så lad os da se det script du arbejder ud fra, så kan vi måske rette det lidt til!
Avatar billede mat Nybegynder
25. oktober 2003 - 20:47 #4
Jeg har lavet et lille script til dine "meteorer".


// variabler
var num_rocks = 5;
var world_max_x = 550;
var world_min = 0;
var world_max_y = 400;

// setup til meteorerne
MovieClip.prototype.initRock = function() {
   
    this.direction = Math.pow(-1, random(2)+1);
   
    this._xspeed = random(5)+2;
    this._yspeed = random(5)+2;
   
    this._x = random(world_max_x);
    this._y = random(world_max_y);
   
}
// screenwrap
MovieClip.prototype.screenWrapper = function() {
    if (this._x > world_max_x) {
        this._x = world_min;
    }
    else if (this._x < world_min) {
        this._x = world_max_x;
    }
    if (this._y > world_max_y) {
        this._y = world_min;
    }
    else if (this._y < world_min) {
        this._y = world_max_y;
    }
}
// bevægelse
MovieClip.prototype.control = function() {
    this._x += this._xspeed * this.direction;
    this._y += this._yspeed * this.direction;
    this.screenWrapper();
}

// setup
for (i = 0; i < num_rocks; i++) {
    duplicateMovieClip(rock, "rock" + i, i);
    this["rock" + i].onLoad = function() {
        this.initRock();
    }
    this["rock" + i].onLoad();
    this["rock" + i].onEnterFrame = function() {
        this.control();
    }
}


og med hensyn til toeren nåede jeg så langt:

function fire() {
    trace("HATE - KILL - DESTROY");
    // duplikér et skud
    duplicateMovieClip(skud, "skud" + d, d++);
   
}

obj = new Object();
obj.onKeyDown = function() {
    if (Key.isDown(Key.SPACE)) { // tjek om space er nede
        fire();
    }
}
Key.addListener(obj);

..og der har jeg så placeret følgende på "skud" movieclippet:

onClipEvent (load){
    if (this._name != "skud") {
        this._x = _root.rumskib._x;
        this._y = _root.rumskib._y;
    }
}

onClipEvent (enterFrame) {
    if (this._name != "skud") {
        this._y -= 5;
    }
}


Til treeren skal du kigge på hitTest() metoden, men nu har jeg gæster så jeg er outta here...pøjpøj med det :)

mvh mat
Avatar billede Slettet bruger
25. oktober 2003 - 20:58 #5
sten.onEnterFrame = function() {
    var moveByX = (this.targetX-this._x)*0.005;
    this._x += moveByX;
    var moveByY = (this.targetY-this._y)*0.005;
    this._y += moveByY;
};
function changePosition() {
    sten.targetX = Math.random()*600;
    sten.targetY = Math.random()*600;
}
myInt = setInterval(changePosition, 10000);
Avatar billede Slettet bruger
25. oktober 2003 - 21:10 #6
mat> Jeg kan ikke helt få dit meteor script til at virke, for den kopierer mit rumskib, og ikke min meteor (som for øvrigt står stille)
Avatar billede alexander_j Nybegynder
26. oktober 2003 - 00:00 #7
Hvad blev der af hjælp til selvhjælp???
Avatar billede mat Nybegynder
26. oktober 2003 - 00:08 #8
jeg kedede mig, men helt enig, så kan saxe jo selv prøve at finde ud af hvordan ovenstående virker. Iøvrigt er det stadig langt fra et komplet arkanoid (som jeg formoder han gerne vil "lave") :)
Avatar billede alexander_j Nybegynder
26. oktober 2003 - 01:23 #9
Det var kun for sjov :P
Avatar billede Slettet bruger
27. oktober 2003 - 14:05 #10
hmm... problemet er at jeg ikke er så god til actionscript, og jeg har slet ingen erfaring med random move scripts
Avatar billede mat Nybegynder
27. oktober 2003 - 17:38 #11
Hvis ovenstående kopierer dit rumskib må du have kaldt det "rock" eller "skud", det er det eneste scriptet kan kopiere.

Du skal have et instance uden for scenen af dine sten og det skal have instancenavn "rock".

mvh mat
Avatar billede Slettet bruger
28. oktober 2003 - 10:16 #12
hmm... ja, min fejl. Det virker helt fint nu, bortset fra at stenene ikke går under min "ramme" jeg har i kanten...
Avatar billede mat Nybegynder
28. oktober 2003 - 12:26 #13
lav rammen til et movieclip og smid det her på:

onClipEvent (load) {
this.swapDepths(16000);
}

-mat
Avatar billede Slettet bruger
28. oktober 2003 - 14:03 #14
det virker fint nok, men der er problemet så at denligger sig over min tekst, og det kan jeg ikke lave til et mc, for så virker det ikke! Jeg ser lige nærmere på det
Avatar billede Slettet bruger
28. oktober 2003 - 14:05 #15
sådan. Det virker nu. Men her er min hittest;

onClipEvent (enterframe)
if (rock.hitTest(_root.rumskib)){
_root.lives--;
}
}

Hvad er fejlen?
Avatar billede mat Nybegynder
28. oktober 2003 - 16:27 #16
at stenene ikke hedder "rock" men "rock0", "rock1", "rock2" osv osv.

evt på rock:

onClipEvent (enterframe)
if (this.hitTest(_root.rumskib)){
_root.lives--;
}
}
Avatar billede Slettet bruger
28. oktober 2003 - 16:58 #17
det har jeg prøvet uden resultat :/
Avatar billede Slettet bruger
28. oktober 2003 - 17:02 #18
den kommer med den her fejl: **Error** Scene=Scene 1, layer=bg, frame=1:Line 2: '{' expected
    if (this.hitTest(_root.rumskib)) {
Avatar billede mat Nybegynder
28. oktober 2003 - 17:33 #19
klart der mangler jo en:

onClipEvent (enterframe) {
if (this.hitTest(_root.rumskib)){
_root.lives--;
}
}

sådan :)
Avatar billede Slettet bruger
28. oktober 2003 - 17:49 #20
yeah det virker! Men problemet er at den ikke skifter frame når lives kommer ned på 0! jeg ved ikke hvorfor! her er min frame action:
lives = 3;
if(lives == 0){
    gotoAndPlay(2);
}
else{
    stop();
}
Avatar billede mat Nybegynder
28. oktober 2003 - 17:52 #21
en frameaction udføres kun en gang, når playhead rammer framen. Hvis du vil tjekke lives kontinuerligt (som du bliver nødt til) skal tjekket ligge i et form for loop, det kan være et frameloop eller en enterFrame.
Avatar billede Slettet bruger
28. oktober 2003 - 18:22 #22
hvordan får jeg den til at gå til frame 2 hvis liv er på 0 eller derunder?
Avatar billede mat Nybegynder
28. oktober 2003 - 18:27 #23
lives = 3;
this.createEmptyMovieClip("lives_keeper", 100);
lives_keeper.onEnterFrame = function() {
if (lives <= 0) {
_root.gotoAndPlay(2);
delete this.onEnterFrame;
}
}
Avatar billede Slettet bruger
28. oktober 2003 - 19:30 #24
okay, det virker, men så bliver flyet og stenene ved med at flyve rundt!
Avatar billede Slettet bruger
28. oktober 2003 - 20:10 #25
(hvilket de ikke skal)
Avatar billede mat Nybegynder
28. oktober 2003 - 20:21 #26
så fjerner du dem bare igen:

for (j = 0; j < num_rocks; j++) {
    _root["rock" + j].removeMovieClip();
}


-mat
Avatar billede Slettet bruger
28. oktober 2003 - 21:35 #27
ja, okay det virker. jeg arbejder videre med spillet. mangler stadig nogle funktioner. F.eks. skyd.
Avatar billede Slettet bruger
29. oktober 2003 - 17:40 #28
Jeg har et problem med den der hittest kode. Jeg har lavet spådan at når man rammer en sten, eksploderer den. Men hvordan gør jeg sådan at den ikke har nogen hittest funktion når den eksploderer? Det er nemlig lidt irriterende at dø pga. nogle stumper
Avatar billede mat Nybegynder
29. oktober 2003 - 17:48 #29
lav et usynligt hit-movieclip i frame 1 af dine sten og læg actions på det istedet. Så sørger du bare for at det ikke er i de øvrige frames.

-mat
Avatar billede Slettet bruger
31. oktober 2003 - 15:15 #30
jeg kan simpelthen ikke få eksplosionen til at virke! kan jeg sende dig en .fla ?
Avatar billede alexander_j Nybegynder
31. oktober 2003 - 15:27 #31
;P - hjælp til selvhjælp
Avatar billede Slettet bruger
03. november 2003 - 14:03 #32
jeg har prøvet at få den til at virke i et par dage nu (siden den 29) det vil bare ikke virke :/
Avatar billede mat Nybegynder
03. november 2003 - 18:21 #33
Hej, jeg har været væk de seneste dage så jeg har ikke haft meget tid til eksperten.

hvis din fil fylder under 200 kb kan du sende den til mig, min mail står på mit minisite. Men jeg gider altså ikke lave hele spillet for dig.

mvh mat
Avatar billede Slettet bruger
04. november 2003 - 15:49 #34
Filen fylder ikke under 200 kb (den fylder 236)
Avatar billede mat Nybegynder
04. november 2003 - 16:07 #35
så prøv at sende den alligevel :)
Avatar billede Slettet bruger
07. november 2003 - 14:19 #36
sendt!
Avatar billede Slettet bruger
12. november 2003 - 18:11 #37
... ?!
Avatar billede mat Nybegynder
12. november 2003 - 18:39 #38
jeg kom lige fra det, jeg har meget om ørerne for tiden - kigger på det snarest
Avatar billede Slettet bruger
14. november 2003 - 15:04 #39
okay, mange tak. Jeg var bare ikke sikker på hvad der skete
Avatar billede Slettet bruger
23. november 2003 - 16:47 #40
...
Avatar billede mat Nybegynder
23. november 2003 - 23:02 #41
i den her:

onClipEvent (enterframe) {
if (this.hitTest(_root.rumskib)){
_root.lives--;
_root.gotoAndPlay(2);
}
}

tilføjer du:

this.gotoAndPlay(2);

Så skulle meteoret osse eksplodere
Avatar billede mat Nybegynder
24. november 2003 - 18:59 #42
Det skal så vist være _parent.gotoAndPlay(2);
Avatar billede svendthomsen Nybegynder
18. april 2005 - 18:25 #43
jeg viser dig et spil fra start:

lav først et rumskib som er et moviclip kald det astro og skriv i astros actions skriver du: onClipEvent (load) {
    s = new Sound();
    s.attachSound("prop");
    u = int(1);
    z = int(0);
    lx = int(_root.cont._x);
    ty = int(_root.cont._y);
    rx = int(lx+_root.cont._width);
    by = int(ty+_root.cont._height);
    xprop = new Array(0);
    yprop = new Array(0);
    acce = new Array(z);
    prop = z;
    i = z;
    bul = new Array();
    bulacc = int(10);
    _parent.bull._x = 5000;
    PI = Math.PI;
    _root.act = u;
    bulbs = int(3);
    varrot = int(20);
    _visible = z;
    spdel = z;
    pini = new Sound(_root.prop);
}
onClipEvent (keyDown) {
    // <! spara
    if (_root.act != u & spdel == z) {
        if (Key.isDown(32)) {
            b = int(bul.length);
            duplicateMovieClip("_parent.bull", "bul"+b, b+bulbs);
            bul[b] = eval("_parent.bul"+b);
            bul[b]._x = _x;
            bul[b]._y = _y;
            bul[b]._rotation = _rotation;
            spdel = int(6);
        }
    }
    // !>fine spara
}
onClipEvent (enterFrame) {
    // verifica attivita
    if (_root.act != u) {
        // iperspace
        if (Key.isDown(17)) {
            play();
            _root.act = u;
        }
        // comandi
        if (Key.isDown(37)) {
            _rotation -= varrot;
        }
        if (Key.isDown(39)) {
            _rotation += varrot;
        }
        // arrow up
        if (Key.isDown(38)) {
            // verifica che non stia gia accellerando
            if (prop != u) {
                i = int(acce.length);
            }
            s.start();
            prop = u;
            // aumenta l'accellerazione
            if (acce[i]<=20) {
                acce[i] = parseFloat(substring((acce[i]+1)*1.15, 1, 5));
            }
            // setta la direzione per questa accellerazione
            if (Math.abs(_rotation) == 90) {
                xprop[i] = 0;
            } else {
                xprop[i] = parseFloat(substring(Math.cos(PI/180*_rotation), 1, 5));
            }
            yprop[i] = parseFloat(substring(Math.sin(PI/180*_rotation), 1, 5));
        } else {
            prop = int(0);
        }
    }
    // attrito delle propulsioni
    for (n=z; n<=i; n++) {
        if (~((n == i) & (prop == u))) {
            if (acce[n]>0.4) {
                acce[n] = parseFloat(substring((acce[n]*0.94), 1, 5));
            } else {
                acce.splice(n, 1);
                xprop.splice(n, 1);
                yprop.splice(n, 1);
            }
        }
        // applica le spinte
        _x += xprop[n]*acce[n];
        _y += yprop[n]*acce[n];
    }
    // screen
    if (_x>rx) {
        _x = lx;
    }
    if (_y>by) {
        _y = ty;
    }
    if (_x<lx) {
        _x = rx;
    }
    if (_y<ty) {
        _y = by;
    }
    // <! bullets
    for (p=0; p<=bul.length; p++) {
        if (Math.abs(bul[p]._rotation) == 90) {
            bul[p]._x += z;
        } else {
            bul[p]._x += parseFloat(substring((Math.cos(PI/180*(bul[p]._rotation))*bulacc), 1, 5));
        }
        bul[p]._y += parseFloat(substring((Math.sin(PI/180*(bul[p]._rotation))*bulacc), 1, 5));
        // uscita di campo dei bullets
        if (bul[p]._y>by | bul[p]._x>rx | bul[p]._y<ty | bul[p]._x<lx) {
            removeMovieClip(bul[p]);
            bul.splice(p, 1);
        }
    }
    // !>fine bullets
    if (spdel>z) {
        spdel--;
    }
    updateAfterEvent();
    // _root.veri = "roation ="+_rotation+newline+"sin ="+Math.sin(PI/180*_rotation)+newline+"act ="+_root.act+newline+"prop ="+prop+newline+"prop.length ="+acce.length+newline+"acce0 ="+acce[0]+newline+"acce1 ="+acce[1]+newline+"acce2 ="+acce[2]+newline+"acce3 ="+acce[3]+newline+"xprop0 ="+xprop[0]+newline+"xprop1 ="+xprop[1]+newline+"xprop2 ="+xprop[2]+newline+"xpropx.length ="+xprop.length+newline+"asteroLENGTH ="+_root.cont.astero.length+newline+"spdel ="+spdel;
}

nu skal du oprette en kant(movieclip)kald den cont og klik to gange på cont og inde i cont laver du en sten(movieclip) kald den aster klik nu to gange et sted hvor der ikke er noget tryk nu på cont's actions og skriv:

onClipEvent (load) {
    explo = new Sound();
    explo.attachSound("explo");
    z = int(0);
    u = int(1);
    astero = new Array(1, 2);
    wdt = int(_width);
    hgt = int(_height);
    aster._visible = z;
    live = new Array();
    name = new Array();
    maxlev = z;
    start = int(2);
    function inizobj(n) {
        for (i=0; i<=astero.length; i++) {
            removeMovieClip(astero[i]);
        }
        _root.level = "level"+(n-1);
        astero.splice(1);
        name.splice(1);
        _root.astro._x = _x+(wdt/2);
        _root.astro._y = _y+(hgt/2);
        _root.astro._rotation = 270;
        for (i=z; i<n; i++) {
            angolo = random(360);
            duplicateMovieClip("aster", "astero"+i, i);
            astero[i] = eval("astero"+i);
            astero[i]._rotation = random(180)*2;
            // _root.popo += "primo ="+astero[i]._rotation+newline;
            astero[i]._x = Math.cos(angolo*Math.PI/180)*150+(wdt/2);
            astero[i]._y = Math.sin(angolo*Math.PI/180)*150+(hgt/2);
            maxlev++;
            nuevo = astero.length;
        }
    }
    function inigame() {
        _root.astro.gotoAndStop(1);
        scr = z;
        _root.score = "score "+scr;
        lives = int(2);
        _root.act = 0;
        _root.astro._visible = 1;
        _root.comand._visible = 0;
        _root.options._visible = false;
        _root.end = "taber";
        lx = 540;
        for (l=0; l<3; l++) {
            duplicateMovieClip("_root.lives", "live"+l, l);
            live[l] = eval("_root.live"+l);
            live[l]._x = lx;
            lx += 15;
        }
    }
    inizobj(start);
}
// enter
onClipEvent (enterFrame) {
    for (i=z; i<=astero.length; i++) {
        // _root.popo = "astero ="+astero[i]._rotation+newline;
        astero[i]._x += Math.cos(astero[i]._rotation*Math.PI/180)*2;
        astero[i]._y += Math.sin(astero[i]._rotation*Math.PI/180)*2;
        if (astero[i]._x>wdt) {
            astero[i]._x = z;
        }
        if (astero[i]._y>hgt) {
            astero[i]._y = z;
        }
        if (astero[i]._x<z) {
            astero[i]._x = wdt;
        }
        if (astero[i]._y<z) {
            astero[i]._y = hgt;
        }
        if (_root.act == z) {
            if (astero[i].hitTest(_root.astro)) {
                explo.start();
                tellTarget (_root.astro) {
                    gotoAndPlay("distr");
                    _root.act = u;
                }
                removeMovieClip(live[lives]);
                lives--;
                if (lives<z) {
                    _root.act = u;
                    _root.astro._visible = 0;
                    _root.end = "taber";
                    _root.level = "";
                    _root.comand._visible = 1;
                    _root.comand.control = 1;
                }
            }
            for (j=z; j<=_root.astro.bul.length; j++) {
                if (astero[i].hitTest(_root.astro.bul[j])) {
                    explo.start();
                    removeMovieClip(_root.astro.bul[j]);
                    _root.astro.bul.splice(j, 1);
                    if (astero[i]._xscale>30) {
                        astero[i]._xscale = astero[i]._xscale*0.5;
                        astero[i]._yscale = astero[i]._yscale*0.5;
                        astero[i]._rotation += 45;
                        nuevo++;
                        maxlev++;
                        duplicateMovieClip(astero[i], "astero"+nuevo, maxlev);
                        astero.push(eval("astero"+nuevo));
                        astero[astero.length-1]._rotation = int(astero[i]._rotation-90);
                        scr += 25;
                    } else {
                        removeMovieClip(astero[i]);
                        astero.splice(i, 1);
                        scr += 100;
                    }
                    _root.score = "score "+scr;
                }
            }
        }
        if (astero.length == 0) {
            start++;
            inizobj(start);
        }
        updateAfterEvent();
    }
}

lav nu nogle liv fx. en kopi af aster men kald den i stedet lives
nu har du liv sten rumskib og en kant nu skal du skrive i framen skriv i frame 1:

fscommand("fullscreen", "true");
fscommand("allowscale", "false");
pino = new Sound(bull);
pino.stop();

nu laver du point lav et dynamisk tekstfelt og det's variable navn skal være score
og lav også et dynamisk tekst felt som skal hede(variablenavn)level
lav et til dynamisk tekst felt og kald det(variablenavn) end

nu er du næsten færdig nu skal du klike to gange på aster og lav disse frame: i frame 1 skriver du: stop(); og lav så i frame 1 - 4 vender den sig  lav nu frame nummer 5 - 7 her skal den komme frem igen når den er død skriv i frame 5:this._rotation = 270;
for (i=0; i<=acce.length; i++) {
    xprop[i] = 0;
    yprop[i] = 0;
}
this._x = random(550);
this._y = random(400);
// while (ok<int(_root.cont.astero.length)) {
// ok = 0;
// for (i=0; i<=int(_root.cont.astero.length); i++) {
// if (Math.sqrt((int(this._x)-int(_root.cont.astero[i]._x))*(int(this._x)-int(_root.cont.astero[i]._x))+(int(this._y)-int(_root.cont.astero[i]._y))*(int(this._y)-int(_root.cont.astero[i]._y)))<10) {
// ok++;
// }
// }
// }

lav nu frame 8 - 30 her dør du lav fx. en kniv igennem aster eller noget andet
men skriv i frame 8: gotoAndStop(1);
_root.act = 0;

gi også frame 8 - 30 et navn kald det distr
lav nu frame 30 skriv: gotoAndPlay("5");

nu kliker du to gange hvor der ikke er noget nu skal den sidste ting laves det er så man kan skyde lav et movieclip og kald det bull nu kan du så ligge lyd ind i bull eller andre steder men det må du selv rode med
Avatar billede svendthomsen Nybegynder
18. april 2005 - 18:35 #44
oh nej oh nej jeg har skrevet forkert oven over der står nemlig:
nu er du næsten færdig nu skal du klike to gange på aster


nej nej der står aster der skal stå astro
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