Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Igorr Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 24 Wohnort: Hamburg Medaillen: Keine
|
Verfasst am: 14.03.2004, 18:59 Titel: Input & Sprite |
|
|
Ehh Ja ich mal wieder....
Habe eine Frage habe, die Kapitel mit Input Manager und Audio Fertig, wollte eine Einfache bewegung machen, aber wie mache ich das das die Sprite Klasse und die Input Klasse mit einander Arbeite..
Beispiel:
//So wollte ich das Machen (Like Buch)
int Bewegung = Input.GetInput()
...
Sprite.Move(Bewegung)
...
Ehmm was muss ich machen damit die Klasse zusammen arbeiten..
Danke fuer Hilfe.. _________________
|
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 14.03.2004, 19:04 Titel: |
|
|
Wo genau liegt denn dein Problem? Was funktioniert an deinem Ansatz nicht?
du bekommst mit getInput() die Richtung zurück. Nun übergibst du die Richtung an dein Sprite mit sprite.move(bewegung). fertig.
Willst du wissen, wie die move()-Methode aussehen muss? Hier musst du je nach Bewegungsrichtung die Koordinaten des Sprites verändern.
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Igorr Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 24 Wohnort: Hamburg Medaillen: Keine
|
Verfasst am: 14.03.2004, 19:06 Titel: |
|
|
Hmm, wieso klappt das den nicht, muss ich den was Individuell verändern ind er Move Methode von der Sprite Klasse.. wenn nicht weiss ich echt nicht weiter.. aber ich verde das mal versuchen! _________________
|
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 14.03.2004, 19:07 Titel: |
|
|
na entweder du erstellst die ganz normal eine instanz der input klasse
...oder...
du machst die input klasse static, was gar keine schlechte idee ist, da es ja eh nur eine instanz geben muß/kann...dann kannst du so wie du es oben geschrieben hast von überall drauf zugreifen. |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 14.03.2004, 19:15 Titel: |
|
|
WAS genau klappt denn nicht? Gibt es Fehlermeldungen? Passiert etwas ungewolltest mit deinem Sprite? Wenn ja, WAS??? _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Igorr Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 24 Wohnort: Hamburg Medaillen: Keine
|
Verfasst am: 14.03.2004, 22:22 Titel: |
|
|
So ich habe mal geschaut was fuer ein Fehler kommt
Fehler:
\CDirect3D\Sprite MOVE\Main.cpp(87) : error C2664: 'Move' : Konvertierung des Parameters 1 von 'int' in 'enum DIRECTION' nicht moeglich
Der Fehler sagt mir einiges Doch wenn ich
void Draw(int Direction)
mache geht das nicht und das programm wird sofort beendet...
Also was muss ich machen, so dass das geht
int Bewegung = Input.GetInput();
Figur.Move(Bewegung);
Nur kurze erklärung und beschreibung danke!
Ich weiss aller Anfang ist schwer, besonder fuer mich _________________
|
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 15.03.2004, 02:37 Titel: |
|
|
o mann, poste mal die move funktion und deren aufruf...
oder versuch es besser zu erklären, ich werd daraus nicht schlau.. |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 15.03.2004, 08:50 Titel: |
|
|
Ich vermute mal, dir fehlt sowas in der Art:
Code: | enum DIRECTION {HOCH=1, RUNTER=2, LINKS=3, RECHTS=4 }; |
bin mir aber bei der Syntax nicht mehr sicher...
ABER GIBT UNS BITTE CODE!!!!!! _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Igorr Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 24 Wohnort: Hamburg Medaillen: Keine
|
Verfasst am: 15.03.2004, 18:41 Titel: |
|
|
Hier der Code!
Code: |
// Definition der Bewegungsrichtungen
enum DIRECTION { LEFT, RIGHT, UP, DOWN };
|
So das muss ich dem hier anpassen!
Code: |
int CInputManager::getKeyboardInput(void)
{
// alle Tasten der Tastatur
char buffer[256];
if(FAILED(m_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer)))
{
// die Tastatur wurde zwischenzeitlich
// durch eine andere Anwendung genutzt
// Kontrolle wiederholen
m_lpDIDevice->Acquire();
return 0;
}
// bestimmen welche Taste gedrückt wurde
// und Tastenkombination zurückgeben
int Keys = 0;
if(buffer[DIK_LEFT])
{
Keys += MOVE_LEFT;
}
else if(buffer[DIK_RIGHT])
{
Keys += MOVE_RIGHT;
}
if(buffer[DIK_UP])
{
Keys += MOVE_UP;
}
else if(buffer[DIK_DOWN])
{
Keys += MOVE_DOWN;
}
if(buffer[DIK_LCONTROL] || buffer[DIK_RCONTROL])
{
Keys += MOVE_FIRE;
}
return Keys;
}
|
Hier die MOVE:
Code: |
void CSprite::Move(DIRECTION dir)
{
// Bei der Bewegung werden die Bildschirmbegrenzungen beachtet
switch(dir)
{
case LEFT:
if(m_vPosition.x - m_Width / 2.0f> 0)
{
m_vPosition.x -= m_StepX;
}
break;
case RIGHT:
if(m_vPosition.x < SCR_WIDTH - m_Width / 2.0f)
{
m_vPosition.x += m_StepX;
}
break;
case UP:
if(m_vPosition.y - m_Height / 2.0f> 0)
{
m_vPosition.y -= m_StepY;
}
break;
case DOWN:
if(m_vPosition.y < SCR_HEIGHT - m_Height / 2.0f)
{
m_vPosition.y += m_StepY;
}
break;
}
}
|
So das war alles, jetzt muessen die beiden Klasse nur noch miteinander Abgestimmt werden.... _________________
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.03.2004, 19:32 Titel: |
|
|
Öhm, bist du sicher das du es nicht lieber nochmal selber versuchen möchtest ? So schwer sieht das nicht aus. Nehm dir mal ein zwei Tage Auszeit und dann schaust du noch mal auf diesen Code. Dann wirst du den Blick frei für neue Dinge haben und es hoffentlich alleine packen. _________________ "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 |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 15.03.2004, 20:15 Titel: |
|
|
ich denke auch, dass du das selber schaffen solltest...ich bring dich noch auf den richtigen weg:
als erstes ändere mal getInput()...problem hier ist, dass du bestimmte specifier anders definiert hast..also einfach austauschen.
zur move funktion...da schaust du was für nen datentyp getInput() zurückliefert und demnach mußt du den parameter definieren... |
|
Nach oben |
|
|
Igorr Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 24 Wohnort: Hamburg Medaillen: Keine
|
Verfasst am: 16.03.2004, 03:41 Titel: |
|
|
Hmm... ich denke ich habe die Lösung!!
Hoffe ich jedenfalls...
Also mein Lösungsvorschlag(LIKE Buch):
//In der Klasse
void Move(int Dir)
//In der CPP
void CSprite::Move(int Dir)
{
if(Dir & MOVE_LEFT)
{
m_vPosition.x -= m_StepX;
}
...
könnte das ungefähr so gehen! _________________
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 16.03.2004, 08:39 Titel: |
|
|
Sollte das nicht so sein:
Code: | void CSprite::Move(int Dir)
{
if(Dir == MOVE_LEFT)
{
m_vPosition.x -= m_StepX;
}
...
}
|
Kannst du sagen was MOVE_LEFT ist ? _________________ "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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.03.2004, 09:19 Titel: |
|
|
nene, das ist schon ok so. Der Methode Move wird das Ergebnis von getInput() übergeben. In getInput werden die einzelnen Aktionen addiert. Binär vorgestellt kann man sich das so vorstellen:
0000 (die erste Null steht für "Oben", die zweite für "links" etc...) DAnn muss man natürlich auch die Konstanten MOVE_LEFT etc... dementsprechend deklariert haben, dass nur Zweierpotenzen verwendet werden. Wenn sich das Objekt nun nach oben und links bewegen soll, wird so etwas übergeben:
1100
Wenn du nun diese Zahl binär mit der Konstanten UND-verknüpfst, erhältst du:
1100
0100
------
0100 > 0 --> Sprite nach links bewegen
anschließend dasselbe mit Oben und den anderen Richtungen:
1100
0010
-----
0000 = 0 --> keine Bewegung nach rechts (wenn rechts so definiert ist)
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Igorr Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 24 Wohnort: Hamburg Medaillen: Keine
|
Verfasst am: 16.03.2004, 09:51 Titel: |
|
|
Ich habe das jetzt so gemacht:
Code: |
// Bewegung des Sprite in Abhängigkeit der Direction
void CSprite::Move(int Direction)
{
int Framerate = m_ResManager->GetFramerate();
// Bewegung nach links oder rechts
if(Direction & MOVE_LEFT)
{
if(m_vPosition.x - m_Width / 2.0f> 0)
{
m_vPosition.x -= m_StepX;
}
}
else if(Direction & MOVE_RIGHT)
{
if(m_vPosition.x < SCR_WIDTH - m_Width / 2.0f)
{
m_vPosition.x += m_StepX;
}
}
// Bewegung nach oben oder unten
if(Direction & MOVE_UP)
{
if(m_vPosition.y - m_Height / 2.0f> 0)
{
m_vPosition.y -= m_StepY;
}
}
else if(Direction & MOVE_DOWN)
{
if(m_vPosition.y < SCR_HEIGHT - m_Height / 2.0f)
{
m_vPosition.y += m_StepY;
}
}
}
|
_________________
|
|
Nach oben |
|
|
|