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

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

21

07.01.2014, 18:08

Sorry, wenn ich mich dazwischendränge ... aber kennt sich keiner mit meinem Problem aus???

Zitat

Meine Fehler bleiben aber bestehen. Der Else-Block wird weiterhin nicht ausgeführt und ich kann nicht z.B. 32*32 Chunks anlegen. Es geht im Augenblick nur 1*2 und wenn ich Glück hab auch mal 2*2.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

22

07.01.2014, 18:18

@CeDoMain, kannst ggf die relevanten Teile deines Codes posten oder sind die viel zu lang? ggf gucken dann auch mehr leute drüber als wenn sie dich erst anschreiben müssen ;)

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

23

07.01.2014, 18:37

@Mr.Lowbob: Also wenn ihr Spaß dran habt...

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
#include "Section.h"

inline int BlockWorld_Section::getBlockIndex(int x, int y, int z)
{
    if(x >= Blocks_X) x = Blocks_X - 1;
    if(y >= Blocks_Y) y = Blocks_Y - 1;
    if(z >= Blocks_Z) z = Blocks_Z - 1;
    if(x < 0) x = 0;
    if(y < 0) y = 0;
    if(z < 0) z = 0;
    return x + y * Blocks_X + z * Blocks_X * Blocks_Y;
}
inline bool BlockWorld_Section::RandBlock(int x, int y, int z, int s)
{
    return
        (x >= Blocks_X && s == 4) || //Links
        (y >= Blocks_Y && s == 0) || //Oben
        (z >= Blocks_Z && s == 2) || //Hinten
        (x < 0 && s == 5) || //Rechts
        (y < 0 && s == 1) || //Unten
        (z < 0 && s == 3);   //Vorne
}
BlockWorld_Section::BlockWorld_Section()
{
    Anzahl_Vertices = Blocks_X * Blocks_Y * Blocks_Z * 5;
    Anzahl_Indices = Blocks_X * Blocks_Y * Blocks_Z * 5;
    Block = new BlockWorld_Block[Blocks_X * Blocks_Y * Blocks_Z];
    Section_Empty = false;
}
BlockWorld_Section::~BlockWorld_Section()
{
    delete[] Block;
}
tbResult BlockWorld_Section::Init()
{
    globalTime = 0;
    tbDirect3D& D3D = tbDirect3D::Instance();

    BlockVertexBuffer.Init(2 * sizeof(BlockVertex), sizeof(BlockVertex), BlockVertex::VF, D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, D3DPOOL_DEFAULT);
    BlockIndexBuffer.Init(2 * sizeof(WORD), sizeof(WORD), D3DFMT_INDEX16);

    Section_Empty == false;
    int i = 0;
    
    for(int x = 0; x < Blocks_X; x++)
    {
        for(int y = 0; y < Blocks_Y; y++)
        {
            for(int z = 0; z < Blocks_Z; z++)
            {
                if(y + SectionPosY < 128) i = tbIntRandom(0, 10000);
                if(y + SectionPosY == 128) i = tbIntRandom(0, 10);
                if(y + SectionPosY > 128) i = 0;

                if(i == 0)
                {
                    Block[getBlockIndex(x, y, z)].ID = 0;
                }
                else
                {
                    Block[getBlockIndex(x, y, z)].ID = 2;
                }
            }
        }
    }

    return TB_OK;
}
tbResult BlockWorld_Section::Exit()
{
    BlockVertexBuffer.Exit();
    BlockIndexBuffer.Exit();

    return TB_OK;
}
tbResult BlockWorld_Section::Move(float Time)
{
    globalTime += Time;
    return TB_OK;
}
tbResult BlockWorld_Section::Render(float Time)
{
    if(!Section_Empty)
    {
        tbDirect3D& D3D = tbDirect3D::Instance();
    
        D3D->SetStreamSource(0, BlockVertexBuffer.GetVB(), 0, sizeof(BlockVertex));
        D3D->SetIndices(BlockIndexBuffer.GetIB());

        D3D->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, Anzahl_Vertices, 0, Anzahl_Vertices / 2);
    }

    return TB_OK;
}
tbResult BlockWorld_Section::Update()
{
    WORD Free_Vertex = 0;
    WORD Free_Index = 0;
    
    BlockVertex* TempVertex = new BlockVertex[Anzahl_Vertices];
    WORD* TempIndex = new WORD[Anzahl_Vertices];
    
    for(int x = 0; x < Blocks_X; x++)
    {
        for(int y = 0; y < Blocks_Y; y++)
        {
            for(int z = 0; z < Blocks_Z; z++)
            {
                if(Block[getBlockIndex(x, y, z)].ID != 0)
                {
                    if(Block[getBlockIndex(x, y + 1, z)].ID == 0 || RandBlock(x, y + 1, z, 0)) //Oben
                    {
                        TempVertex[Free_Vertex].Position = tbVector3(SectionPosX + x, SectionPosY + y + 1, SectionPosZ + z);
                        TempVertex[Free_Vertex + 1].Position = tbVector3(SectionPosX + x, SectionPosY + y + 1, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 2].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y + 1, SectionPosZ + z);
                        TempVertex[Free_Vertex + 3].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y + 1, SectionPosZ + z + 1);

                        TempIndex[Free_Index] = Free_Vertex;
                        TempIndex[Free_Index + 1] = Free_Vertex + 1;
                        TempIndex[Free_Index + 2] = Free_Vertex + 2;
                        TempIndex[Free_Index + 3] = Free_Vertex + 2;
                        TempIndex[Free_Index + 4] = Free_Vertex + 1;
                        TempIndex[Free_Index + 5] = Free_Vertex + 3;

                        TempVertex[Free_Vertex].Color = tbColor(255.0f, 255.0f, 0.0f);
                        TempVertex[Free_Vertex + 1].Color = tbColor(255.0f, 255.0f, 0.0f);
                        TempVertex[Free_Vertex + 2].Color = tbColor(255.0f, 255.0f, 0.0f);
                        TempVertex[Free_Vertex + 3].Color = tbColor(255.0f, 255.0f, 0.0f);
                        
                        Free_Vertex += 4;
                        Free_Index += 6;
                    }
                    if(Block[getBlockIndex(x, y - 1, z)].ID == 0 || RandBlock(x, y - 1, z, 1)) //Unten
                    {
                        TempVertex[Free_Vertex].Position = tbVector3(SectionPosX + x, SectionPosY + y, SectionPosZ + z);
                        TempVertex[Free_Vertex + 1].Position = tbVector3(SectionPosX + x, SectionPosY + y, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 2].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y, SectionPosZ + z);
                        TempVertex[Free_Vertex + 3].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y, SectionPosZ + z + 1);

                        TempIndex[Free_Index] = Free_Vertex;
                        TempIndex[Free_Index + 1] = Free_Vertex + 1;
                        TempIndex[Free_Index + 2] = Free_Vertex + 2;
                        TempIndex[Free_Index + 3] = Free_Vertex + 2;
                        TempIndex[Free_Index + 4] = Free_Vertex + 1;
                        TempIndex[Free_Index + 5] = Free_Vertex + 3;

                        TempVertex[Free_Vertex].Color = tbColor(0.0f, 255.0f, 255.0f);
                        TempVertex[Free_Vertex + 1].Color = tbColor(0.0f, 255.0f, 255.0f);
                        TempVertex[Free_Vertex + 2].Color = tbColor(0.0f, 255.0f, 255.0f);
                        TempVertex[Free_Vertex + 3].Color = tbColor(0.0f, 255.0f, 255.0f);
                        
                        Free_Vertex += 4;
                        Free_Index += 6;
                    }
                    if(Block[getBlockIndex(x, y, z + 1)].ID == 0 || RandBlock(x, y, z + 1, 2)) //Hinten
                    {
                        TempVertex[Free_Vertex].Position = tbVector3(SectionPosX + x, SectionPosY + y, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 1].Position = tbVector3(SectionPosX + x, SectionPosY + y + 1, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 2].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 3].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y + 1, SectionPosZ + z + 1);

                        TempIndex[Free_Index] = Free_Vertex;
                        TempIndex[Free_Index + 1] = Free_Vertex + 1;
                        TempIndex[Free_Index + 2] = Free_Vertex + 2;
                        TempIndex[Free_Index + 3] = Free_Vertex + 2;
                        TempIndex[Free_Index + 4] = Free_Vertex + 1;
                        TempIndex[Free_Index + 5] = Free_Vertex + 3;

                        TempVertex[Free_Vertex].Color = tbColor(255.0f, 0.0f, 0.0f);
                        TempVertex[Free_Vertex + 1].Color = tbColor(255.0f, 0.0f, 0.0f);
                        TempVertex[Free_Vertex + 2].Color = tbColor(255.0f, 0.0f, 0.0f);
                        TempVertex[Free_Vertex + 3].Color = tbColor(255.0f, 0.0f, 0.0f);
                        
                        Free_Vertex += 4;
                        Free_Index += 6;
                    }
                    if(Block[getBlockIndex(x, y, z - 1)].ID == 0 || RandBlock(x, y, z - 1, 3)) //Vorne
                    {
                        TempVertex[Free_Vertex].Position = tbVector3(SectionPosX + x, SectionPosY + y, SectionPosZ + z);
                        TempVertex[Free_Vertex + 1].Position = tbVector3(SectionPosX + x, SectionPosY + y + 1, SectionPosZ + z);
                        TempVertex[Free_Vertex + 2].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y, SectionPosZ + z);
                        TempVertex[Free_Vertex + 3].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y + 1, SectionPosZ + z);

                        TempIndex[Free_Index] = Free_Vertex;
                        TempIndex[Free_Index + 1] = Free_Vertex + 1;
                        TempIndex[Free_Index + 2] = Free_Vertex + 2;
                        TempIndex[Free_Index + 3] = Free_Vertex + 2;
                        TempIndex[Free_Index + 4] = Free_Vertex + 1;
                        TempIndex[Free_Index + 5] = Free_Vertex + 3;

                        TempVertex[Free_Vertex].Color = tbColor(255.0f, 255.0f, 255.0f);
                        TempVertex[Free_Vertex + 1].Color = tbColor(255.0f, 255.0f, 255.0f);
                        TempVertex[Free_Vertex + 2].Color = tbColor(255.0f, 255.0f, 255.0f);
                        TempVertex[Free_Vertex + 3].Color = tbColor(255.0f, 255.0f, 255.0f);
                        
                        Free_Vertex += 4;
                        Free_Index += 6;
                    }
                    if(Block[getBlockIndex(x + 1, y, z)].ID == 0 || RandBlock(x + 1, y, z, 4)) //Links
                    {
                        TempVertex[Free_Vertex].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y, SectionPosZ + z);
                        TempVertex[Free_Vertex + 1].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y + 1, SectionPosZ + z);
                        TempVertex[Free_Vertex + 2].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 3].Position = tbVector3(SectionPosX + x + 1, SectionPosY + y + 1, SectionPosZ + z + 1);

                        TempIndex[Free_Index] = Free_Vertex;
                        TempIndex[Free_Index + 1] = Free_Vertex + 1;
                        TempIndex[Free_Index + 2] = Free_Vertex + 2;
                        TempIndex[Free_Index + 3] = Free_Vertex + 2;
                        TempIndex[Free_Index + 4] = Free_Vertex + 1;
                        TempIndex[Free_Index + 5] = Free_Vertex + 3;

                        TempVertex[Free_Vertex].Color = tbColor(255.0f, 0.0f, 255.0f);
                        TempVertex[Free_Vertex + 1].Color = tbColor(255.0f, 0.0f, 255.0f);
                        TempVertex[Free_Vertex + 2].Color = tbColor(255.0f, 0.0f, 255.0f);
                        TempVertex[Free_Vertex + 3].Color = tbColor(255.0f, 0.0f, 255.0f);
                        
                        Free_Vertex += 4;
                        Free_Index += 6;
                    }
                    if(Block[getBlockIndex(x - 1, y, z)].ID == 0 || RandBlock(x - 1, y, z, 5)) //Rechts
                    {
                        TempVertex[Free_Vertex].Position = tbVector3(SectionPosX + x, SectionPosY + y, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 1].Position = tbVector3(SectionPosX + x, SectionPosY + y + 1, SectionPosZ + z + 1);
                        TempVertex[Free_Vertex + 2].Position = tbVector3(SectionPosX + x, SectionPosY + y, SectionPosZ + z);
                        TempVertex[Free_Vertex + 3].Position = tbVector3(SectionPosX + x, SectionPosY + y + 1, SectionPosZ + z);

                        TempIndex[Free_Index] = Free_Vertex;
                        TempIndex[Free_Index + 1] = Free_Vertex + 1;
                        TempIndex[Free_Index + 2] = Free_Vertex + 2;
                        TempIndex[Free_Index + 3] = Free_Vertex + 2;
                        TempIndex[Free_Index + 4] = Free_Vertex + 1;
                        TempIndex[Free_Index + 5] = Free_Vertex + 3;

                        TempVertex[Free_Vertex].Color = tbColor(0.0f, 0.0f, 255.0f);
                        TempVertex[Free_Vertex + 1].Color = tbColor(0.0f, 0.0f, 255.0f);
                        TempVertex[Free_Vertex + 2].Color = tbColor(0.0f, 0.0f, 255.0f);
                        TempVertex[Free_Vertex + 3].Color = tbColor(0.0f, 0.0f, 255.0f);
                        
                        Free_Vertex += 4;
                        Free_Index += 6;
                    }
                }
            }
        }
    }

    if(Free_Vertex == 0 || Free_Index == 0)
    {
        Section_Empty == true;
    }
    else
    {
        BlockVertexBuffer.SetSize(Free_Vertex * sizeof(BlockVertex));
        BlockIndexBuffer.SetSize(Free_Index * sizeof(WORD));
        BlockVertexBuffer.SetVertices(0, Free_Vertex - 1, TempVertex);
        BlockIndexBuffer.SetIndices(0, Free_Index - 1, TempIndex);

        BlockVertexBuffer.Update();
        BlockIndexBuffer.Update();

        Section_Empty == false;
    }

    delete[] TempVertex;
    delete[] TempIndex;

    return TB_OK;
}


Das ist halt so ne Sache, ob das jetzt jemand versteht...

Also der Fehler tritt in der Update-Methode ganz unten auf. Ist der einzige ifelse-Block. Da wird der else Block nicht ausgeführt, trotz if-Bedingungfalse.

Zu den Umgebenden Klassen:
Es gibt die Game Klasse, die 1*2 Chunks als Member hat. Diese haben dann in Y-Richtung 16 Sections. Und deren .cpp Datei seht ihr hier. Block ist eine Klasse mit einem Member ID, wenn 0 heißt dass LuftBlock und wenn 2 Grasblock (like Minecraft). Ich verwende Davids TriBase-Engine. Jede Klasse außer Block hat eine Render, Move, Init und Exit Methode. Die gegenseitig aufgerufen werden. z.B. Game->Render ruft alle Chunk->Render Methoden auf ... usw.

Ich hoffe das war verständlich. Ich wäre bereit den Code irgendwo hochzuladen - nur wo?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (07.01.2014, 19:33)


24

07.01.2014, 22:50

Hast du denn schonmal den Debugger bemüht? Setzt doch einmal einen Breakpoint und step Zeile für Zeile durch. Dann findest du den Fehler ruck zuck.

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

25

08.01.2014, 07:14

So jetzt muss ich aber doch noch einmal eine Frage einwerfen die mir noch nicht ganz klar ist. Ich erstelle jetzt für jede Einheit eine Klasse und verschachtel die dann in eine Klasse in dem Feldinfos gespeichert werden oder? Wie erreiche ich es nun das ich bei einem Mausklick, welcher ja jeden x und y wert erhalten kann, genau ein Feld angesprochen wird? Es ist ja so das ich für z.B. (1,1),(1,2)(1,3) und (2,1)(2,3)(3,1)(3,2)(3,3) sozusagen einen Button haben möchte der bestimmte Werte haben soll. Für einen einzelnen Punkt ist mir das logisch aber so müsste ich ja jedesmal prüfen zu welchem Feld eine Koordinate gehört ala if(x< wert < x2) then... Oder bin ich da jetzt immernoch falsch?

