JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Auch Kollision :)

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 14.01.2004, 20:11    Titel: Auch Kollision :) Antworten mit Zitat

Jo,
ich hab auch ein Kollisionsproblem und zwar wollt ich das folgendermaßen machen:

Code:

int map[99][99];

if (bKeyboard[DIK_LEFT]) { if (x > 0 && collision(4) == false) { x -= 1; } }
if (bKeyboard[DIK_RIGHT]) { if (collision(2) == false) { x += 1; } }   

bool collision(int moving)
{
   //<---4   2--->//

   switch (moving)
   {
   case 2:
      if (map[(y/50)][(x/50)+2] == 1 || map[(y/50)-1][(x/50)+2] == 1) { return true; }
      break;
   case 4:
      if (map[(y/50)][(x/50)-2 || map[(y/50)-1][(x/50)-2] == 1] == 1) { return true; }
      break;
   }

   return false;
}


das funzoniert auch noch alles.
Nun hab ich noch ne ganz einfache Schwerkraft:

Code:

void falling()
{
if (map[(y/50)+2][(x/50)] == 0) { y += 1; }
}


damit fählt der auch wunderbar andauernt auf seine Füße (+2 deswegen
weil die Playerfigur 2 Felder groß ist)

was nun mein Problem ist, ist eine gescheite Sprung Function.
Ich habe versucht eine zu Coden, allerdings springt der Spieler
entweder duch die Steine dann durch oder
man kann öfters die UP taste drücken so das er ins unendliche springt..

vieleicht kann mir jemand helfen..
Ich weiss Kollision mit BoundingBox ist sinvoller aber ich wollts
mal damit versuchen ..

kann mir vieleicht jemand helfen ?
_________________
"Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."

"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."

"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 14.01.2004, 20:34    Titel: Antworten mit Zitat

Wenn die Sprungtaste gedrückt wird tust du am besten 2 Dinge: a) Du stellst die Geschwindigkeit dementsprechend um und b) du setzt dir ein Flag, z.B. bool jumping auf true. Solange jumping gleich true ist darf die Sprungfunktion nicht aufgerufen werden.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 14.01.2004, 20:35    Titel: Antworten mit Zitat

Beim springen sollte überprüft werden ob sich die Figur auf gfestem Boden befindet und ob sie sich den Schädel an der decke eindellen kann:

Code:
#define SPRUNGHOEHE 2
int Gesprungen=SPRUNGHOEHE;

if (bKeyboard[DIK_UP])
{
   if (y > 0 && collision(1) == false && collision(3) == true)
   {
       y -= 1;
       Gesprungen=0;
   }
}

void falling()
{
   if (map[(y/50)+2][(x/50)] == 0)  //runter
   {
      y += Gesprungen >= SPRUNGHOEHE ? 1 : -1;
   }
   if (map[(y/50)-2][(x/50)] == 0) //hoch
   {
      y += Gesprungen >= SPRUNGHOEHE ? 1 : -1;
      Gesprungen += Gesprungen>=SPRUNGHOEHE ? 0 : 1;
   }

}


Den fallen algo kannst du ja mit dem Bewegungsalgo kombinieren und gleichzeitig prüfen ob sie etwas treffen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
kapuzineralex
Mini JLI'ler



Anmeldedatum: 07.01.2004
Beiträge: 8
Wohnort: München
Medaillen: Keine

BeitragVerfasst am: 15.01.2004, 06:41    Titel: Antworten mit Zitat

Hi,

um das ganze übersichtlicher und *realistischer* zu gestalten, würde ich der Spielfigur einfach Geschwindigkeiten/Beschleunigungen zuordnen.
Dadurch wirken die Bewegungen auch nicht so abgehackt und das ganze ist relativ simpel zu programmieren.

Zum Beispiel gibst Du folgende Variablen vor:

int iXPos, iYPos;
int iXAccel, iYAccel;
const int iMaxXAccel = 5; // Nur Beispielwerte
const int iMaxYAccel = 7;

// Initialisierung, z.B. am Anfang des Levels
void InitPlayer(int iStartX, int iStartY)
{
iXPos = iStartX,
iYPos = iStartY;

iXAccel = iYAccel = 0;
}

// Input
void KeyPressed(int iKeyCode)
{
switch (iKeyCode)
{
case KEY_RIGHT:
iXAccel += 1;
iXAccel = (iXAccel > iMaxXAccel) ? iMaxXAccel : iXAccel;
break;
case KEY_UP:
iYAccel += 1;
iYAccel = (iYAccel > iMaxYAccel) ? iMaxYAccel : iYAccel;
break;
// usw.
}
}

// Hauptschleife
void Hauptschleife(void)
{
BOOL bSpielZuEnde = FALSE;
while (!bSpielZuEnde)
{
iXPos += iXAccel;
iYPos += iYAccel;

if (iXAccel > 0)
iXAccel--;
else if (iXAccel < 0)
iXAccel++;

if (abs(iYAccel) > iMaxYAccel)
iYAccel--;

Kollisionserkennung(iXPos, iYPos); // z.B. mit dem Kopf gegen die Decke gedoppst
MaleSpielfigur(iXPos, iYPos);
}
}

So kannst Du meiner Meinung nach Springen/Fallen/Bewegen/Kollisionserkennung sauber und *einfach* verpacken.

Gruesse,

Alex
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 15.01.2004, 22:19    Titel: Antworten mit Zitat

irgendwie kann ich troz allem noch beim Springen durch die Steine springen Sad

aaaaaa ich bin zu doof dazu :/
kann mir das nicht jemand im icq erklären :
72316804
_________________
"Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."

"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."

"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 15.01.2004, 22:24    Titel: Antworten mit Zitat

Du kannst auch testen ob im nächsten Frame eine Kollision stattfinden wird und dementsprechend die Geschwindigkeit verringern... um ehrlich zu sein würde ich es aber mit RECTs machen, ist viel einfacher.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 15.01.2004, 22:38    Titel: Antworten mit Zitat

Der ansatz von kapuzineralex ist wirklich besser als deiner es sei denn du arbeitest wirklich nur mit einelnen Blöcken und daher ohne Zwischenstufen.

Doch würde ich kein absf nehmen zum überprüfen ob man den Höchstpunkt erreicht hat sondern ne sinus Funktion das macht das ne ganze Ecke realistischer.

Am besten noch ne AirControl Variable hinzufügen damit man gar nicht oder nur bedingt die Richtung in der Luft ändern kann.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
kapuzineralex
Mini JLI'ler



Anmeldedatum: 07.01.2004
Beiträge: 8
Wohnort: München
Medaillen: Keine

BeitragVerfasst am: 16.01.2004, 08:31    Titel: Antworten mit Zitat

Bei der Abs() Funktion habe ich auch einen Fehler gemacht. Beschleunigung nach oben findet ja eh nur statt, wenn der Spieler die entsprechende Sprung-Taste drückt und auch dann nur bis zum Wert iMaxYAccel.
Durch die Abs-Funktion weiter unten wollte ich erreichen, daß der Wert von iYAccel vor allem beim Herunterfallen immer schneller wird.
Allerdings muß noch eine weitere boolesche Variable eingeführt werden, denn die Y-Beschleunigung soll ja nur beim Springen/Fallen stattfinden.

Also:

if (bJumpingOrFalling)
{
if (abs(iYAccel) < iMaxYAccel)
iYAccel--;
}

Und natürlich muß es < und nicht ">" heißen bei abs()...

Grüße

Alex
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum