Avatar billede w13 Novice
17. december 2005 - 18:56 Der er 14 kommentarer og
1 løsning

Spil i ActionScript: Figur bliver kun stoppet af første "væg"

Hej Eksperter...

Jeg har nu endelig besluttet mig for at begynde at programmere i Flash, men er selvfølgelig stødt på et par problemer.

Jeg laver et lille spil, hvor man kan flytte en figur ved brug af piletasterne. Nu indsætter jeg et par vægge, som jeg laver til Movie Clip og giver begge instance navnet "wall".

Min kode er opbygget således:
---------------------------------
if (Key.isDown(37)) {
    if (hitTest(_level0.wall) == false) {
        _x = _x-5;
    }
    if (hitTest(_level0.wall) == true) {
        _x = _x+5;
    }
}
---------------------------------

Men det er kun den første væg, som stopper min figur!? den anden væg kører den bare lige igennem. Hvorfor?

Håber I ka' hjælpe.
W13
Avatar billede _k Nybegynder
17. december 2005 - 22:23 #1
Du må ikke bruge samme instance-navn på flere objekter. Så den går ikke at have mere end en "wall".

Løsningen kan være at udvide din if-sætning med flere instance-navne eller få hver væg til at hitTeste på din karakter.
Avatar billede w13 Novice
18. december 2005 - 02:34 #2
hm. ok, det frygtede jeg lidt - men har heldigvis ikke så mange vægge i det her spil =)

Hvis du lige opretter et svar, ka' du få point.
Avatar billede Slettet bruger
18. december 2005 - 08:09 #3
Jeg har et forslag:
Kald alle vægge for 'wall0', 'wall1', 'wall2', (...) 'walln' (n er altid den sidste i rækken).
Brug så denne kode:
if (Key.isDown(37)) {
    i = 0;
    while (i != n)
        if (hitTest(_level0["wall"+i]) == false) {
            _x = _x-5;
        }
        if (hitTest(_level0["wall"+i]) == true) {
            _x = _x+5;
        }
        i = i+1;
    }
}

I koden er n antallet af navngivne mure minis en.
Jeg håber dette virker!
Avatar billede Slettet bruger
18. december 2005 - 08:10 #4
PS: Den sidste mur skal ikke hedde 'walln'. Det er bare et udtryk.
Avatar billede Slettet bruger
18. december 2005 - 08:11 #5
HOV!
'(...) antallet af navngivne mure minis en. (...)'
skulle være
'(...) antallet af navngivne mure minus en. (...)'
!
Avatar billede w13 Novice
18. december 2005 - 11:49 #6
Det virker desværre ikke :-(

Med følgende kode kan jeg figuren til at bevæge sig rundt, men han ignorerer alle vægge. Desuden måtte jeg sætte hans bevægelseshastighed ned, for nu bevæger han sig jo en gang for hver væg, der tjekkes.
-----------------------------
onClipEvent (enterFrame) {
        if (Key.isDown(37)) {
        i = 0;
        while (i != 7) {
            if (hitTest(_level0["wall"+i]) == false) {
                _x = _x-1;
            }
            if (hitTest(_level0["wall"+i]) == true) {
                _x = _x+1;
            }
            i = i+1;
        }
    }
        if (Key.isDown(38)) {
        i = 0;
        while (i != 7) {
            if (hitTest(_level0["wall"+i]) == false) {
                _y = _y-1;
            }
            if (hitTest(_level0["wall"+i]) == true) {
                _y = _y+1;
            }
            i = i+1;
        }
    }
        if (Key.isDown(39)) {
        i = 0;
        while (i != 7) {
            if (hitTest(_level0["wall"+i]) == false) {
                _x = _x+1;
            }
            if (hitTest(_level0["wall"+i]) == true) {
                _x = _x-1;
            }
            i = i+1;
        }
    }
        if (Key.isDown(40)) {
        i = 0;
        while (i != 7) {
            if (hitTest(_level0["wall"+i]) == false) {
                _y = _y+1;
            }
            if (hitTest(_level0["wall"+i]) == true) {
                _y = _y-1;
            }
            i = i+1;
        }
    }
}
Avatar billede maqhem Nybegynder
18. december 2005 - 14:44 #7
alle dine _x = _x++ kan bare hedde _x++;, og det samem med _x = _x-1 => _x--;

:)
Avatar billede maqhem Nybegynder
18. december 2005 - 15:08 #8
Jeg vil faktisk foreslå denne kode i stedet for, da den faktisk virker :)
Sæt dine walls til "wall0", "wall1", "wall2" og så videre, så skulle det du

