Avatar billede Slettet bruger
17. december 2005 - 18:43 Der er 28 kommentarer og
1 løsning

Fejl i koden - OBS: Avanceret

Hej eksperter!

Jeg er ved at lave et action-spil set oppe fra...
Nu vil jeg lave fjendernes kunstige intelligens.
De skal vende sig mod én, hvis der ikke er noget mellem fjenden og spilleren ('_root.player').
Resten af den kunstige intelligens er ligegyldig.

Metode:
Jeg får fjenderne til at sende små usynlige objekter ('_root.test') afsted mod spilleren i uendelig høj fart, og hvis disse rammer spilleren, før de bliver blokeret eller bevæger sig ud af banen, skal fjenden, der afsendte objektet vende sig mod spilleren.

Her er koden, der udelukkende er placeret i fjendernes movieclips:

onEnterFrame = function() {
    _root.attachMovie("test", "test", 1);
    _root.test._x = _x;
    _root.test._y = _y;
    _root.test._rotation = Math.atan((_root.test._y-_root.player._y)/(_root.test._x-_root.player._x))*180/Math.PI-90;
    if (_root.test._x < _root.player._x) {
        _root.test._rotation += 180;
    }
    while (!_root.level.hitTest(_root.shot._x, _root.shot._y, 1) && _root.shot._x > 0 && _root.shot._x < _root._width && _root.shot._y > 0 && _root.shot._y < _root._height) {
        if (_root.player.hitTest(_root.test._x, _root.test._y, 1)) {
            _rotation = Math.atan((_y-_root.player._y)/(_x-_root.player._x))*180/Math.PI-90;
            if (_x < _root.player._x) {
                _rotation += 180;
            }
        } else {
            _root.test._x += Math.sin(_root.test._rotation*(Math.PI/180));
            _root.test._y += Math.cos(_root.test._rotation*(Math.PI/180))*-1;
        }   
    }
    _root.test.removeMovieClip();
}

Hvorfor virker det ikke?
Hvor går det galt?
Avatar billede maqhem Nybegynder
18. december 2005 - 15:25 #1
ØØøøyj, vild avanceret, hva'? ;) Ser lige om jeg kan fikse noget fedt sammen (men jeg troede du var stoppet med Flash)
Avatar billede maqhem Nybegynder
18. december 2005 - 15:33 #2
men skal der ikke stå "fjende._rotate" i stedet for bare "_rotate" i linie 11 (as)?
Avatar billede maqhem Nybegynder
18. december 2005 - 15:33 #3
hovsa... jeg mente "fjende._rotation" :)
Avatar billede maqhem Nybegynder
18. december 2005 - 15:34 #4
eller i hvert fald hvad du nu vil have til at dreje :)
Avatar billede maqhem Nybegynder
18. december 2005 - 15:37 #5
men jeg kan ikke følge dig :S Hvor indgår det i din kode, at det er fjenden der skal dreje sig... Kan kun se, at dine små test-objects skal dreje sig - velogmærket dém, som man jo ikke kan "nå" at se...

Uddyber du ikke lige en smugle?
Avatar billede Slettet bruger
18. december 2005 - 15:48 #6
Jo, da...
Fjenden skal "skyde" usynlige punkter mod spilleren...
Hvis de rammer, skal fjenden dreje sig efter én (se linie 11 som du nævnte som en mulig fejl).
Resten af koden er helt simpel, så det har jeg ikke skrevet...
Men du håner vel ikke mit sprogbrug? Jeg synes selv, at min metode er noget... "Avanceret"... Den er i hvert fald... "Kreativ" (om det så er godt eller dårligt, det, øh...)!
Jeg har faktisk spurgt, om det er muligt at teste om der en noget imellem to objekter... Men fik ikke svar.
Så derfor denne halvondsvage metode!
Avatar billede barklund Nybegynder
19. december 2005 - 08:43 #7
Er det for at "fjenden" kan finde ud af, hvor spilleren er henne - eller hvad er formålet med denne ide?

