Hej, håller på med openGL och just nu gör jag labyrinter. Från början hade jag ca 9 nio rum och programmet fungerade som det skulle. Nu har jag förstorat labyrinten till 23 rum och programmet fungerar, ända tills man stänger av det. Om man någon gång under programmet trycker på Esc (som man gör när man vill avsluta) så kommer dialogrutan "Unhandled exception at 0x3dbdcbfd in Basecode.exe: 0xC0000005: Access violation reading location 0x3dbdcbfd." upp. Jag väljer "Break" och en till dialogruta kommer upp som säger "There is no source code available for the current location." Där kan man välja "Show disassembly" som visar att nåt är fel på någon adress, dock är adressen olika från gång till gång. Grundprincipen är att något försöker köra delete eller free på minne som inte är allokerat, och bör i så fall ha att göra med att du använder icke allokerat minne. Så, ska jag spara allt som jag har gjort i World() för att sedan radera det ur minnet? Det är lite för specifika frågor, dels eftersom jag inte har hela koden, dels för att jag inte har läst igenom hela koden ordentligt. Programmet är mycket större, detta är ju dessutom endast en av filerna i projektet. De andra filerna (tror jag) är irrelevanta vad det gäller mitt problem. Jepp, min gissning var rätt, det är i en klass "CDXInput" som problemet uppstår. Spark, spark :P Inte så värst, faktiskt. Det har att göra med att du skriver så mycket i minnet att du skriver in på lite av CDXInputs data. Det är det som systemet tittar på när det försöker ta bort CDXInput och försöker ta bort mer än det ska. Hej hej, har försökt göra klasser som hjälper till med rumbyggandet. Jag har kommit så långt att jag gjort en egen klass, "Walls", där mina funktioner för de fyra olika sorters väggarna finns. Såhär ser Walls.h ut: Njae, din klass-lösning är inte riktigt 100, även om det nog blir lite lättare att hålla reda på vad som händer då.Bygger rum med openGL - överladdad funktion?
Men om man tar bort några rum så fungerar det som det ska, inga felmeddelanden när man avslutar.
Så jag tänkte om min World()-funktion där jag ger rummen deras koordinater blir overloaded. Kan man göra nåt åt det eller är det nåt helt annat som är fel?
Såhär görs en vägg som går i x-led
typedef struct
{
float x;
float y;
float z;
} pxyz;
void Wall1(pxyz p1, pxyz p2, pxyz p3, pxyz p4) {
glBegin(GL_QUADS);
//punkt p1 övre högra hörnet
glVertex3f(p1.x, p1.y, p1.z);
//punkt p2 undre högra hörnet
glVertex3f(p2.x, p2.y, p2.z);
//punkt p3 undre vänstra hörnet
glVertex3f(p3.x, p3.y, p3.z);
//punkt p4 övre vänstra hörnet
glVertex3f(p4.x, p4.y, p4.z);
glEnd();
}
Såhär är ritningen för ett rum med öppning i en av väggarna//rum med öppning åt höger
void Roomtype1(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//taket
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//högra väggen med en öppning
glColor3f(0.0, 0.0, 0.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall4(point1, point2, point3, point4);
//främre väggen
glColor3f(1.0, 1.0, 0.0);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall1(point1, point2, point3, point4);
//vänstra väggen
glColor3f(0.5, 0.5, 0.5);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall2(point1, point2, point3, point4);
//vägg bak
glColor3f(0.0, 1.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
}
Och såhär görs rummet i World()-funktionen
void World(){
p1.x =-2.0 ; p1.y= 0.0; p1.z=20.0;
p2.x =-2.0 ; p2.y= 0.0; p2.z=32.0;
p3.x =-14.0; p3.y= 0.0; p3.z=32.0;
p4.x =-14.0; p4.y= 0.0; p4.z=20.0;
Roomtype1(p1, p2, p3, p4, height);
}
Sen anropas funktionen World i funktionen Draw där saker och ting ritas ut.
Sv: Bygger rum med openGL - överladdad funktion?
Sv:Bygger rum med openGL - överladdad funktion?
Är det möjligt att spara mina rum? Kan man radera det man gjort i en void? Varför fungerade det när jag bara hade några få rum?
För visst är det rummen som är icke allokerade?Sv: Bygger rum med openGL - överladdad funktion?
I princip kan man säga att det är något i stil med:
void func(void)
{
int * p;
p = new int;
*p = 5;
delete p;
//...
delete p;
}
Huruvida detta ger problem eller inte är extremt beroende på operativsystem, kompilator, dator man kör på, och hur mycket minne man använder. Kan inte gå in på alla detaljerna nu, men det har att göra med hur pekarallokeringar fungerar. Det kan också ha att göra med minnespooler och liknande. Det är lite härvigt.
Det stämmer alltså bra med att det påverkas av om du har många eller få objekt.
Hur som helst:
<b>>Så, ska jag spara allt som jag har gjort i World() för att sedan radera det ur minnet?</b>
Alltså... På "lokala variabler" körs destruktorn automatiskt. Om detta av någon anledning sker på ett felaktigt sätt så kan program krascha. Det är förmodligen där något händer.
Om programmet inte är mycket större borde du lägga upp övriga funktioner också.
Grejen är att jag inte riktigt förstår den logiska tankegången i ditt program. Jag skulle skriva om ditt program med ett antal klasser "Room", som sedan ritar ut sig själva.
Ett sista tips:
När du tar "show disassembly", så ta fram programmets "Call stack". Du kan nu se i vilken ordning saker blev anropade. Du kommer förmodligen komma fram till en destruktor någonstans. Det är något som är kopplat till den som är problemet.
Sv:Bygger rum med openGL - överladdad funktion?
Här kommer iaf fler funktioner, det är inte alla men det är de flesta och de som jag tror kan ha ett syfte.
Det som är bortaget är: Kollisionshanteringen, större delen av styrningen, en del rum i World(), en del rumtyper.
Men de andra rummen är ju samma sak som rummen nedan fast med andra koordinater och olika rumtyper. Det som skiljer rumtyperna åt är att olika sorters väggar (med eller utan dörr).
/***********************************************************
* Active.cpp - När spelet är igång
***********************************************************/
#include "Game.h"
bool ready = false;
typedef struct
{
float x;
float y;
float z;
} pxyz;
void Wall1(pxyz p1, pxyz p2, pxyz p3, pxyz p4) {
glBegin(GL_QUADS);
//punkt p1 övre högra hörnet
glVertex3f(p1.x, p1.y, p1.z);
//punkt p2 undre högra hörnet
glVertex3f(p2.x, p2.y, p2.z);
//punkt p3 undre vänstra hörnet
glVertex3f(p3.x, p3.y, p3.z);
//punkt p4 övre vänstra hörnet
glVertex3f(p4.x, p4.y, p4.z);
glEnd();
}
void Wall2(pxyz p1, pxyz p2, pxyz p3, pxyz p4) {
glBegin(GL_QUADS);
//punkt p1 övre högra hörnet
glVertex3f(p1.x, p1.y, p1.z);
//punkt p2 undre högra hörnet
glVertex3f(p2.x, p2.y, p2.z);
//punkt p3 undre vänstra hörnet
glVertex3f(p3.x, p3.y, p3.z);
//punkt p4 övre vänstra hörnet
glVertex3f(p4.x, p4.y, p4.z);
glEnd();
}
//Här är en vägg med hål (dörr) i mitten
void Wall3(pxyz p1, pxyz p2, pxyz p3, pxyz p4) {
glBegin(GL_QUADS);
//första delen
glVertex3f(p1.x ,p1.y,p1.z);
glVertex3f(p2.x ,p2.y,p2.z);
glVertex3f(p3.x+7.0f,p3.y,p3.z);
glVertex3f(p4.x+7.0f,p4.y,p4.z);
glEnd();
glBegin(GL_QUADS);
//Andra delen
glVertex3f(p1.x-7.0f,p1.y,p1.z);
glVertex3f(p2.x-7.0f,p2.y,p2.z);
glVertex3f(p3.x ,p3.y,p3.z);
glVertex3f(p4.x ,p4.y,p4.z);
glEnd();
}
void Wall4(pxyz p1, pxyz p2, pxyz p3, pxyz p4){
glBegin(GL_QUADS);
//första delen
glVertex3f(p1.x,p1.y,p1.z);
glVertex3f(p2.x,p2.y,p2.z);
glVertex3f(p3.x,p3.y,p3.z-7.0f);
glVertex3f(p4.x,p4.y,p4.z-7.0f);
glEnd();
glBegin(GL_QUADS);
//andra delen
glVertex3f(p1.x,p1.y,p1.z+7.0f);
glVertex3f(p2.x,p2.y,p2.z+7.0f);
glVertex3f(p3.x,p3.y,p3.z);
glVertex3f(p4.x,p4.y,p4.z);
glEnd();
}
//rum med öppning åt höger
void Roomtype1(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//taket
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//högra väggen med en öppning
glColor3f(0.0, 0.0, 0.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall4(point1, point2, point3, point4);
//främre väggen
glColor3f(1.0, 1.0, 0.0);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall1(point1, point2, point3, point4);
//vänstra väggen
glColor3f(0.5, 0.5, 0.5);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall2(point1, point2, point3, point4);
//vägg bak
glColor3f(0.0, 1.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
}
//rum med öppning på den främre väggen
void Roomtype2(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//tak
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//högra väggen
glColor3f(0.8f, 1.0f, 0.2f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall2(point1, point2, point3, point4);
//främre väggen med öppning
glColor3f(0.0, 1.0, 1.0);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall3(point1, point2, point3, point4);
//vänstra väggen
glColor3f(1.0, 1.0, 1.0);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall2(point1, point2, point3, point4);
//bakre väggen
glColor3f(1.0, 1.0, 0.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
}
//rum med öppning mot vänstra väggen
void Roomtype3(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//tak
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//högra väggen
glColor3f(0.6f, 1.0f, 0.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall2(point1, point2, point3, point4);
//främre väggen
glColor3f(1.0f, 0.2f, 0.2f);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall1(point1, point2, point3, point4);
//vänstra väggen med öppning
glColor3f(0.0f, 0.8f, 1.0f);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall4(point1, point2, point3, point4);
//bakre väggen
glColor3f(0.6f, 0.2f, 0.6f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
}
//rum med bakre väggen öppen
void Roomtype4(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//tak
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//högra väggen
glColor3f(0.6f, 0.6f, 0.9f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall2(point1, point2, point3, point4);
//främre väggen
glColor3f(0.2f, 0.2f, 0.2f);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall1(point1, point2, point3, point4);
//vänstra väggen
glColor3f(1.0, 1.0, 0.0);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall2(point1, point2, point3, point4);
//bakre väggen med öppning
glColor3f(0.0, 0.0, 0.2f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall3(point1, point2, point3, point4);
}
//rum med höger och främre väggar öppna
void Roomtype5(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//tak
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//högra väggen med öppning
glColor3f(1.0f, 0.4f, 0.2f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall4(point1, point2, point3, point4);
//främre väggen med öppning
glColor3f(0.0, 1.0, 1.0);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall3(point1, point2, point3, point4);
//vänstra väggen
glColor3f(1.0, 1.0, 1.0);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall2(point1, point2, point3, point4);
//bakre väggen
glColor3f(0.0f, 1.0f, 0.5f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
}
//rum med öppning åt höger och åt vänster
void Roomtype6(pxyz p1, pxyz p2, pxyz p3, pxyz p4, float height){
pxyz point1; pxyz point2; pxyz point3; pxyz point4;
//golv
glColor3f(1.0, 0.0, 0.0);
Wall1(p1, p2, p3, p4);
//tak
glColor3f(0.0, 0.0, 1.0);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p2.x;point2.y=p2.y + height;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y + height;point3.z=p3.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
//höger vägg med öppning
glColor3f(0.0f, 0.5f, 1.0f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p2.x;point3.y=p2.y ;point3.z=p2.z;
point4.x=p2.x;point4.y=p2.y + height;point4.z=p2.z;
Wall4(point1, point2, point3, point4);
//främre väggen
glColor3f(1.0f, 0.2f, 0.2f);
point1.x=p2.x;point1.y=p2.y + height;point1.z=p2.z;
point2.x=p2.x;point2.y=p2.y ;point2.z=p2.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall1(point1, point2, point3, point4);
//vänstra väggen med öppning
glColor3f(0.5f, 0.0f, 1.0f);
point1.x=p4.x;point1.y=p4.y + height;point1.z=p4.z;
point2.x=p4.x;point2.y=p4.y ;point2.z=p4.z;
point3.x=p3.x;point3.y=p3.y ;point3.z=p3.z;
point4.x=p3.x;point4.y=p3.y + height;point4.z=p3.z;
Wall4(point1, point2, point3, point4);
//bakre väggen
glColor3f(0.4f, 0.7f, 0.8f);
point1.x=p1.x;point1.y=p1.y + height;point1.z=p1.z;
point2.x=p1.x;point2.y=p1.y ;point2.z=p1.z;
point3.x=p4.x;point3.y=p4.y ;point3.z=p4.z;
point4.x=p4.x;point4.y=p4.y + height;point4.z=p4.z;
Wall1(point1, point2, point3, point4);
}
void World(){
pxyz p1; pxyz p2; pxyz p3; pxyz p4;
//rum 1
p1.x =22.0 ; p1.y= 0.0; p1.z=-4.0;
p2.x =22.0 ; p2.y= 0.0; p2.z=8.0;
p3.x =10.0; p3.y= 0.0; p3.z=8.0;
p4.x =10.0; p4.y= 0.0; p4.z=-4.0;
float height = 3.0;
Roomtype2(p1, p2, p3, p4, height);
//rum 2
p1.x =34.0 ; p1.y= 0.0; p1.z=-4.0;
p2.x =34.0 ; p2.y= 0.0; p2.z=8.0;
p3.x =22.0; p3.y= 0.0; p3.z=8.0;
p4.x =22.0; p4.y= 0.0; p4.z=-4.0;
Roomtype5(p1, p2, p3, p4, height);
//rum 3 (mål)
p1.x =46.0 ; p1.y= 0.0; p1.z=-4.0;
p2.x =46.0 ; p2.y= 0.0; p2.z=8.0;
p3.x =34.0; p3.y= 0.0; p3.z=8.0;
p4.x =34.0; p4.y= 0.0; p4.z=-4.0;
Roomtype6(p1, p2, p3, p4, height);
//rum 4
p1.x =10.0 ; p1.y= 0.0; p1.z=8.0;
p2.x =10.0 ; p2.y= 0.0; p2.z=20.0;
p3.x =-2.0; p3.y= 0.0; p3.z=20.0;
p4.x =-2.0; p4.y= 0.0; p4.z=8.0;
Roomtype2(p1, p2, p3, p4, height);
//rum 5
p1.x =22.0; p1.y= 0.0; p1.z=8.0;
p2.x =22.0; p2.y= 0.0; p2.z=20.0;
p3.x =10.0; p3.y= 0.0; p3.z=20.0;
p4.x =10.0; p4.y= 0.0; p4.z=8.0;
Roomtype10(p1, p2, p3, p4, height);
//rum 6
p1.x =34.0; p1.y= 0.0; p1.z=8.0;
p2.x =34.0; p2.y= 0.0; p2.z=20.0;
p3.x =22.0; p3.y= 0.0; p3.z=20.0;
p4.x =22.0; p4.y= 0.0; p4.z=8.0;
Roomtype11(p1, p2, p3, p4, height);
//rum 7
p1.x =46.0; p1.y= 0.0; p1.z=8.0;
p2.x =46.0; p2.y= 0.0; p2.z=20.0;
p3.x =34.0; p3.y= 0.0; p3.z=20.0;
p4.x =34.0; p4.y= 0.0; p4.z=8.0;
Roomtype3(p1, p2, p3, p4, height);
//rum 8
p1.x =-2.0 ; p1.y= 0.0; p1.z=20.0;
p2.x =-2.0 ; p2.y= 0.0; p2.z=32.0;
p3.x =-14.0; p3.y= 0.0; p3.z=32.0;
p4.x =-14.0; p4.y= 0.0; p4.z=20.0;
Roomtype1(p1, p2, p3, p4, height);
//rum 9
p1.x =10.0; p1.y= 0.0; p1.z=20.0;
p2.x =10.0; p2.y= 0.0; p2.z=32.0;
p3.x =-2.0; p3.y= 0.0; p3.z=32.0;
p4.x =-2.0; p4.y= 0.0; p4.z=20.0;
Roomtype11(p1, p2, p3, p4, height);
}
/**
* Skriv alla meddelanden i denna!
*/
void ScreenText(void){
glColor3f(1.0,1.0,1.0); //vit text
glDisable(GL_DEPTH_TEST); // stäng av djupleds testet
//plocka bort ljus annars blir texten bara grå
glDisable(GL_LIGHTING);
//välj projektions matrisen
glMatrixMode(GL_PROJECTION);
glPushMatrix(); //spara projektions matrisen
glLoadIdentity(); //nollställ projektionsmatrisen
// ställ in ortogonal projektion
glOrtho(0,width,0,height,-1,1);
// välj modelview matrisen
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); // spara modelview matrisen
glLoadIdentity(); // nollställ modelview matrisen
// bestäm var texten ska stå på skärmen
glRasterPos2f(width-780.0f, height-60.0f);
//Skriv din text här
char text[100]; //array med text
if(!ready){ //om inte (!) klar
//hur länge har vi hållit på?
elapsed = GetTickCount() - start;
//lägger elapsed värde in i text variabeln men innan detta
// så görs värdet om till sekunder
sprintf(text, "%d", elapsed/1000);
PrintString(listBase, text); //skriver ut variabeln för tiden
}
else{
PrintString(listBase,"Grattis du lyckades!");
glRasterPos2f(width-780.0f, height-100.0f);
PrintString(listBase,"Din tid blev: ");
sprintf(text, "%d", elapsed/1000);
PrintString(listBase, text);
PrintString(listBase," sekunder");
glRasterPos2f(width-780.0f, height-140.0f);
PrintString(listBase,"Tryck ESC och avsluta.");
}
glMatrixMode(GL_PROJECTION); //välj projektions matrisen
glPopMatrix(); // återställ projektionsmatrisen
glMatrixMode(GL_MODELVIEW); // välj modelview matrisen
glPopMatrix(); // återställ modelview matrisen
glEnable(GL_DEPTH_TEST); //sätt igång djup testningen
}
/**
* Hantera input från användaren, t.ex. tangentbord och joypad.
*/
void UpdateInput(void) {
// uppdatera tangentbord och mus etc.
Input.Update();
if(Input.GetKeyState(CDXKEY_W)) {
//framåt
eyex = eyex + speed * cos(viewangle);
eyez = eyez + speed * sin(viewangle);
}
if(Input.GetKeyState(CDXKEY_A)) {
//vänster
eyex = eyex + speed * cos(viewangle-PI/2);
eyez = eyez + speed * sin(viewangle-PI/2);
}
if(Input.GetKeyState(CDXKEY_D)) {
//höger
eyex = eyex + speed * cos(viewangle+PI/2);
eyez = eyez + speed * sin(viewangle+PI/2);
}
}
// * Rita upp allting i denna!
void Draw(void) {
glLoadIdentity();
gluLookAt(eyex, eyey, eyez, viewx + eyex, viewy + eyey, viewz + eyez, 0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0); //rad du måste lägga till
if(!ready){
World();
if (eyex>46.0 && eyez<6.0) { //har du nått utgången?
ready = true;
}
}
//Meddelanden ska skrivas ovanpå
//världen därför ritas de sist
ScreenText();
glFlush();
SwapBuffers(hDC);
}
Att ha klasser är säkert en bra idé, jag är dock inte så bra på det här med klasser men om jag skulle gissa:
Jag gör klasser, en för varje rumtyp kanske. Utifrån dessa skapar jag objekt som jag ger fem variabler (p1, p2, p3, p4 och height) och där har jag mitt rum? Men att skapa tolv klasser eller mer känns onödigt. Jag vågar påstå att det finns bättre sätt :P
Till sist:
Jag kollade på Call Stack och det var ganska svårt att tyda men jag gissar på att det här har med felet att göra:
Basecode.exe!exit(int code=0) Line 398 + 0xd bytes
Basecode.exe!`dynamic atexit destructor for 'Input''() + 0x28 bytes
Basecode.exe!CDXInput::~CDXInput() + 0x68 bytes
Det var iaf det enda som inte hade med uppstart (CRTstartup()) eller någon dll-fil att göra.
Ursäkta det långa inlägget.
Sv: Bygger rum med openGL - överladdad funktion?
Ditt upplägg med klasserna är inte riktigt 100% nej, jag återkommer imorgon och ger tips på hur du kan göra. Sparka lite på den här tråden om du inte har svar före lunch 7:e november.Sv:Bygger rum med openGL - överladdad funktion?
Såg att jag skrivit Call Stacken i fel ordning. Om det ska vara som det var på skärmen så ser det ut såhär.
Basecode.exe!CDXInput::~CDXInput() + 0x68 bytes
Basecode.exe!`dynamic atexit destructor for 'Input''() + 0x28 bytes
Basecode.exe!exit(int code=0) Line 398 + 0xd bytes
Så att det med CDXInput är det som händer sist.
Men det är alltså där som problemet uppstår. Hur kan det gå ihop? CDXInput som har och göra med all styrning i spelet (Tangenttryck, musstyrning m.m.) påverkas av att jag ritar fler rum? Konstigt :SSv: Bygger rum med openGL - överladdad funktion?
Det är ett typiskt sånt problem, och problemet bör ligga i att du skriver på ställen du inte får lov. Jag har tyvärr haft en jävligt hektisk dag (och kommer fortsätta ha) så jag kan inte förklara grejen ovan idag heller.
Men i princip handlar det om att du skriver på du inte får, och du måste på något sätt veta att allt du skriver till verkligen är allokerat.Sv:Bygger rum med openGL - överladdad funktion?
int boxn;
typedef struct
{
float x;
float y;
float z;
} pxyz;
class Walls {
public:
//vägg längs x-axeln
void Wall1(pxyz p1, pxyz p2, pxyz p3, pxyz p4);
//vägg längs z-axeln
void Wall2(pxyz p1, pxyz p2, pxyz p3, pxyz p4);
//Vägg med öppning längs z-axeln
void Wall3(pxyz p1, pxyz p2, pxyz p3, pxyz p4);
//vägg med öppning längs x-axeln
void Wall4(pxyz p1, pxyz p2, pxyz p3, pxyz p4);
};
void Walls::Wall1(pxyz p1, pxyz p2, pxyz p3, pxyz p4){
glBegin(GL_QUADS);
//punkt p1 övre högra hörnet
glVertex3f(p1.x, p1.y, p1.z);
//punkt p2 undre högra hörnet
glVertex3f(p2.x, p2.y, p2.z);
//punkt p3 undre vänstra hörnet
glVertex3f(p3.x, p3.y, p3.z);
//punkt p4 övre vänstra hörnet
glVertex3f(p4.x, p4.y, p4.z);
//kollisionshantering i x-led
BoundingBox wall(boxn);
wall.xmax=p1.x;wall.xmin=p3.x;
wall.zmax=p1.z;wall.zmin=p3.z;
boxarray[boxn]=wall;
boxn=boxn+1;
glEnd();
}
void Walls::Wall2(pxyz p1, pxyz p2, pxyz p3, pxyz p4){
glBegin(GL_QUADS);
glVertex3f(p1.x, p1.y, p1.z);
glVertex3f(p2.x, p2.y, p2.z);
glVertex3f(p3.x, p3.y, p3.z);
glVertex3f(p4.x, p4.y, p4.z);
//kollisionshantering i z-led
BoundingBox wall(boxn);
wall.xmax=p1.x;wall.xmin=p2.x;
wall.zmax=p3.z;wall.zmin=p1.z;
boxarray[boxn]=wall;
boxn=boxn+1;
glEnd();
}
void Walls::Wall3(pxyz p1, pxyz p2, pxyz p3, pxyz p4){
glBegin(GL_QUADS);
//första delen
glVertex3f(p1.x ,p1.y,p1.z);
glVertex3f(p2.x ,p2.y,p2.z);
glVertex3f(p3.x+7.0f,p3.y,p3.z);
glVertex3f(p4.x+7.0f,p4.y,p4.z);
glEnd();
//kollisionshantering i x-led
BoundingBox wall(boxn);
wall.xmax=p1.x;wall.xmin=p3.x+10.0f;
wall.zmax=p1.z;wall.zmin=p3.z;
boxarray[boxn]=wall;
boxn=boxn + 1;
glBegin(GL_QUADS);
//andra delen
glVertex3f(p1.x-7.0f,p1.y,p1.z);
glVertex3f(p2.x-7.0f,p2.y,p2.z);
glVertex3f(p3.x,p3.y,p3.z);
glVertex3f(p4.x,p4.y,p4.z);
glEnd();
//kollisionshantering i x-led
BoundingBox wall2(boxn);
wall2.xmax=p1.x-10.0f;wall2.xmin=p3.x;
wall2.zmax=p1.z;wall2.zmin=p3.z;
boxarray[boxn]=wall2;
boxn=boxn + 1;
}
void Walls::Wall4(pxyz p1, pxyz p2, pxyz p3, pxyz p4){
glBegin(GL_QUADS);
//första delen
glVertex3f(p1.x,p1.y,p1.z);
glVertex3f(p2.x,p2.y,p2.z);
glVertex3f(p3.x,p3.y,p3.z-7.0f);
glVertex3f(p4.x,p4.y,p4.z-7.0f);
glEnd();
//kollisionshantering i x-led
BoundingBox wall(boxn);
wall.xmax=p1.x;wall.xmin=p2.x;
wall.zmax=p3.z-10.0f;wall.zmin=p1.z;
boxarray[boxn]=wall;
boxn=boxn+1;
glBegin(GL_QUADS);
//andra delen
glVertex3f(p1.x,p1.y,p1.z+7.0f);
glVertex3f(p2.x,p2.y,p2.z+7.0f);
glVertex3f(p3.x,p3.y,p3.z);
glVertex3f(p4.x,p4.y,p4.z);
glEnd();
//kollisionshantering i x-led
BoundingBox wall2(boxn);
wall2.xmax=p1.x;wall2.xmin=p2.x;
wall2.zmax=p3.z;wall2.zmin=p1.z+10.0f;
boxarray[boxn]=wall2;
boxn=boxn+1;
}
Min idé är att man gör en klass som ärver dessa funktioner. Den klassen säger åt hur väggarna används. (ersätter Roomtype-funktionerna som finns i tidigare inlägg) Sen ska man välja vilka av Wall1, Wall2, Wall3, Wall4 som man ska använda i sitt objekt. Går det att göra?
För att slippa problemet med icke allokerat minne, måste man använda pekare eller går det bra med vanliga objekt?
Sv: Bygger rum med openGL - överladdad funktion?
Läs på lite om objektorientering, så har du nog lite lättare att få fram en bra lösning.
<b>>För att slippa problemet med icke allokerat minne, måste man använda pekare eller går det bra med vanliga objekt?</b>
Du bör undvika pekare och arrayer. Det första du bör åtgärda är nog att byta ut arrayer mot std::vector.