var hastighed = 5; // nu rykker din "mand" sig 5 px pr frame
ant=0;
while(_root["wall"+ant]){
    ant++;
}
onEnterFrame=function(){
    if(Key.isDown(37)){
        _root.mand._x-=hastighed;
        for(i=0;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._x+=1;
            }
        }
    }
    if(Key.isDown(38)){
        _root.mand._y-=hastighed;
        for(i=0;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._y+=1;
            }
        }
    }
    if(Key.isDown(39)){
        _root.mand._x+=hastighed;
        for(i=0;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._x-=1;
            }
        }
    }
    if(Key.isDown(40)){
        _root.mand._y+=hastighed;
        for(i=0;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._y-=1;
            }
        }
    }
}

Håber du får tingene til at du :D
Avatar billede maqhem Nybegynder
18. december 2005 - 15:11 #9
Og hvis det er utrolig vigtigt, at dine walls starter fra "wall1", "wall2", så brug denne kode i stedet for:

var hastighed = 5; // nu rykker din "mand" sig 5 px pr frame
ant=1;
while(_root["wall"+ant]){
    ant++;
}
onEnterFrame=function(){
    if(Key.isDown(37)){
        _root.mand._x-=hastighed;
        for(i=1;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._x+=1;
            }
        }
    }
    if(Key.isDown(38)){
        _root.mand._y-=hastighed;
        for(i=1;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._y+=1;
            }
        }
    }
    if(Key.isDown(39)){
        _root.mand._x+=hastighed;
        for(i=1;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._x-=1;
            }
        }
    }
    if(Key.isDown(40)){
        _root.mand._y+=hastighed;
        for(i=1;i<=ant;i++){
            while(mand.hitTest(_root["wall"+i])){
                _root.mand._y-=1;
            }
        }
    }
}

Det smarte ved denne kode, som jeg lige har lavet, er, at uanset hvor mange nye mure (eller walls) du sætter ind, vil det hele tiden du. Bare husk at navngiv dem rigtigt, så virker det
Avatar billede maqhem Nybegynder
18. december 2005 - 15:12 #10
mine "_root"'er kan du selvfølgelig udskifte med "_level0" igen hvis du hellere vil have det sådan
Avatar billede maqhem Nybegynder
18. december 2005 - 15:17 #11
Og så er det jo også muligt at ændre hastigheden af din "mand", hvis det var noget :)

Så er det 100% ligegyldigt, om han rykker en nano pixel eller 50 tusinde pixels, hans må bare IKKE (MEGET VIGTIGT) kunne rykke mere end den tundeste vægs tykkelde - har du altså en væg der er 10 px bred, og din mand er 2 px bred, må has maksimale hastighed kun være 12, for at være på den sikre side, så havde jeg sat den til 11 :)
Avatar billede barklund Nybegynder
19. december 2005 - 08:44 #12
Puha, man burde lave et ordentligt framework til den slags spil en dag - det her er simpelthen noget rod, men desværre den vej, de fleste søger. jeg vender nok tilbage some day ;)
Avatar billede w13 Novice
23. december 2005 - 18:37 #13
Det virker fint, Zipper-snake, så hvis du lige opretter svar, ka' du få point =)
Avatar billede maqhem Nybegynder
25. december 2005 - 21:03 #14
Hyperglad for det virker!
Avatar billede maqhem Nybegynder
26. december 2005 - 09:48 #15
Tak!
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