Og derudover, hvis du vil lave noget, der bare er en smule avanceret (hvilket vi nok stadig er ret langt fra), så bør du kaste dig over objekt-orienteret programmering og ActionScript2 - det er til hver en tid nemmere og mere overskueligt :)
Avatar billede Slettet bruger
20. december 2005 - 13:09 #8
Hmm... Jeg ved godt, jeg virker lidt noobed... Det er jeg så også, men pyt med det!!
Fjenden skal tjekke om der er noget imellem den selv og spilleren. Hvis der ikke er, skal den dreje sig efter spilleren.
Kan dette gøres nemmere? (Håber jeg MEGET!)
Avatar billede barklund Nybegynder
20. december 2005 - 13:17 #9
Hvad kan der være imellem? Du kan jo løbe alle objekter igennem og teste. Eller du kan lave punkterne på linjen og hitteste med potentielle objekter. Du behøver jo ikke rent faktisk lave et movieclip - du kan også teste med et vilkårligt punkt.
Avatar billede Slettet bruger
20. december 2005 - 15:09 #10
Hmm... Jeg prøver 'trace'...
Avatar billede barklund Nybegynder
20. december 2005 - 15:12 #11
Trace? eh, okay...
Avatar billede Slettet bruger
20. december 2005 - 15:17 #12
WTF?! Se lige her:

onEnterFrame = function() {
    _root.attachMovie("test", "test", 1);
    _root.test._x = _x;
    _root.test._y = _y;
    _root.test._rotation = Math.atan((_root.test._y-_root.player._y)/(_root.test._x-_root.player._x))*180/Math.PI-90;
    if (_root.test._x < _root.player._x) {
        _root.test._rotation += 180;
    }
    while (!_root.level.hitTest(_root.test._x, _root.test._y, 1) && _root.shot._x > 0 && _root.shot._x < _root._width && _root.shot._y > 0 && _root.shot._y < _root._height) {
        if (_root.player.hitTest(_root.test._x, _root.test._y, 1)) {
            _rotation = Math.atan((_y-_root.player._y)/(_x-_root.player._x))*180/Math.PI-90;
            if (_x < _root.player._x) {
                _rotation += 180;
            }
        } else {
            _root.test._x += Math.sin(_root.test._rotation*(Math.PI/180));
            _root.test._y += Math.cos(_root.test._rotation*(Math.PI/180))*-1;
        }
        trace("_root.test._x = "+_root.text._x+".\n_root.test._y = "+_root.test._y+".");
    }
    _root.test.removeMovieClip();
}

Hvorfor f*ck virker trace ikke?
Avatar billede Slettet bruger
20. december 2005 - 15:23 #13
Hmm... Den kører slet ikke while'en...
Jeg har for resten en fejl: Alle 'shot'ere skal være 'test'ere!
Avatar billede Slettet bruger
20. december 2005 - 15:52 #14
Ved du hvorfor...? (Det ved jeg, du gør!)
Avatar billede maqhem Nybegynder
20. december 2005 - 15:54 #15
skal du ikke skrive true i stedet for 1 i dine shapeflags?
Avatar billede barklund Nybegynder
20. december 2005 - 16:07 #16
Hvis din while ikke kører, så er det fordi betingelsen aldrig er sand. Punktum. Hvorfor den ikke er det, skal jeg ikke kunne sige. Der er jo nogle variabler, der ændrer sig, så du kan jo undersøge, hvilken værdi de har og dermed finde ud af, hvorfor betingelsen aldrig er sand. Og at skrive true er kun pænere - det vil stadig virke :)
Avatar billede maqhem Nybegynder
20. december 2005 - 16:21 #17
Okay :)

For jeg foretrækker godt nok også true...

Angående det andet spørgsmål, angående ikonet, har jeg selv løst det - åbnede det med Notepad 2 :D
Avatar billede Slettet bruger
20. december 2005 - 17:20 #18
Nå virker det!
Problemet var, at jeg brugte _root._width og _root._height; det ville den ikke!
Så nu bruger jeg 800 og 600... Desuden kludrede jeg også først lidt i mine koder - men det er jo en anden sag...
Avatar billede Slettet bruger
20. december 2005 - 17:22 #19
--- SLUTKODE ---

