Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-05 15:48:40 - Eric Henziger, i forum c++, Tråden har 9 Kommentarer och lästs av 1331 personer

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.

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.


Svara

Sv: Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-05 16:51:08 - Niklas Jansson

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.


Svara

Sv:Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-06 15:20:43 - Eric Henziger

Så, ska jag spara allt som jag har gjort i World() för att sedan radera det ur minnet?
Ä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?


Svara

Sv: Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-06 17:14:11 - Niklas Jansson

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.

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.


Svara

Sv:Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-06 22:44:22 - Eric Henziger

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.

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.



Svara

Sv: Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-06 23:03:44 - Niklas Jansson

Jepp, min gissning var rätt, det är i en klass "CDXInput" som problemet uppstår.

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.


Svara

Sv:Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-07 14:48:58 - Eric Henziger

Spark, spark :P

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 :S


Svara

Sv: Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-07 17:24:14 - Niklas Jansson

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.

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.


Svara

Sv:Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-18 13:54:17 - Eric Henziger

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:

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?


Svara

Sv: Bygger rum med openGL - överladdad funktion?

Postades av 2007-11-18 16:27:58 - Niklas Jansson

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å.

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.


Svara

Nyligen

  • 20:22 Spel
  • 17:07 Snabb och trevlig webbplats utan l
  • 17:00 Bra spelsajt med bonusar
  • 15:51 Slappna av
  • 15:17 Onlineunderhållning på fritiden
  • 11:13 Online Kasino
  • 17:57 Vart är SEO på väg till 2030?
  • 14:24 CBD regelbundet?

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 669
27 955
271 721
592
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies