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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 17-09-2007, 04:56   #1 (permalink)
wau
 
Benutzerbild von Circushund
 
Registriert seit: Jan 2006
Ort: Hamburch
Beiträge: 404
Kollisions-Erkennung einer Box?

Hi,

Nach ein paar Stunden rumprobieren und austesten bin ich immer noch nicht zu einer Lösung gekommen?
Es geht um die Kollisions-Erkennung der Ecken(Punkte) einer rechteckigen Box.

Die Box hat 9 Punkte (siehe Anhang) die alle auf true/false gechecked werden sollen ob das Tile walkable ist oder nicht?
Was sich fürs erste leicht anhört, ist aber nicht so einfach.

Also, der Hero kann sich horizontal, vertikal, nach oben und nach unten bewegen. Wenn aber zB. die unteren Punkte "bl" und "bc" beide auf false sind oder "bc" und "br" false, soll der Hero stehen bzw. sich nicht mehr weiter bewegen (im Falle das er gerade fliegt!)

Ich hab nun folgenden Code:
PHP-Code:
var A0:Array=[[ 1111111111],
              [ 
1111111111],
              [ 
1111111111],
              [ 
1111111111],
              [ 
1111111111],
              [ 
1111111111],
              [ 
1121111111],
              [ 
1111111111],
              [ 
1111111111],
              [ 
2222222222]]

var 
tw=24;var th=24;
//Level aufbauen
var Tile:Object=new Object();
Tile.Name=[];
Tile.Walkable=[];
for(var 
i=0;i<A0.lengthi++){
  for(var 
j=0;j<A0[i].lengthj++){
  var 
tiles=String(j)+String(i);
  
Board.attachMovie("Tile",tiles,Board.getNextHighestDepth());
  
Board[tiles]._x i*tw
  Board
[tiles]._y j*th 
  Board
[tiles].gotoAndStop(A0[j][i])
  switch(
A0[j][i]){
      case 
1:
      
Tile.Name["_"+i+"_"+j]="free";
      
Tile.Walkable["_"+i+"_"+j]=true;break;
      case 
2:
      
Tile.Name["_"+i+"_"+j]="wall";
      
Tile.Walkable["_"+i+"_"+j]=false;break;
  } 
trace(Tile.Walkable["_"+i+"_"+j] )
 }
}
//Hero aufbauen
var Hero:Object=new Object();
Hero.X=2;
Hero.Y=4;
Hero.Action="falle";
Hero.Speed=5;
Board.attachMovie("Hero","Ekerhart",Board.getNextHighestDepth());
var 
offsettw/2;
Board.Ekerhart._x Hero.X*tw+offset;
Board.Ekerhart._y Hero.Y*th+offset;
gravity=3;
jumpspeed=-12;

this.onEnterFrame=function(){ getKeys();}

//get Keys
function getKeys(){


 if(
Key.isDown(Key.LEFT)){
  
 if(
getCorners(Board.Ekerhart._x,Board.Ekerhart._y,Hero.Speed,"left"))
  
Board.Ekerhart._x-=Hero.Speed
 
}
 
 if(
Key.isDown(Key.RIGHT)){
 
  if(
getCorners(Board.Ekerhart._x,Board.Ekerhart._y,Hero.Speed,"right"))
  
Board.Ekerhart._x+=Hero.Speed
 
}

 if(
Key.isDown(Key.UP)){
  
  if(
getCorners(Board.Ekerhart._x,Board.Ekerhart._y,Hero.Speed,"up"))
  
Board.Ekerhart._y-=Hero.Speed
 
}
 
 if(
Key.isDown(Key.DOWN)){
 
  if(
getCorners(Board.Ekerhart._x,Board.Ekerhart._y,Hero.Speed,"down"))
  
Board.Ekerhart._y+=Hero.Speed
 
}

}

