main.cpp
- Code: Select all
#include "main.h"
#include "render.h"
#include "core.h"
#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN
bool exiting = false;
long windowBit = 32;
bool fullscreen = false;
HWND Window;
HDC hDC;
Render *rrender = NULL;
Core *ccore = NULL;
void SetPixelFormat(HDC hDC)
{
int pxFormat;
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // Size,
1, // Version,
PFD_SUPPORT_OPENGL | // OpenGL Window |
PFD_DRAW_TO_WINDOW | // render to window |
PFD_DOUBLEBUFFER, // support double buffering,
PFD_TYPE_RGBA, // Color type,
32, // color depth,
0, 0, 0, 0, 0, 0, // color bits (ignored),
1, // alpha buffer,
0, // alpha bits (ignored),
0, // no accumulation buffer,
0, 0, 0, 0, // accum bits (ignored),
16, // depth buffer,
0, // no stencil buffer,
0, // no auxiliary buffers
PFD_MAIN_PLANE, // main layer,
0, // reserved,
0,0,0, // no layer, visible, damage mask
};
pxFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, pxFormat, &pfd);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HDC hDC;
static HGLRC hRC;
int w, h;
rrender = new Render();
switch(msg)
{
case WM_CREATE:
hDC = GetDC(hwnd);
SetPixelFormat(hDC);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
break;
case WM_DESTROY:
case WM_QUIT:
case WM_CLOSE:
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC);
PostQuitMessage(0);
break;
case WM_SIZE:
h = HIWORD(lParam);
w = LOWORD(wParam);
// rrender->SetProjection(w, h); // Får applikation att krascha vid start. Variabeln 'w' är alltid 0 av någon anledning.
break;
default:
break;
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdString, int CmdShow)
{
WNDCLASSEX wc;
MSG msg;
/*
DWORD dwExStyle;
DWORD dwStyle;
*/
RECT windowRect;
windowRect.left = (long)0;
windowRect.right = (long)wWidth;
windowRect.top = (long)0;
windowRect.bottom = (long)wHeight;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "DME";
wc.lpszMenuName = NULL;
wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
if(!RegisterClassEx(&wc))
{
MessageBox(NULL,"Error: Cannot Register Class", "ERROR!", MB_OK);
return 0;
}
AdjustWindowRect(&windowRect, WS_POPUP, FALSE);
Window = CreateWindow("DME", "Divinus",
WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, wWidth, wHeight, NULL, NULL, hInstance, NULL);
hDC = GetDC(Window);
/* Om fönstret inte kan skapas */
if(!Window)
{
MessageBox(NULL,"Error: Failed to Create Window", "ERROR!", MB_OK);
return 0;
}
ShowWindow(Window, SW_SHOW);
UpdateWindow(Window);
// ccore->initialyze(); // Kraschar applikationen vid start
while (!exiting)
{
ccore->render;
SwapBuffers(hDC);
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL, 0, 0))
{
exiting = true;
break;
}
if(msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
}
}
delete rrender;
delete ccore;
return (int)msg.wParam;
}
SetProjection
- Code: Select all
void Render::SetProjection(int w, int h)
{
if(h == 0) // Så vi inte dividerar med 0
h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, 0, w > h ? w : h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
core->render_screen();
}
render_screen()
- Code: Select all
void Core::render_screen()
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glLoadIdentity();
for(int x = 19; x >= 0; x--) {
for(int y = 19; y >= 0; y--) {
if (tiles[x][y])
{
render->texture(x * 32, y * 32, pPlayer[x][y]->getGround());
render->texture(x * 32, y * 32, objs[x][y]->getGround());
render->texture(x * 32, y * 32, walls[x][y]->getGround());
render->texture(x * 32, y * 32, tiles[x][y]->getGround());
}
}
}
glutSwapBuffers();
}
initialyze
- Code: Select all
void Core::initialyze()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Ladda sprites
textures.push_back(render->loadBitmap("tiles/void.bmp")); // 0
textures.push_back(render->loadBitmap("tiles/dirt.bmp")); // 1
textures.push_back(render->loadBitmap("tiles/grass.bmp")); // 2
textures.push_back(render->loadBitmap("tiles/rock.bmp")); // 3
textures.push_back(render->loadBitmap("tiles/sand.bmp")); // 4
textures.push_back(render->loadBitmap("tiles/water.bmp")); // 5
textures.push_back(render->loadBitmap("tiles/stones.bmp")); // 6
GLuint tTile;
GLuint oTile;
GLuint wTile;
GLuint player;
for(int x = 19; x >= 0; x--) {
for(int y = 19; y >= 0; y--) {
tTile = groundMap[y][x];
oTile = objectMap[y][x];
wTile = wallMap[y][x];
player = playerLayer[y][x];
tiles[x][y] = new Tile(textures[tTile]);
walls[x][y] = new Tile(textures[wTile]);
objs[x][y] = new Tile(textures[oTile]);
pPlayer[x][y] = new Tile(textures[player]);
}
}
}
core.h
- Code: Select all
#ifndef _CORE_H_
#define _CORE_H_
#include "main.h"
#include "tile.h"
#include "render.h"
class Render;
class Core
{
public:
Core();
virtual ~Core();
void initialyze(); // Initierar 'kärnan(core)'
void object();
void render_screen(); // rendera skärmen
void move(int key, int x, int y);
Render *render; // textur klassen
protected:
std::vector<unsigned int> textures;
std::string double_to_string(double var); // double -> string
void framerate(); // Kalkylera frameraten.
Tile *tiles[20][20];
Tile *objs [20][20];
Tile *pPlayer[20][20];
Tile *walls[20][20];
int displayFPS;
int frame; // räkna framerate.
double fps; // actual framerate.
int time; // Håller i nuvarande tid.
int timebase; // används för kalkylering av fps.
int spx;
int spy;
};
#endif
render.h
- Code: Select all
#ifndef _RENDER_H_
#define _RENDER_H_
#include "main.h"
#include "tile.h"
#include "core.h"
#include <GL/glut.h> // header fil för GLUT.
class Render
{
public:
Render();
virtual ~Render();
unsigned int loadBitmap(const char* filename ); // ladda texturen. (24-bit BMP)
unsigned int loadBitmap(const char* filename, int alpha); // ladda texturen. (24-bit BMP)
void texture(unsigned int x, unsigned int y, unsigned int id); // rendera en textur.
void object(unsigned int x, unsigned int y, unsigned int id); // rendera ett object.
void rect(unsigned int x, unsigned int y, unsigned int w, unsigned int h, int color); // rendera en rect.
void text(unsigned int x, unsigned int y, void *font, int color, std::string text); // rendera texten.
void SetProjection(int w, int h);
protected:
unsigned int construct(GLenum format, unsigned char *data, unsigned long width, unsigned long height); // konstruera texturen.
std::map<unsigned int, unsigned int> twidth; // textur bredd.
std::map<unsigned int, unsigned int> theight; // textur höjd.
};
#endif
Avlusaren ger mig detta.

