May 01, 2024, 07:00:02 AM

News:

IonicWind Snippit Manager 2.xx Released!  Install it on a memory stick and take it with you!  With or without IWBasic!


Strange Crash while drawing graphics to the screen...

Started by Kale, November 07, 2006, 02:41:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Kale

I've been playing around with Aurora's 3D sprites again and im trying to draw a load all over the screen. But for some reason it unexpectedly crashes. I've used the built-in debugger to try and suss out the problem but i can't seem to read anything useful from it.

Basically, if you comment out the 'DrawSprites()' method call in the main loop of the 'Run()' method all compiles and runs fine. If it is left however, everything goes pear shaped. Anybody have any ideas?

BTW this is my first attempt at using Linked List in Aurora so be kind. ;)

Application.src:

#AutoDefine "off"

#include "Application.inc"

Application::Application()
{
//WinAPI Imports
declare import, Debug alias OutputDebugStringA(string Text);

//Initialise Properties
CurrentDirectory = GetStartPath();

//Setup Screen
Screen.CreateFullScreen(Desktop.GetWidth(), Desktop.GetHeight(), Desktop.GetBitDepth(), True);
DirectInput.Init(Screen);
Camera.Create(Screen);

//Initialise Sprites
Sprites = new(CPointerList, 1);
Sprites->Create();
}

Application::_Application()
{
Sprites->RemoveAll(True);
}

Application::InitialiseSprites(int NumberOfSprites)
{
for(int x = 0; x < NumberOfSprites; x++)
{
Sprites->Add(New(C3DSprite, 1));
}

for(pointer Position = Sprites->GetFirst(); Position <> 0; Position = Sprites->GetNext(Position))
{
C3DSprite *CurrentSprite = Sprites->GetData(Position);
CurrentSprite->SetPosition(Rand(Desktop.GetWidth()), Rand(Desktop.GetHeight()));
}
}

Application::DrawSprites()
{
for(pointer Position = Sprites->GetFirst(); Position <> 0; Position = Sprites->GetNext(Position))
{
C3DSprite *CurrentSprite = Sprites->GetData(Position);
CurrentSprite->Draw();
}
}

Application::WriteDebugText(string Text)
{
Debug(Text);
}

Application::Run()
{

while (!DirectInput.KeyDown(DIK_ESCAPE))
{
Screen.Clear(RGBA(32, 23, 30, 255));
Screen.BeginScene(Camera);

Screen.Begin2D();
DrawSprites();
Screen.End2D();

Screen.RenderScene();
}
}


Main:

#AutoDefine "off"

#include "Application.inc"

global sub main()
{
Application *App = new(Application, 1);
App->InitialiseSprites(20);
App->Run();
}

J B Wood (Zumwalt)


Ionic Wind Support Team

Ionic Wind Support Team

Kale

Quote from: Paul Turley on November 07, 2006, 03:09:50 PM
Where are the sprites loaded?

:o ::)

I'm glad you people are here to keep me sane!

er... it all works now that i've actually loaded the sprites... :-[

Application.src:

#AutoDefine "off"

#include "Application.inc"

Application::Application()
{
//WinAPI Imports
declare import, Debug alias OutputDebugStringA(string Text);

//Initialise Properties
CurrentDirectory = GetStartPath();

//Setup Screen
Screen.CreateFullScreen(Desktop.GetWidth(), Desktop.GetHeight(), Desktop.GetBitDepth(), True);
DirectInput.Init(Screen);
Camera.Create(Screen);

//Initialise Sprites
Sprites = new(CPointerList, 1);
Sprites->Create();
}

Application::_Application()
{
Sprites->RemoveAll(True);
}

Application::InitialiseSprites(int NumberOfSprites)
{
for(int x = 0; x < NumberOfSprites; x++)
{
Sprites->Add(New(C3DSprite, 1));
}

for(pointer Position = Sprites->GetFirst(); Position <> 0; Position = Sprites->GetNext(Position))
{
C3DSprite *CurrentSprite = Sprites->GetData(Position);
CurrentSprite->Load(Screen, CurrentDirectory + "Media\\LogoSmall.png", 128, 128, 1, 0);
CurrentSprite->SetPosition(Rand(Desktop.GetWidth()), Rand(Desktop.GetHeight()));
}
}

Application::DrawSprites()
{
for(pointer Position = Sprites->GetFirst(); Position <> 0; Position = Sprites->GetNext(Position))
{
C3DSprite *CurrentSprite = Sprites->GetData(Position);
CurrentSprite->Draw();
}
}

Application::WriteDebugText(string Text)
{
Debug(Text);
}

Application::Run()
{

while (!DirectInput.KeyDown(DIK_ESCAPE))
{
Screen.Clear(RGBA(32, 23, 30, 255));
Screen.BeginScene(Camera);

Screen.Begin2D();
DrawSprites();
Screen.End2D();

Screen.RenderScene();
}
}


Thanks.... *quietly gets on with work*

Ionic Wind Support Team

You will want to iterate through the list and delete the sprites separately.

Application::_Application()
{
    for(pointer Position = Sprites->GetFirst(); Position <> 0; Position = Sprites->GetNext(Position))
    {
         C3DSprite *s = Sprites->GetData(Position);
         delete s;
    }
    Sprites->RemoveAll(false);
    delete Sprites;
}

The CPointerList is a list of generic VOID pointers.  RemoveAll(true) calls delete on the VOID data pointers which is only useful for intrinsic types, meaning not an allocated class type.

Also delete your 'sprites' pointer as I did, don't want memory leaks.



Ionic Wind Support Team

Kale

Thanks for the reply.

I'm still learning what to clean up manually and what is cleaned up automatically on program end.

I'm loving this though! Coming from a BASIC background feeling as though i had mastered that, it now feels like i'm a noob again learning stuff for the first time. IM LOVING IT!!! As this can only make me a better coder. :D