//Get Corners
function getCorners(X,Y,speed,dir):Boolean{
 
Hero.Action="";
 var 
wo=24/2
 var 
ho=24/2
 
wo+=speed
 
ho+=speed;
 
   var 
tl Tile.Walkable["_"+getX(X-wo)+"_"+getY(Y-ho)];//top left
   
var bl Tile.Walkable["_"+getX(X-wo)+"_"+getY(Y+ho)];//bottom right
   
var tr Tile.Walkable["_"+getX(X+wo)+"_"+getY(Y-ho)];//top right
   
var br Tile.Walkable["_"+getX(X+wo)+"_"+getY(Y+ho)];//bottom right

   
var ct Tile.Walkable["_"+getX(X)+"_"+getY(Y-ho)];//center top  
   
var cr Tile.Walkable["_"+getX(X+wo)+"_"+getY(Y)];//center right
   
var cl Tile.Walkable["_"+getX(X-wo)+"_"+getY(Y)];//center left
   
var cb Tile.Walkable["_"+getX(X)+"_"+getY(Y+ho)];// center bottom
  
   
var ce Tile.Walkable["_"+getX(X)+"_"+getY(Y)];//center
   
 
if(tl ==undefined)tl=false;if(tr ==undefined)tr=false;
 if(
bl ==undefined)bl=false;if(br ==undefined)br=false;
 if(
cl ==undefined)cl=false;if(cr ==undefined)cr=false;
 if(
cb ==undefined)cb=false;if(ct ==undefined)ct=false;
 
 
MCtl.gotoAndStop(tl);MCtr.gotoAndStop(tr);
 
MCbl.gotoAndStop(bl);MCbr.gotoAndStop(br);
 
MCct.gotoAndStop(ct);MCcr.gotoAndStop(cr); 
 
MCcl.gotoAndStop(cl);MCcb.gotoAndStop(cb);   
 
MCce.gotoAndStop(ce);
 
 switch(
dir){
    case 
"left"
     var 
Tilename Tile.Name["_"+getX(X-wo)+"_"+getY(Y)];
     break;
    case 
"right":
     var 
Tilename Tile.Name["_"+getX(X+wo)+"_"+getY(Y)];
     break;
    case 
"up":
     var 
Tilename Tile.Name["_"+getX(X)+"_"+getY(Y-ho)];
     break;
     case 
"down":
     var 
Tilename Tile.Name["_"+getX(X)+"_"+getY(Y+ho)];
     break;
  }
 
 

 switch(
Tilename){
     case 
"free":
          if( 
cb and bl){
            
Hero.Action="fall";
            var 
walkable=true;
             
          }      
          if( 
cb and br){
            
Hero.Action="fall";
            var 
walkable=true;
            
          }      
          
          if(!
cb and !bl){
                
Hero.Action="stand";
             var 
walkable=false;
            
          }
       break;
     
     case 
"wall":break;
     case 
"platform":break;
     case 
"brick":break; 
     }
     
 
//Aktuell
 
TBX.text=getX(X);TBY.text=getY(Y);
 
TBx.text=Board.Ekerhart._x;TBy.text=Board.Ekerhart._y;
 
TBAction.t.text=Hero.Action;
 
 return 
walkable;
 

 }

function 
getX(X:Number):Number{ return Math.floor(X/tw);}
function 
getY(Y:Number):Number{ return Math.floor(Y/th);} 
Mein Hauptproblem ist die "getCorners" Funktion, wo ich die Punkte checke und true/false zuweise. Wenn die Figur jetzt zum stehen kommt, bleibt sie einfach kleben und bewegt sich nicht weiter?!.
Ich schleuse in die Funktion den speed, die dir=direction und die X,Y Koordinaten (in Pixel) rein.
Dabei check ich die Koordinaten für den nächsten Schritt, ob er getan werden kann, also zB. Hero._x+speed, Hero._y-speed ect.
Weiter check ich ob das Tile walkable ist oder nicht und wie das Tile heisst. anhand des Tilenamens sollen dann noch sonderfälle behandelt werden.


Ich hab 3 Symbole in der Bibliothek: Hero, Tile und Board.
Ihr braucht nur ein Tile(25x25px) bauen und das als "Tile" verknüpfen.
das Gleiche mit Hero.
Der Board MC dient nur als Behälter für die Tiles!.

Falls jemnd mag, schick ich auch die .fla, dachte mir aber bzgl. des doch nicht so langen Code, das hier eher zu posten und auch weil ich nun die CS3er Version hab, wo ich nicht weiss ob die schon vorhanden ist bzw. inwieweit kompatibel?
Angehängte Grafiken
Dateityp: png sample.png (8,0 KB, 18x aufgerufen)
__________________
Say no to Internet Explorer 6!
Circushund ist offline   Mit Zitat antworten
Alt 17-09-2007, 18:15   #2 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Zitat:
Zitat von Circushund Beitrag anzeigen
Mein Hauptproblem ist die "getCorners" Funktion, wo ich die Punkte checke und true/false zuweise. Wenn die Figur jetzt zum stehen kommt, bleibt sie einfach kleben und bewegt sich nicht weiter?!.
Ich bin jetzt nicht so weit in Deine Programmierung eingestiegen,
aber wo setzt Du die Figur denn hin, wenn bei einer Ecke ein false
entsteht? Wird sie dann wo anders hin gesetzt (_x/_y) oder führst
Du den Schritt einfach nicht aus?

Und warum gibt es den neunten Punkt in der Mitte?

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 17-09-2007, 18:30   #3 (permalink)
Raven-Kid
 