Hat jemand mal ein Beispiel für so ein einfaches Programm wo ich mal den Quelltext durcharbeiten kann? ?(
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

26

08.01.2014, 13:00

Hast du denn schonmal den Debugger bemüht? Setzt doch einmal einen Breakpoint und step Zeile für Zeile durch.

Auf die Idee bin ich auch gekommen. Noch viel früher sogar, weil bei leeren Chunks trotzdem gerendert wurde. Das hab ich mit dem Debugger erst herausgefunden und bin dann Stück für Stück zurückgegangen, bis ich an der Stelle mit der if-else Struktur gelandet bin. Da war ich dann verwirrt, weil die else-Klammer trotz falscher Bedingung nicht ausgeführt wurde. Dann hab ich das komplette Programm nach Klammerfehlern durchgeschaut und auch mal einen "Profi" drüberschauen lassen, doch keinen Grund zum Fehler gefunden. Dann hab ich ins Forum geschrieben, als ich Copax's Thread gelesen hab.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

27

08.01.2014, 13:42

@CeDoMain: Bist du dir sicher, dass du Zeile 42, 250 und 262 so haben möchtest?
:love: := Go;

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

28

08.01.2014, 16:11

Ey geiler Typ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Was ist mir denn da passiert?!? :D Werd sofort probieren ob es jetzt geht.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

29

08.01.2014, 16:12

@ Copax - deine Felder haben ja ne feste Größe - direkt prüfen ist übertrieben - du kannst die ja ausrechnen - bspw: deine felder sind 20x20 - ein X wert von 75 gehört zum Feld nummer 4 in der jeweiligen Reihe - wenn du 75 / 20 teilst hast du 3 - Informatiker zählen von 0 an - also 0.. 1... 2... 3... is das 4te feld - tadaa fertig. analog dazu machst das dann mit den Y koordinaten sprich du teilst den Koordinaten-Wert deiner Maus durch die Feldgröße. und bekommst damit die Feld-Koordinate raus.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

30

08.01.2014, 18:46

Danke für die Bemerkung, ich habe alle doppelten Gleichs durch einfache ersetzt (natürlich nicht bei den Vergleichen).

Leider bekomme ich jetzt Bad_Alloc Fehler. :( Liegt das an der 32bit Ausführung? Wie ändera ich das?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige