PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kollisionserkennung


Alfred
21.08.2002, 12:56
kann mir jemand erklären was ich falsch mache bei meiner kollisionserkennung ?

die objekte kolliedieren nicht nur mit anderen objekten sondern auch mit sich selbst ...

(code angehängt)

hilfe ....:mauer:

mfg alfred


xOOn
21.08.2002, 13:23
also das muesste so funkten

x muss ein pointer von einem item im feld Items sein (damit ich den item selbst erkenne)
mit sich selbst kollidiern ist nicht so ganz ideal oder taeusche ich mich da :D

#include <vector>

using std::vector;

struct sItem
{
int x;
int y;
int h;
int w;
};

vector <sItem> Items

bool Kollision (sItem *x ,const vector <sItem> &Items)
{
register int x_min = x->x;
register int x_max = x->x + x->w;
register int y_min = x->y;
register int y_max = x->y + x->h;

for (register int i = 0; i < Items.size (); i++)
{
if (x == &Items[i]) // ich bin das objekt ? zuvor muss x = &Items[akitem] damit die pointer identisch sind
continue;
if (Items[i].x + Items[i].w >= x_min && Items[i].x <= x_max
&& Items[i].y + Items[i].h >= y_min && Items[i].y <= y_max)
return true;
}
return false;
}

sag bescheid wenn du was nicht verstehst fragen hast oder das teil nicht funktionieren sollte

Alfred
21.08.2002, 13:49
hmm schön ...:D :D

leider bin ich in c++ nich so bewandert und versteh dein sample nich so ganz.
wie ich es verwenden kann ist mir klar(glaub ich), nur ich würde es auch gerne verstehen.

hast du vieleicht ein sample in c ?

mfg alfred

xOOn
21.08.2002, 14:12
also das einzige was wirklich c++ ist ist der vector <> das ist ein dynamisches feld, kanns es aber auch in ein staatisches umwandeln die kernfunktion ist sowieso

register int x_min = x->x;
register int x_max = x->x + x->w;
register int y_min = x->y;
register int y_max = x->y + x->h;

if (Items[i].x + Items[i].w >= x_min && Items[i].x <= x_max
&& Items[i].y + Items[i].h >= y_min && Items[i].y <= y_max)
return true;

und das muesste klar sein!!

ist die if mit den koordinaten vom aktuellen objekt erfuellt so haben wir ne kollision

schreibe bitte genauer was dir noch unklar ist:) :)

Alfred
21.08.2002, 14:19
ich kenn den register befehl nich..
ich hab das ganze so gelöst :
if(
(
(
((obj[spr1].x)+(obj[spr1].zx)+(obj[spr1].zxdist) > (obj[spr2].x)+(obj[spr2].zx)-(obj[spr2].zxdist))&&
((obj[spr2].x)+(obj[spr2].zx)+(obj[spr2].zxdist) > (obj[spr1].x)+(obj[spr1].zx)-(obj[spr1].zxdist))&&

((obj[spr2].y)+(obj[spr1].zy)+(obj[spr1].zydist) > (obj[spr2].y)+(obj[spr2].zy)-(obj[spr2].zydist))&&
((obj[spr2].y)+(obj[spr2].zy)+(obj[spr2].zydist) > (obj[spr1].y)+(obj[spr1].zy)-(obj[spr1].zydist))
)
)
)


{
int a=0;
swap(&obj[spr2].yd,&obj[spr1].yd);swap(&obj[spr2].xd,&obj[spr1].xd);
}


ich weis nich inwieweit das dasselbe ist.
mein problem hat sich übrigens aufgelöst.
zwar nich optimal aber was solls es funtz.

was machst du mit dem befehl register ?
schreibst du damit direkt in das register ?

(meine komlette spielhauptschleife angehängt)

mfg alfred

WiTcHmAsTeR
21.08.2002, 14:21
Alfred :) dreh dich doch einfach mal um und frag mal die anderen :D

Also meine Kolli sieht so aus, ,und die funzt auch:
///////////////
// Kollision //
///////////////
int Kolli(int onr1, int onr2)
{
if(((obj[onr2].y+obj[onr2].zy+obj[onr2].zydist)
>=
(obj[onr1].y+obj[onr1].zy-obj[onr1].zydist))
&&
((obj[onr1].y+obj[onr1].zy+obj[onr1].zydist)
>=
(obj[onr2].y+obj[onr2].zy-obj[onr2].zydist))
&&
((obj[onr2].x+obj[onr2].zx+obj[onr2].zxdist)
>=
(obj[onr1].x+obj[onr1].zx-obj[onr1].zxdist))
&&
((obj[onr1].x+obj[onr1].zx+obj[onr1].zxdist)
>=
(obj[onr2].x+obj[onr2].zx-obj[onr2].zxdist))
&&
(obj[onr1].visible)&&(obj[onr2].visible))
{
return(1);
}
else
{
return(0);
}
}

Wenn du noch fragen hast, du weisst ja wo ich sitze *gg*

Alfred
21.08.2002, 14:23
das anhängen klappt wohl noch nich soganz ,
hier ein neuer versuch.

ok ich lass es bleiben...

@witchmaster
danke soweit war ich auch schon ;) ;)


trotzdem kapier ich den registerbefehl nich.

mfg alfred

Lord_Otter
21.08.2002, 17:12
Wieso soll das anhängen nicht klappen ?

Malte 2
21.08.2002, 20:41
Der register Befehl bei der Variablendefinition sagt dem Rechner, dass die Variable in einem speziellen Register des Prozessors angelegt werden soll. Diese Variablen arbeiten etwas schneller und sind damit zum Beispiel für Zähler gut geeignet.

Allerdings solltest du nicht zu oft register benutzen, da diese Register ein knappes Gut sind.

xOOn
22.08.2002, 08:36
register sind fixe variablen des prozessors und deshalb schneller als die anderen das bringt aber nur was wenn due die var oft brauchst zb in schleifen,

@Malte 2
das stimmt dass es wenige sind, es passiert aber auch nichts wenn du alle vars als register schreibst weil er die nur in den register ablegt wenn er noch welche frei hat!!!!

Alfred
22.08.2002, 09:04
im prinzip also wie eine assembler adressierung/programmierung?


mfg alfred

xOOn
23.08.2002, 13:19
ja sowas in der art/ du sagst dem compiler dass er es in einer gewissen schnelleren art nutzen soll

Malte 2
23.08.2002, 15:05
Wenn der Compiler eine integrierte Code-Optimierung hat, setzt er bei Variablen, die oft gebraucht werden (wenn er's feststellen kann) selber register. Ich gebe aber trotzdem bei solchen Zählen und so register immer explizit an.

Alfred
26.08.2002, 08:56
alles klar ,danke .


mfg alfred

(der complette code zum saugen auf meiner page)