Benutzerbild von [RK]
 
Registriert seit: Feb 2006
Beiträge: 350
Wenn alles Tile basierend ist,... dann gibts auch andere Möglichkeiten, ohne Hit-Test. Im Array nachsehn ob das Tile das unter/neben/über dem Player ist walkable ist oder nicht, ist weit aus schneller als wenn du 9 HitTests onEnterFrame durchführst.
[RK] ist offline   Mit Zitat antworten
Alt 17-09-2007, 18:41   #4 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Zitat:
Zitat von [RK] Beitrag anzeigen
… als wenn du 9 HitTests onEnterFrame durchführst.
Hier sind doch gar keine hitTests im Skript, oder?

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 17-09-2007, 19:10   #5 (permalink)
Raven-Kid
 
Benutzerbild von [RK]
 
Registriert seit: Feb 2006
Beiträge: 350
hoppla,... und ich hab mir fix eingebildet etwas von hitTest gelesen zu haben. Vll einfach nur weil es das nächste war was mir bei "Dabei check ich die Koordinaten für den nächsten Schritt, ob er getan werden kann, also zB. Hero._x+speed, Hero._y-speed ect." eingefallen ist ... xD
[RK] ist offline   Mit Zitat antworten
Alt 18-09-2007, 05:33   #6 (permalink)
wau
 
Benutzerbild von Circushund
 
Registriert seit: Jan 2006
Ort: Hamburch
Beiträge: 404
Hi gaspode,
Zitat:
Ich bin jetzt nicht so weit in Deine Programmierung eingestiegen,
aber wo setzt Du die Figur denn hin, wenn bei einer Ecke ein false
entsteht?
Wenn bei einer Ecke ein False entsteht, berührt die Figur (links,rechts oben oder unten) eine Mauer!
Der neunte Punkt in der Mitte ist einfach das Zentrum, du hast recht, momentan brauch ich den noch nicht, kann damit aber checken(evtl. für zukünftige Sachen) auf welchen Tile sich die Figur befindet.


@[RK] nope, da ist kein hitTest im Code, obwohl ich es an andere Stelle(nicht in diesem Code aber woanders) schon auch mal benutze. Die Grundideen für diese Kollisionserkennung hab ich aus dem Tutorial"Tile-Based-Games" von Tonypa

..Aber das Ganze ist noch ein bisschen komplizierter als man annimmt .

Ich hab mal eine .fla hochgeladen (Flash8)
http://d.wienand.de/Expo/Boxtest.zip

..die Figur soll nemlich durch die Platformen (gelb/schwarz gestreift) durchspringen/-gehen ABER auf ihnen landen können, wärend sie bei einer Mauer gänzlich davor,dadrüber oder dadrunter stehnbleiben soll (..und nicht wie bei mir reinlaufen?!)

Die Sache ist die, und da wirds kompliziert, das die Figur sich bei unterschiedlichen Tiles, unterschiedlich verhalten soll.
Bei einer Platform zB. steht die Figur SO LANGE, bis :
Code:
if(!cb and !bl or !br)
..ansonsten fällt die Figur.

Weitere Bugs der Boxtest.fla:

1) die Figur rutscht manchmal in die Mauer rein, beim links und rechts gehen, aber auch meim springen.

2) man kann links/rechts nicht durch Platform gehen.

3) wenn man direkt unterhalb einer Platform steht und springt, springt die Figur zu hoch und landet auf der Platform?


..Wie ich schon in vorigen Thread geschrieben ab, hätte ich echt Bock sowas mal mit jemand anderen zusammen zu Programmieren. Dh. ihr würdet die Engine für die Tiles, das Level-Management, Enemys ect Klassen bauen und ich kümmer mich dann um die Grafik. Zusammen könnte man dann evtl. so ein Mario-Jump'n Run kind of game bauen.
Ich bin via ICQ, Teamspeak, Skype usw. erreichbar, schreibt mir einfach ein PM oder Mail ect..
__________________
Say no to Internet Explorer 6!

Geändert von Circushund (18-09-2007 um 05:42 Uhr)
Circushund ist offline   Mit Zitat antworten
Alt 18-09-2007, 12:10   #7 (permalink)
;-)
 
Registriert seit: Jun 2007
Beiträge: 187
Zitat:
..die Figur soll nemlich durch die Platformen (gelb/schwarz gestreift) durchspringen/-gehen ABER auf ihnen landen können, wärend sie bei einer Mauer gänzlich davor,dadrüber oder dadrunter stehnbleiben soll (..und nicht wie bei mir reinlaufen?!)
bei Tonypa gibts dazu auch ein Beispiel...
__________________
Flash Webdesign
Quirkst du noch, oder validierst du schon?
abecker 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:19 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele