Constants...?

I'm busy editing a DirectX code to create a game. I'm a beginner, so the source code may and will be messy, but that doesn't matter for now.

I'm fighting against something i think is really weird:

The code:
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
// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <time.h>
#include <d3d9.h>
#include <d3dx9.h>

// define the screen resolution and keyboard macros
#define SCREEN_WIDTH  640
#define SCREEN_HEIGHT 480
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

// global declarations
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPD3DXSPRITE d3dspt;    // the pointer to our Direct3D Sprite interface

// sprite declarations
LPDIRECT3DTEXTURE9 sprite[7];    // the pointer to the sprite

// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void initField(void);
void cleanD3D(void); // closes Direct3D and releases memory

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
[deleted to lack of space]


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = FALSE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;


    // create a device class using this information and the info from the d3dpp stuct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

    D3DXCreateSprite(d3ddev, &d3dspt);    // create the Direct3D Sprite object

	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\blue.png", &sprite[0]);
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\cyan.png", &sprite[1]);
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\green.png", &sprite[2]);
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\pink.png", &sprite[3]);
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\red.png", &sprite[4]);
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\yellow.png", &sprite[5]);
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\yellow.png", &sprite[6]);//METAL should be here!
	D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\back.png", &sprite[7]);

    return;
}

unsigned char Yoffset[2];//vertical offset. (pixels) 0-32, used for the spawning blocks in bottom.
int YabsoluteOffset[2];//Absolute vertical offset. (pixels)
unsigned char chainpointer[254];//variable containing the chain values.
unsigned short fieldsettings[5] = {
	1, //count of fields, 1 or 2
	80, //X of top left position of field 1
	62, //Y of top left position of field 1
	368, //X of top left position of field 2
	62, //Y of top left position of field 2
};
unsigned char field[2][255][7];

void initField(void) {
	//clear and reset all field variables.
	char Xsprite = 0;
	char Xpos = 0;
	char Ypos = 0;
	for(unsigned char x = 0;x < 2;x++) {
		for(unsigned char y = 0;y < 255;y++) {
			for(unsigned char z = 0;z < 7;z++) {
				field[x][y][z] = 0;
			}
			field[x][y][0]=Xsprite;Xsprite++;if(Xsprite>5){Xsprite=0;}
			
		}
	}
	//clear and reset all chain pointers
	for(unsigned char x = 0;x < 254;x++) {
		chainpointer[x] = 0;
	}
}

// this is the function used to render a single frame
void render_frame(void)
{
    // clear the window to a deep blue
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, 0xff222222, 1.0f, 0);
    d3ddev->BeginScene();    // begins the 3D scene
    d3dspt->Begin(NULL);    // begin sprite drawing
    // set center @ upper-left.
    D3DXVECTOR3 center(0.0f, 0.0f, 0.0f);    // center at the upper-left corner

    D3DXVECTOR3 position(64.0f, -16.0f, 0.0f);
    d3dspt->Draw(sprite[7], NULL, &center, &position, 0xffffffff);

    D3DXVECTOR3 position(fieldsettings[1], fieldsettings[2], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, &position, 0xffffffff);
    D3DXVECTOR3 position(fieldsettings[3], fieldsettings[4], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, &position, 0xffffffff);

    d3dspt->End();    // end sprite drawing
    d3ddev->EndScene();    // ends the 3D scene
    d3ddev->Present(NULL, NULL, NULL, NULL);

    return;
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
	for(unsigned char i = 0;i < 6;i++) {
	 sprite[i]->Release();		
	}
    d3ddev->Release();
    d3d->Release();

    return;
}


