Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-11-2008, 18:44   #1 (permalink)
Neuer User
 
Registriert seit: Nov 2008
Beiträge: 21
fortbewegungen anzeigen lassen

hi! ich habe ein kachelbasiertes (2d)labyrinth programmiert, in dem man einen helden mit den pfeiltasten ganz normal bewegen kann, d.h. bei betätigung der entsprechenden taste werden die x und y werte immer um 2 pixel verändert (selbst bei gedrückter pfeiltaste ist der held also nciht besonders schnell).
jetzt habe ich ein algorithmus implementiert, der von selbst aus dem labyrinth herausfindet. der algorithmus nutzt dabei eigentlich auch zur fortbewegung die geschwindigkeit von 2 pixeln. dennoch ist es so, dass bei starten des algorithmus der held einfach vom start bis zum ziel "springt". über die trace funktion kann ich mir zwar die ganzen schritte ausgeben lassen, aber das alles innerhalb von millisekunden. ich möchte gerne sehen können, wie sich der held durchs labyrinth bewegt, mit der geschwindikeit als hätte man permanent die pfeiltasten gedrückt und nicht so, dass er einfach ganz plötzlich am ziel steht... hoffe, dass problem ist klar geworden und dass mir jemand weiterhelfen kann.
schönen gruß
kinley ist offline   Mit Zitat antworten
Alt 26-11-2008, 18:47   #2 (permalink)
i ate pixels
 
Benutzerbild von pixelslave
 
Registriert seit: Mar 2004
Ort: Augsburg
Beiträge: 528
führe die findenfunktion in einen onEnterFrame event aus
pixelslave ist offline   Mit Zitat antworten
Alt 26-11-2008, 18:56   #3 (permalink)
Neuer User
 
Registriert seit: Nov 2008
Beiträge: 21
ich glaube, das ist bereits der fall =) das ganze ist mit as2 programmiert. in der .fla erstelle ich ein labyrinth objekt, das wiederum ein hero objekt erstellt und dieses hero objekt hat die funktion function onEnterFrame, die dann die finden-funktion aufruft =) oder ist das nicht dasselbe? zumindest hab ich in dieser onEnterFrame-Funktion auch die Pfeiltasten programmiert.
kinley ist offline   Mit Zitat antworten
Alt 26-11-2008, 19:01   #4 (permalink)
i ate pixels
 
Benutzerbild von pixelslave
 
Registriert seit: Mar 2004
Ort: Augsburg
Beiträge: 528
der code würde helfen
pixelslave ist offline   Mit Zitat antworten
Alt 26-11-2008, 19:13   #5 (permalink)
Neuer User
 
Registriert seit: Nov 2008
Beiträge: 21
hier die game klasse (die das labyrinth baut und den hero dann reinsetzt) und die hero(char) klasse, die leider ziemlich groß ist. ich war beim kommentieren leider ziemlich faul. das wichtige hab ich fett markiert. die finden-funktion heißt pledgeAlgorithm und wird hier sofort aufgerufen.
class Game extends MovieClip
{
//hero
var char:Char;

function Game()
{
char = new Char();
var myLabyrinth:Labyrinth = new Labyrinth();
myLabyrinth.buildMap();
}
}


