Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.12.2004, 20:30

tetris :]

jo ich hab mich als anfänger mal an ein projekt gesetzt was zu schaffen is :]

mit davis engine im breakanoid-style will ich jetzt ein tetris game proggen mit allem drum und dran aber da sist erstmal egal

jedenfalls hab ich jetzt erstmal ein fundament zu erstellen heißt billiges intro billiges mainmenu und billiges game das halt nur die basisidee von tetris enthält.

allerdings bin ich mir net so sicher wie ich die abfrage machen soll ob ein block der noch drehbar is auf dem boden oder nem andern block landet...

ich hab mir das so gedacht dass man die blöcke in 8 reihen bewegen kann (heißt pro knopfruck springt der block ne reihe weiter) und das ganze level is in n array aufgeteilt [19][7]

dann hab ich mir halt gefacht ich setzte einfach alle felder in denen der teil eines blocks liegt im array auf belegt und dann kann ich ja prima abfragen wo der nächste block liegen bleibt...

der haken: es funzt net :o)

meine frage is eigentlich kann man das so überhaupt machen, welchen datentyp sollte das array haben (BOOL, int, etc) und wenn doch alles stimmen sollte dann poste ich mal den algorithmus weil ich hab auch schon mit dem debugger durchforstet aber ich weiß nicht wo der fehler liegt weil ein paar sachen einfach nullzeiger sind obwohl sie das nit sein können O_o

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

2

30.12.2004, 20:38

Re: tetris :]

Zitat von »"Sk!p"«

ich hab mir das so gedacht dass man die blöcke in 8 reihen bewegen kann (heißt pro knopfruck springt der block ne reihe weiter) und das ganze level is in n array aufgeteilt [19][7]


du meinst wohl spalten und nicht reihen, oder?

spontan würd ich es nicht mit nem array machen, sondern mir ne klasse für die blöcke erstellen, in welcher die position des jeweiligen blocks (reihe und spalte) gespeichert werden (die einzelnen "block-exemplare" könnte man in ner liste speichern). willst du nun wissen ob ein block "landet", gehst du einfach alle bklöcke durch und überprüfst es. ist dem so wird ein bool im objekt auf true gesetzt, welches markiert, dass er "fest sitzt".
zum rendern. entweder spendierst du jedem objekt seine rendermethode oder du gehst in deiner rendern funktion alle durch und fragst immer die position und den typ ab...

3

31.12.2004, 18:15

jo meinte spalten :]

und frage noch zu deiner methode: wenn man nen block jetzt dreht (und die haben ja die seltsamsten formen) dann kann es ja passieren dass ganz andere reihen und spalten besetzt werden als in der blockposition gespeichert is...wie macht man das dann?

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

4

31.12.2004, 19:28

beim drehen würde ich überprüfen, ob es ne kollision gibt (im gedrehtem zustand), wenn ja, dann gehts nicht -> kein drehen.
ist glaube ich normalerweise so, oder?

wie du überprüfst ob ne kollision vorliegt hängt davon ab, wie du die form deiner blöcke speicherst.
sagen wir deine blöcke sind max 4x4 felder groß und bestehen aus gleichgroßen grafiken (transparenz) und du speicherst die form deines blocks in der blockklasse in form eines bit-arrays (zweidimensional, 4x4) und willst testen, ob zwei blöcke kollidieren. als erstes verlgeichst du die positionen. wenn der abstand in reihen oder spalten >=4, dann können sie schonmal gar nicht kollidieren. ist dem nicht so, erstellst du dir ein temporäres 8x8 array und schreibst da deine beiden "form-arrays" der blöcke rein und wenn an einer stelle bereits ein TRUE (im sinne von belegt) steht und ein weiteres TRUE (vom 2. block) reingeschrieben werden soll, dann weißte, dass sie kollidieren....

5

01.01.2005, 20:51

nein ich meine was anderes...

angenommen die posi von dem block:
__
| |__
|__**|
**|_x|

liegt bei x...dann liegt sie wenn er gedreht is und auf dem boden liegt hier:
** ____
__|**__|
|_x__|

und wenn jetzt n block auf das obere rechte ende drauffallen würde was dann?


weiß auch nicht ob ich jetz alles 100% verstanden hab aber selbst wenns funzt müsste die array methode rechensparender sein...aber ich weiß auch in welcher zeiele der fehler liegt. ich poste einfach mal:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
tbResult CBlock::Move(float fTime)
{
    int i;
    
    //Wenn der Block auf dem Boden steht, abbrechen

    if(!m_bFall) return TB_OK;

    //Den fallenden Block fortbewegen

    if(WasButtonPressed(TB_KEY_RIGHT))    m_vPosition.x += 2.0f;
    if(WasButtonPressed(TB_KEY_LEFT))     m_vPosition.x -= 2.0f;

       //dem Block eine Spalte zuordnen 

        if(m_vPosition.x <  8.0f)    m_iRow = 7;
    if(m_vPosition.x <  6.0f)    m_iRow = 6;
    if(m_vPosition.x <  4.0f)    m_iRow = 5;
    if(m_vPosition.x <  2.0f)    m_iRow = 4;
    if(m_vPosition.x <  0.0f)    m_iRow = 3;
    if(m_vPosition.x < -2.0f)    m_iRow = 2;
    if(m_vPosition.x < -4.0f)    m_iRow = 1;
    if(m_vPosition.x < -6.0f)    m_iRow = 0;

    //Block in Grenzen weisen

    if(m_vPosition.x < -7.0f)   m_vPosition.x = -7.0f;
    if(m_vPosition.x >  7.0f)   m_vPosition.x =  7.0f;

        //freien Platz suchen   

        for(i = 0; i < 19; i++)
    {
        if(m_aiFree[m_iRow][i] != 12345)   break;
    }

        //auf Kontakt mit dem Boden prüfen 

        if(m_vPosition.z < i -12.0f) 
    {
        
        m_vPosition.z = i - 12.0f;
        m_aiFree[m_iRow][i] = 12345;
        m_bFall = FALSE;
        
        //Neuen Block erstellen

        m_pGame->CreateBlock(tbVector3(-1.0f, 0.25f, 50.0f), tbVector3(0.0f, 0.0f, -5.0f));
    }


ich kann diesen codeabschnitt net mehr sehen...ich hab den schon 24560mal debuggt 89376mal im kopf durchgegangen aber nach dem der erste block einen platz im array besetzt hat wird das feld auch wunderbar auf 12345 gesetzt aber beim nächsten block springt er nicht per break aus der for-schleife obwohl ers aber sollte O_o

6

02.01.2005, 20:35

ich hab mir das nochmal überlegt...im prinzip is deine version doch besser

nur das speichern der kollisionsmodelle weiß ich net wie ich das machen soll (nup halt :] )

ich hab auf anhieb an sowas wie in galactica gedacht aber das is wohl zu kompliziert

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

7

02.01.2005, 21:20

lol, dachte die ganze zeit du wolltest es nur in 2d machen. sry.
wenn du die blöcke allerdings nur in 2d bewegen willst (was ich mal stark annehem), dann ist obige methode doch mehr oder weniger anwendbar.
wo genau liegt dein problem beim speichern der kollisionsmodelle?

8

04.01.2005, 20:55

also ich hab jetzt ne methode mit der es eigentlich ganz gut gehen sollte:

ich hab nen block 1x1 einheit

den setz ich dann per strings (wie david seine breakanoid-level erstellt hat) in versch. formen und die drehe ich dann einfach um das zentrum etc.

mein einziges prob is ne fehlermeldung à la

xxx bereits in xxx.obj definiert und ehrlich gesacht weiß ich net was das heißen soll O_o

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

9

04.01.2005, 22:46

da scheinst du irgendetwas doppelt definiert zu haben... vielleicht bindest du ne headerdatei doppelt ein??

10

05.01.2005, 11:08

jo das denk ich mir auch aber die verschwinden wenn ich irgendwas banales ändere O_o

Werbeanzeige