When i compile this, i get some errors:
1
2
3
4
5
6
7
8
9
1
1>Compiling...
1>main.cpp
1>.\main.cpp(232) : error C2374: 'position' : redefinition; multiple initialization
1>        .\main.cpp(229) : see declaration of 'position'
1>.\main.cpp(234) : error C2374: 'position' : redefinition; multiple initialization
1>        .\main.cpp(229) : see declaration of 'position'
1>Build log was saved at "file://c:\Users\toby_hinloopen\Documents\Visual Studio 2008\Projects\project4\project4\Release\BuildLog.htm"
1>project4 - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Its clear: the compiler doesn't like to have a constant redeclared... but what should i do? I can't define 10000 constants because i can't edit them?

The only thing i want is "position" to be dynamicly changed.

How is this possible?
Is there a way to unset constants?

btw, if i try something like this:
1
2
3
4
5
6
7
    //D3DXVECTOR3 position(64.0f, -16.0f, 0.0f);
    d3dspt->Draw(sprite[7], NULL, &center, D3DXVECTOR3(64.0f, -16.0f, 0.0f), 0xffffffff);

    //D3DXVECTOR3 position(fieldsettings[1], fieldsettings[2], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, D3DXVECTOR3(fieldsettings[1], fieldsettings[2], 0.0f), 0xffffffff);
    //D3DXVECTOR3 position(fieldsettings[3], fieldsettings[4], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, D3DXVECTOR3(fieldsettings[3], fieldsettings[4], 0.0f), 0xffffffff);

I get errors like this:
1
2
3
4
5
6
7
8
9
10
11
1
1>Compiling...
1>main.cpp
1>.\main.cpp(230) : error C2664: 'ID3DXSprite::Draw' : cannot convert parameter 4 from 'D3DXVECTOR3' to 'const D3DXVECTOR3 *'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>.\main.cpp(233) : error C2664: 'ID3DXSprite::Draw' : cannot convert parameter 4 from 'D3DXVECTOR3' to 'const D3DXVECTOR3 *'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>.\main.cpp(235) : error C2664: 'ID3DXSprite::Draw' : cannot convert parameter 4 from 'D3DXVECTOR3' to 'const D3DXVECTOR3 *'
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>Build log was saved at "file://c:\Users\toby_hinloopen\Documents\Visual Studio 2008\Projects\project4\project4\Release\BuildLog.htm"
1>project4 - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



EDIT:
... after trying and trying, i fixed it using:

1
2
3
4
5
6
7
    //D3DXVECTOR3 position(64.0f, -16.0f, 0.0f);
    d3dspt->Draw(sprite[7], NULL, &center, &D3DXVECTOR3(64.0f, -16.0f, 0.0f), 0xffffffff);

    //D3DXVECTOR3 position(fieldsettings[1], fieldsettings[2], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, &D3DXVECTOR3(fieldsettings[1], fieldsettings[2], 0.0f), 0xffffffff);
    //D3DXVECTOR3 position(fieldsettings[3], fieldsettings[4], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, &D3DXVECTOR3(fieldsettings[3], fieldsettings[4], 0.0f), 0xffffffff);


just a & sign was required... -.-"
great, those clear errors :P

>>> THIS PROBLEM IS SOLVED <<<
tnx for the... *kuch* replies :P
Last edited on
You've declared multiple variables with the same name in the function called position.

1
2
3
4
5
6
7
    D3DXVECTOR3 position(64.0f, -16.0f, 0.0f);
    d3dspt->Draw(sprite[7], NULL, &center, &position, 0xffffffff);

    position(fieldsettings[1], fieldsettings[2], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, &position, 0xffffffff);
    position(fieldsettings[3], fieldsettings[4], 0.0f);
    d3dspt->Draw(sprite[0], NULL, &center, &position, 0xffffffff);


Should work.
Its clear: the compiler doesn't like to have a constant redeclared... but what should i do? I can't define 10000 constants because i can't edit them?


the reason you can't redeclare a constant is because it's supposed to be constant, meaning the value is constant, never changes, and will never be changed. You shouldn't be changing the value if it's a constant. You wouldn't expect a constant named PI to change from 3.1416 to something like 1.0384

use a variable if you want to change the value. :P
Last edited on
Topic archived. No new replies allowed.