Med några breakpoints (jag är säker på hur man använder dessa men jag antar att jag gjorde rätt).

Koden funkade perfekt i GLUT men när jag ändra till winapi så började detta problem uppstå, jag har ingen erfarenhet med winapi, läste en bok och ändrade på all deras kod till min kod.
Mitt nät var nere 2 veckor så jag har försökt få ihop detta men det går inte för mig.
Har försökt få hjälp på andra forum men ingen verkar veta varför det blir så här, eller hur man fixar detta. Enda någon sagt är 'uninitialized variable' eller 'trying to access uninitialized memory in an incorrect manner'. Eftersom jag inte hade några problem i GLUT och inte har några kunskaper inom winapi så förstår jag inte vad som är fel.
Kallar det winapi för jag inte vet om det kallas för något annat men jag antar att alla här vet vad jag menar med det.
Om någon här skulle vilja se all källkod så får ni säga till så skickar jag ett pm med en länk till ett zip arkiv med kod och dyligt för att öppna projektet i Visual Studio. Jag använder MS Visual Studio 2008.
Har bara en liten fråga till

Finns det någon möjlighet att få se era lokaler om någon kanske kan plåta hur klassrum etc ser ut. Så man vet vad som väntar på en när man söker om 2 år (måste plugga komvux först).
Tack för mig!