class Char extends MovieClip
{
var lab:Labyrinth;
//Startpositionen
var xtile = 7;
var ytile = 2;
//Pixel-Geschwindigkeit
var speed = 2;
var path;

//Der Char kann sich auf bis zu 4 Positionen befinden
var columnLeft:Number;
var columnRight:Number;
var rowUp:Number;
var rowDown:Number;

var upleft:Boolean;
var upright:Boolean;
var downleft:Boolean;
var downright:Boolean;

//Die eigentliche Höhe und Breite durch 2 teilen und in diesen Variablen speichern.
var width = 4;
var height = 4;

var char:MovieClip;


function Char()
{
this.lab = new Labyrinth();

char = _root.labyrinth_mc.attachMovie("char", "char_mc", 10000);
this.char = _root.labyrinth_mc.char_mc;

//Um die Startposition des Charakters zu bestimmen! siehe unten (path._x usw.)
var x = (xtile * lab.spacing)+lab.tileW/2;
var y = (ytile * lab.spacing)+lab.tileH/2;
char._y = y;
char._x = x;


}

function onEnterFrame()
{
pledgeAlgorithm();
if (Key.isDown(Key.RIGHT)) {

gridPosition(char._x + speed, char._y);
if(upright and downright)
{
char._x += speed;
}
} else if (Key.isDown(Key.LEFT)) {
gridPosition(char._x - speed, char._y);
if(downleft and upleft)
{
char._x -= speed;
}
} else if (Key.isDown(Key.UP)) {
gridPosition(char._x, char._y - speed);
if(upright and upleft)
{
char._y -= speed;
}
} else if (Key.isDown(Key.DOWN)) {
gridPosition(char._x, char._y + speed);
if(downleft and downright)
{
char._y += speed;
}
}


}


function gridPosition(x, y)
{
columnLeft = Math.floor((x - width) / lab.spacing);
columnRight = Math.floor((x + width) / lab.spacing);
rowUp = Math.floor((y - height) / lab.spacing);
rowDown = Math.floor((y + height) / lab.spacing);

upleft = lab.myLabyrinth[rowUp][columnLeft].getWalkable();
upright = lab.myLabyrinth[rowUp][columnRight].getWalkable();
downleft = lab.myLabyrinth[rowDown][columnLeft].getWalkable();
downright = lab.myLabyrinth[rowDown][columnRight].getWalkable();
trace("cl: "+columnLeft+" cr: " + columnRight + " ru " + rowUp + " rd " + rowDown);
}

var zaehler = 0;

function pledgeAlgorithm()
{

if(zaehler == 0)
{
if(moveUp() == true)
{
moveUp();
}
else { zaehler--; }
}


if(zaehler == -1)
{
if(moveUp() == false)
{
if(moveRight() == true)
{
moveRight();
}
else
{
zaehler--;
}
}
else zaehler++;
}

if(zaehler == -2)
{

if(moveRight() == false)
{
if(moveDown() == true)
{
moveDown();
}
else
{
zaehler--;
}
}
else
{
zaehler++;
}
}

if(zaehler == -3)
{
if(moveDown() == false)
{
if(moveLeft() == true)
{
moveLeft();
}
else
{
zaehler--;
}

}
}

pledgeAlgorithm();



}

//move-Funktionen für den pledge Algorithmus
function moveRight():Boolean
{
gridPosition(char._x + speed, char._y);
if(upright and downright)
{
char._x += speed;
return true;
} else { return false; }
}

function moveLeft()
{
gridPosition(char._x - speed, char._y);
if(downleft and upleft)
{
char._x -= speed;
return true;
} else { return false; }
}

function moveUp()
{
gridPosition(char._x, char._y - speed);
if(upright and upleft)
{
char._y -= speed;
return true;
} else { return false; }
}

function moveDown()
{
gridPosition(char._x, char._y + speed);
if(downleft and downright)
{
char._y += speed;
return true;
} else { return false; }
}


}
kinley ist offline   Mit Zitat antworten
Alt 26-11-2008, 23:20   #6 (permalink)
i ate pixels
 
Benutzerbild von pixelslave
 
Registriert seit: Mar 2004
Ort: Augsburg
Beiträge: 528
hm du führst die funktion pledgeAlogrithm() in der selbigen am schluss aus? kann das sein? blicke da nicht ganz durch ohne tabs uns

am besten auf nopaste.org gehen und da nochmal posten und hier den link dazu :-)

oder die code funktionen des boards benutzen

[ A S ] dein code [ / A S ] (ohne leerzeichen)

zb
ActionScript:
  1. dein code
pixelslave ist offline   Mit Zitat antworten
Alt 26-11-2008, 23:32   #7 (permalink)
Neuer User
 
Registriert seit: Nov 2008
Beiträge: 21
ja ist richtig.. die funktion ist rekursiv, hat aber keine abbruchbedingung ^^ (kommt alles noch!) aber es geht ja auch darum, warum man die einzelnen bewegungen des helden nicht sehen kann, denn die funktion bringt ihn ja trotz der endlosschleife voran.
hier ist der link:

http://nopaste.org/p/a2QHr2owbb

schon mal danke an dieser stelle!
kinley ist offline   Mit Zitat antworten
Alt 27-11-2008, 00:02   #8 (permalink)
i ate pixels
 
Benutzerbild von pixelslave
 
Registriert seit: Mar 2004
Ort: Augsburg
Beiträge: 528
nunaj du führst die funktion jeden frame aus. auch wenns nur ein frame ist wird die funktion 24 mal pro sekunde bei 24 fps aufgerufen und die funktion ruft sich selbst auf ... irgendwie klar das das gleich fertig ist :-)

es reicht wenn die funkton bei onEnterFrame ausgeführt wird :-)
pixelslave ist offline   Mit Zitat antworten
Alt 27-11-2008, 08:26   #9 (permalink)
Neuer User
 
Registriert seit: Nov 2008
Beiträge: 21
ja du hast recht nun geht es!
kinley ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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



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

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


Copyright ©1999 – 2012 Marc Thiele