i = 1;
setInterval(function(){
    _root.attachMovie("test", "test", 1);
    _root.test._x = _x;
    _root.test._y = _y;
    _root.test._rotation = Math.atan((_root.test._y-_root.player._y)/(_root.test._x-_root.player._x))*180/Math.PI-90;
    if (_root.test._x < _root.player._x) {
        _root.test._rotation += 180;
    }
    while (!_root.level.hitTest(_root.test._x, _root.test._y, 1) && _root.test._x > 0 && _root.test._x < 800 && _root.test._y > 0 && _root.test._y < 600) {
        if (_root.player.hitTest(_root.test._x, _root.test._y, 1)) {
            _rotation = Math.atan((_y-_root.player._y)/(_x-_root.player._x))*180/Math.PI-90;
            if (_x < _root.player._x) {
                _rotation += 180;
            }
            _root.attachMovie("shot", "shot_enemy"+i, i+200);
            _root["shot_enemy"+i]._x = _x;
            _root["shot_enemy"+i]._y = _y;
            _root["shot_enemy"+i]._rotation = _rotation;
            i ++;
        }
        _root.test._x += Math.sin(_root.test._rotation*(Math.PI/180));
        _root.test._y += Math.cos(_root.test._rotation*(Math.PI/180))*-1;
    }
    _root.test.removeMovieClip();
}, 100);

--- LUKKET ---
Avatar billede barklund Nybegynder
20. december 2005 - 21:33 #20
Du bør nu stadig seriøst lave det smartere og eventuelt giver nogle klasser ind over. Det er virkelig ikke en god måde at bygge det op på :)

Well, held og lykke :)
Avatar billede maqhem Nybegynder
21. december 2005 - 12:56 #21
Hvordan ville du have lavet det? Bare hvor der proppes en masse :Number og :String på? Eller med at opbygge sine egne classes?
Avatar billede barklund Nybegynder
21. december 2005 - 13:06 #22
Jeg ville lave passende classes til det. Umiddelbart en Player, Enemy og en GameManager eller noget i den stil. Der bliver lidt mere overskueligt, hvis man har den slags. Så kan de have nogle metoder som Enemy.calculateAngleToPlayer(p:Player) og den slags.
Avatar billede maqhem Nybegynder
21. december 2005 - 13:20 #23
Jeg har læst en smugle om dette. Og jeg har fundet ud af (som Hjælpen siger) at hvis jeg laver en fil:

Person.as

med følgende kode:

class Person {
    var pName:String;
    var pAge:Number;
    function Person(iName:String, iAge:Number) {
        pName = iName;
        pAge = iAge;
    }
    function getName():String {
        return pName;
    }
    function getAge():Number {
        return pAge;
    }
}

og en flash fil:

personManager.fla

med følgende as:

var person1:Person = Person("Ole",28);
var person2:Person = Person("Hans",31);
trace(person1.getName()+" er venner med "+person2.getName()+"som er "+person2.getAge()+" år gammel");

Så returnerer den "Ole er venner med Hans som er 31 år gammel".

Men hvordan kan dette benyttes i denne sammenhæng? Kan du ikke på et tidspunkt generere en kode, som virker lige som ovenstående, men med nogle classes, så jeg kan se, hvordan de ellers kan benyttes, da jeg måske ikke helt er alt for bekændt med dem endnu?

Nicolaj
Avatar billede maqhem Nybegynder
21. december 2005 - 13:23 #24
hov, skulle have stået:

var person1:Person = new Person("Ole",28);
var person2:Person = new Person("Hans",31);
Avatar billede maqhem Nybegynder
21. december 2005 - 13:28 #25
og så lige et mellemrum før "som  er", men hvis vi lige ser bort fra det :)
Avatar billede maqhem Nybegynder
21. december 2005 - 13:35 #26
Med "ovenstående" ("Kan du ikke på et tidspunkt generere en kode, som virker lige som ovenstående") mener jeg selvfølgelig hf2ke's kode
Avatar billede barklund Nybegynder
21. december 2005 - 13:42 #27
Jeg skal kigge på det :)
Avatar billede maqhem Nybegynder
21. december 2005 - 13:44 #28
Tak for det! Det ville være utrolig fedt
Avatar billede Slettet bruger
22. december 2005 - 17:20 #29
Yes sir!
Ditto herfra!
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