Problems with my own EventReceiver

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
gerdb
Posts: 194
Joined: Wed Dec 02, 2009 8:21 pm
Location: Dresden, Germany

Problems with my own EventReceiver

Post by gerdb »

Hi,

i wrote a small program to test the EventReceiver and Logger from Irrlicht, but it doesnt work, and i dont know why

the EventReceiver shall process all LogEvents and write them to a html logfile.

Therefore i once create the file (constructor) and then always reopen (append) the file, write to it and close everytime an event occurs.

is this right?

The Program stopps without reason after some written Events, no matter if mouse or key events.

I also dont know when i have to return false or true within the OnEvent Method.

further questions:
- is something wrong with my dbPrint functions?
- why is my info-text for keyEvents so messed up? (i chose UTF8 Fileencoding, so cout should work, but!) html needs to replace special chars, but cant for now
- why is the LogEvent.Text member just a char* pointer, when there is a wchar_t method ???? --- > logger->log(wchar_t* txt, ...)
- how can i convert a wchar_t (KeyEvent.Char) to print with LogEvent.Text (Type char*)

pls help, i got no idea.

thx in advance

here is the code.

Code: Select all

////!#############################################################################
////!
////!                                   (c) 2011 by BenjaminHampe@gmx.de
////!
////!#############################################################################
//
#define _IRR_STATIC_LIB_
#include <irrlicht.h>
 
using namespace irr;
using namespace core;
using namespace gui;
using namespace video;
using namespace scene;
using namespace io;
 
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <ctime>
#include <stdio.h>
#include <stdarg.h> // für dbPrint(const wchar_t* formatString, ...) mit variabler Parameterzahl [...]
#include <time.h>
using namespace std;
 
#include <GL/gl.h>
#include <GL/glu.h>
 
 
#ifndef _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_DEPRECATE
#endif
 
#ifndef SAVE_DROP
        #define SAVE_DROP(x) {if((x)){(x)->drop();(x)=0;}}
#endif
 
#ifndef SAVE_DELETE
        #define SAVE_DELETE(x) {if((x)){delete (x); (x)=0;}}
#endif
 
// makro Any Code Name to printable String per concat preprocessor command '#'
// small but insanely important little helper
//
#define mStr( name ) # name
 
// hardcoded EKEY_CODE Values as Strings
const char* const keyNames[] =
 {
 mStr( KEY_LBUTTON ),
 mStr( KEY_RBUTTON ),
 mStr( KEY_CANCEL ),
 mStr( KEY_MBUTTON ),
 mStr( KEY_XBUTTON1 ),
 mStr( KEY_XBUTTON2 ),
 mStr( KEY_BACK ),
 mStr( KEY_TAB ),
 mStr( KEY_CLEAR ),
 mStr( KEY_RETURN ),
 mStr( KEY_SHIFT ),
 mStr( KEY_CONTROL ),
 mStr( KEY_MENU ),
 mStr( KEY_PAUSE ),
 mStr( KEY_CAPITAL ),
 mStr( KEY_KANA ),
 mStr( KEY_HANGUEL ),
 mStr( KEY_HANGUL ),
 mStr( KEY_JUNJA ),
 mStr( KEY_FINAL ),
 mStr( KEY_HANJA ),
 mStr( KEY_KANJI ),
 mStr( KEY_ESCAPE ),
 mStr( KEY_CONVERT ),
 mStr( KEY_NONCONVERT ),
 mStr( KEY_ACCEPT ),
 mStr( KEY_MODECHANGE ),
 mStr( KEY_SPACE ),
 mStr( KEY_PRIOR ),
 mStr( KEY_NEXT ),
 mStr( KEY_END ),
 mStr( KEY_HOME ),
 mStr( KEY_LEFT ),
 mStr( KEY_UP ),
 mStr( KEY_RIGHT ),
 mStr( KEY_DOWN ),
 mStr( KEY_SELECT ),
 mStr( KEY_PRINT ),
 mStr( KEY_EXECUT ),
 mStr( KEY_SNAPSHOT ),
 mStr( KEY_INSERT ),
 mStr( KEY_DELETE ),
 mStr( KEY_HELP ),
 mStr( KEY_KEY_0 ),
 mStr( KEY_KEY_1 ),
 mStr( KEY_KEY_2 ),
 mStr( KEY_KEY_3 ),
 mStr( KEY_KEY_4 ),
 mStr( KEY_KEY_5 ),
 mStr( KEY_KEY_6 ),
 mStr( KEY_KEY_7 ),
 mStr( KEY_KEY_8 ),
 mStr( KEY_KEY_9 ),
 mStr( KEY_KEY_A ),
 mStr( KEY_KEY_B ),
 mStr( KEY_KEY_C ),
 mStr( KEY_KEY_D ),
 mStr( KEY_KEY_E ),
 mStr( KEY_KEY_F ),
 mStr( KEY_KEY_G ),
 mStr( KEY_KEY_H ),
 mStr( KEY_KEY_I ),
 mStr( KEY_KEY_J ),
 mStr( KEY_KEY_K ),
 mStr( KEY_KEY_L ),
 mStr( KEY_KEY_M ),
 mStr( KEY_KEY_N ),
 mStr( KEY_KEY_O ),
 mStr( KEY_KEY_P ),
 mStr( KEY_KEY_Q ),
 mStr( KEY_KEY_R ),
 mStr( KEY_KEY_S ),
 mStr( KEY_KEY_T ),
 mStr( KEY_KEY_U ),
 mStr( KEY_KEY_V ),
 mStr( KEY_KEY_W ),
 mStr( KEY_KEY_X ),
 mStr( KEY_KEY_Y ),
 mStr( KEY_KEY_Z ),
 mStr( KEY_LWIN ),
 mStr( KEY_RWIN ),
 mStr( KEY_APPS ),
 mStr( KEY_SLEEP ),
 mStr( KEY_NUMPAD0 ),
 mStr( KEY_NUMPAD1 ),
 mStr( KEY_NUMPAD2 ),
 mStr( KEY_NUMPAD3 ),
 mStr( KEY_NUMPAD4 ),
 mStr( KEY_NUMPAD5 ),
 mStr( KEY_NUMPAD6 ),
 mStr( KEY_NUMPAD7 ),
 mStr( KEY_NUMPAD8 ),
 mStr( KEY_NUMPAD9 ),
 mStr( KEY_MULTIPLY ),
 mStr( KEY_ADD ),
 mStr( KEY_SEPARATOR ),
 mStr( KEY_SUBTRACT ),
 mStr( KEY_DECIMAL ),
 mStr( KEY_DIVIDE ),
 mStr( KEY_F1 ),
 mStr( KEY_F2 ),
 mStr( KEY_F3 ),
 mStr( KEY_F4 ),
 mStr( KEY_F5 ),
 mStr( KEY_F6 ),
 mStr( KEY_F7 ),
 mStr( KEY_F8 ),
 mStr( KEY_F9 ),
 mStr( KEY_F10 ),
 mStr( KEY_F11 ),
 mStr( KEY_F12 ),
 mStr( KEY_F13 ),
 mStr( KEY_F14 ),
 mStr( KEY_F15 ),
 mStr( KEY_F16 ),
 mStr( KEY_F17 ),
 mStr( KEY_F18 ),
 mStr( KEY_F19 ),
 mStr( KEY_F20 ),
 mStr( KEY_F21 ),
 mStr( KEY_F22 ),
 mStr( KEY_F23 ),
 mStr( KEY_F24 ),
 mStr( KEY_NUMLOCK ),
 mStr( KEY_SCROLL ),
 mStr( KEY_LSHIFT ),
 mStr( KEY_RSHIFT ),
 mStr( KEY_LCONTROL ),
 mStr( KEY_RCONTROL ),
 mStr( KEY_LMENU ),
 mStr( KEY_RMENU ),
 mStr( KEY_PLUS ),
 mStr( KEY_COMMA ),
 mStr( KEY_MINUS ),
 mStr( KEY_PERIOD ),
 mStr( KEY_ATTN ),
 mStr( KEY_CRSEL ),
 mStr( KEY_EXSEL ),
 mStr( KEY_EREOF ),
 mStr( KEY_PLAY ),
 mStr( KEY_ZOOM ),
 mStr( KEY_PA1 ),
 mStr( KEY_OEM_CLEAR ),
 mStr( KEY_KEY_CODES_COUNT )
 };
 
// OPERATOR OVERLOADS for IRRLICHT STRING TYPES
 
inline ostream& operator<<(ostream& out, const stringc& txt)
{
        out<<txt.c_str();
        return out;
}
inline ostream& operator<<(ostream& out, const stringw& txt)
{
        out<<txt.c_str();
        return out;
}
 
inline stringc dbPrint(const char* formatString, ...)
{
    va_list p;
    va_start(p,formatString);
    char tmp[1024];
    vsnprintf(&(tmp[0]), 1024, formatString, p);
    va_end(p);
    stringc s = tmp;
    return s;
}
 
inline stringw dbPrint(const wchar_t* formatString, ...)
{
    va_list p;
    va_start(p,formatString);
    wchar_t tmp[1024];
    vsnwprintf(&(tmp[0]), 1024, formatString, p);
    va_end(p);
    stringw s = tmp;
    return s;
}
 
 
SIrrlichtCreationParameters params;
IrrlichtDevice* device;
ILogger* logger;
IVideoDriver* driver;
IVideoModeList* display;
IGUIEnvironment* guienv;
ISceneManager* smgr;
IOSOperator* os;
IFileSystem* fs;
vector3di desktop;
vector3di screen;
bool hasOpenGL;
bool hasNonPowerOf2Textures;
bool hasNonQuadraticTextures;
dimension2du maxTextureSize;
 
///
/// class Stopuhr
///
class Uhr
{
public:
    Uhr(){}
    ~Uhr(){}
 
    static stringc getTime()
    {
        stringc s("");
        time_t tmNow;
        time(&tmNow);
        tm* p = localtime(&tmNow);
        if (p)
        {
            s+=(1900+p->tm_year); s+="."; if (p->tm_mon<9) s+="0";
            s+=(1+p->tm_mon); s+=".";  if (p->tm_mday<10) s+="0";
            s+=p->tm_mday; s+=" "; if (p->tm_hour<10) s+="0";
            s+=p->tm_hour; s+=":"; if (p->tm_min<10) s+="0";
            s+=p->tm_min; s+=":"; if (p->tm_sec<10) s+="0";
            s+=p->tm_sec; s+=" DST"; s+=(p->tm_isdst);
        }
        SAVE_DELETE(p);
        return s;
    }
};
 
class CMasterEventReceiver : public IEventReceiver
{
public:
    path logFileName;
    array<bool> keys;
 
        /// Default constructor
        CMasterEventReceiver(const path& logfile = "CMasterEventReceiver.html")
        : logFileName(logfile), keys(KEY_KEY_CODES_COUNT)
        {
            // set all keys to 'not pressed'
            for (u32 i=0; i<KEY_KEY_CODES_COUNT; i++)
                 keys[i] = false;
 
            // open htmllogfile
            ofstream ooo(logFileName.c_str(), ios::out);
            if (ooo.is_open())
            {
                ooo<<"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
                <<"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
                <<"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
                <<"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />\n"
                <<"<title>"<<logFileName<<"(c) 2008 - 2011 by BenjaminHampe@gmx.de</title>\n<style type=\"text/css\">\n"
                <<"body {background-color:#000000; color:#FFFFFF; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; }\n"
                <<"date {color:#FF8F40; font-weight:900; font-size:10px; margin-right:20px;}\n"
                <<"warn {color:#FFFF00;}\n"
                <<"info {color:#FFFFFF;}\n"
                <<"error {color:#FF0000;}\n"
                <<"none {color:#00FF00;}\n"
                <<"</style>\n</head>\n<body>\n";
                ooo.close();
            }
        }
 
        /// Default destructor
        ~CMasterEventReceiver()
        {
            // close filestream
            ofstream ooo(logFileName.c_str(), ios::app);
            if (ooo.is_open())
            {   ooo<<"</body>\n</html>\n";
                ooo.close();
            }
        }
 
        virtual bool OnEvent(const SEvent& event)
        {
            //handle Log Events
            if (event.EventType == EET_LOG_TEXT_EVENT)
            {
                // log normal ascii string
                stringc t = Uhr::getTime();   // pure datetime string
                stringc c = t; c+=" "; c+=event.LogEvent.Text; // why is LogEvent.Text a char and not wchar_t ???
                stringc h("<date>"); h+=t; h+="</date>"; // html datetime tag string
 
                switch (event.LogEvent.Level)
                {
                    // case ELL_NONE: h+="<none>"; h+=event.LogEvent.Text; h+="</none>"; break;
                    case ELL_INFORMATION: h+="<info>"; h+=event.LogEvent.Text; h+="</info>"; break;
                    case ELL_WARNING: h+="<warn>"; h+=event.LogEvent.Text; h+="</warn>"; break;
                    case ELL_ERROR: h+="<error>"; h+=event.LogEvent.Text; h+="</error>"; break;
                    default: break;
                }
 
                // write to file
                ofstream o(logFileName.c_str(), ios::app);
                if (o.is_open())
                {   o<<h.c_str()<<"<br/>\n"; // new line
                    o.close();
                }
 
                return false; // is this right???
            }
 
            // handle Keyboard Events
            if (event.EventType == EET_KEY_INPUT_EVENT)
            {
                keys[event.KeyInput.Key] = event.KeyInput.PressedDown;
 
                if (logger)
                    logger->log(dbPrint(L"Taste %d gedrückt, %hs", event.KeyInput.Key,
                                        keyNames[event.KeyInput.Key]).c_str(), ELL_INFORMATION);
 
                if (keys[KEY_ESCAPE]) device->closeDevice(); // right??
 
                return false; // is this right???
            }
 
            // handle Mouse Events
            if (event.EventType == EET_MOUSE_INPUT_EVENT)
            {
                if (logger)
                {
                    s32 x = event.MouseInput.X;
                    s32 y = event.MouseInput.Y;
                    f32 w = event.MouseInput.Wheel;
                    bool l = event.MouseInput.isLeftPressed();
                    bool m = event.MouseInput.isMiddlePressed();
                    bool r = event.MouseInput.isRightPressed();
                    logger->log(dbPrint("Mouse X=%d, Y=%d, Left=%d, Middle=%d, Right=%d, Wheel=%f", x,y,l,m,r,w).c_str(), ELL_INFORMATION);
                }
 
                return false;
 
            }
 
            return false;
        }
};
 
// console window
int main(int argc, char** argv)
{
    cout << dbPrint("IrrlichtTest by %s %d.%d.%d...", "BenjaminHampe@gmx.de", 2011, 8, 1) << endl;
 
    device = createDevice(EDT_OPENGL, dimension2du(1024,768), 32, false, true, true);
    if (!device)
    {
        cerr << dbPrint("Error creating OpenGL Device! Exit now...")<<endl;
        exit(1);
    }
    device->setResizable(true);
    logger = device->getLogger();
    driver = device->getVideoDriver();
    display = device->getVideoModeList();
    smgr = device->getSceneManager();
    guienv = device->getGUIEnvironment();
    os = device->getOSOperator();
    fs = device->getFileSystem();
 
    CMasterEventReceiver receiver;
    device->setEventReceiver(&receiver);
//    device->run();
 
    if (logger)
    {   logger->log("Hello World", ELL_ERROR);
        logger->log("Hello World", ELL_INFORMATION);
        logger->log("Hello World", ELL_WARNING);
        logger->log(L"Hello World", ELL_ERROR);
        logger->log(L"Hello World", ELL_INFORMATION);
        logger->log(L"Hello World", ELL_WARNING);
    }
 
    while (device->run())
    {
//        if (device->isWindowActive())
//        {
            driver->beginScene();
            smgr->drawAll();
            guienv->drawAll();
            driver->endScene();
//        }
//        else
//        {
//            device->yield();
//        }
    }
    device->closeDevice();
        return 0;
}
 
 
WaxyChicken
Posts: 95
Joined: Sat Jun 25, 2011 6:15 am

Re: Problems with my own EventReceiver

Post by WaxyChicken »

.

I may not be right on this, but it's how i understand it.

You return false if it's an event you DON'T want to catch and want to leave to the default event handler.

for example:
If you're only trying to catch the written log then:

Code: Select all

 
if ( eve.EventType == EET_LOG_TEXT_EVENT )
        {
                return true;
        }
if ( eve.EventType != EET_LOG_TEXT_EVENT )
        {
                return false;
        }
 
i chose UTF8 File-encoding, so cout should work, but!
can't you just make it an ASCII text file?

i notice you have Escape bound to close the device in your event handler.
So someone pushes escape, this will set Device->Run() to false, ending your game loop.
then you try and close the device again after the loop (when it's already closed)
doesn't this cause an error?

I also note that you are constantly opening and closing the file in your event log.
Why not just open it at the start of your program and close it at the end of your program?
it MAY be possible that multiple events are being raised at the same time.
So one instance of the event handler writes MouseX & Y and closes it while
another instance of the event handler is in the middle of trying to write which key is pressed
but can't because the file was closed in process.


just trying to contribute.
_______________________________________________________
You could argue with me all day long about which language is best.
But what it comes down to is:
which language is best for YOU and which language is best for ME.
gerdb
Posts: 194
Joined: Wed Dec 02, 2009 8:21 pm
Location: Dresden, Germany

Re: Problems with my own EventReceiver

Post by gerdb »

hi, im looking forward for any contribution to learn the basics,
so i thank you very much so far.

Is the default event handler called before or after my event receiver?

For the processed LogEvent, i think i should return true, but i dont understand the negated statement of yours:

"if (!EET_LOG_TEXT_EVENT) return false,

wouldnt that be ever called, and therefore not be correct?

Your advice with multiple Events at a time sounds interesting and could fit to the occured errors,
but i dont understand how this could happen, because i always return, after one event has processed.

UTF8 is for German Umlaute like ÄÖÜß, my compiler does complain if pure ASCII ! (7bit?)

Is the constantly reopen and closing of a stream a error source?

thx

EDIT: if i should have a const open filestream, in what way do i store it: as reference or pointer or auto_ptr, what would be best?
WaxyChicken
Posts: 95
Joined: Sat Jun 25, 2011 6:15 am

Re: Problems with my own EventReceiver

Post by WaxyChicken »

most of those questions are beyond me - i'm actualy a VB guy.
But my understanding of the event receiver is:

(IF you have your own declared)

Device receives event -> did custom event receiver handle it? false? then -> use default receiver

if i am wrong, then it replaces the default event receiver with your custom event receiver.

if ( eve.EventType != EET_LOG_TEXT_EVENT )
or, as you say
if (!EET_LOG_TEXT_EVENT) return false;

is "If an event of this type (in the example LOG_TEXT_EVENT), then say "no, i didn't handle this event. it's FALSE"
if it does both event receivers instead of replacing with yours then that is where it comes in handy.
Your advice with multiple Events at a time sounds interesting and could fit to the occured errors,
but i dont understand how this could happen, because i always return, after one event has processed.
the question is - does the engine thread the actions that are called when events are triggered?
if so then:
Event received = start a thread of this EventReciver
event recived = Start a thread of this EventReciver (even if the other thread didn't finish yet)

(in theory only:)
for logging what you may want to do is something Similar To:

Code: Select all

 
create string type of "File Output Data"
 
event received -> add this to the String of File_Output_Data (this is much quicker than opening, writing, closing)
event recived -> add this to the String of File_Output_Data 
 
open output file
         main loop - 
                 if (data inside File_Ouput_Data) {
                            write the data to the file
                            empty File_Output_Data
                  }
           end main loop
close output file
 
See if that works out for you. if not then i'm out of ideas because of our differences in language.
_______________________________________________________
You could argue with me all day long about which language is best.
But what it comes down to is:
which language is best for YOU and which language is best for ME.
serengeor
Posts: 1712
Joined: Tue Jan 13, 2009 7:34 pm
Location: Lithuania

Re: Problems with my own EventReceiver

Post by serengeor »

WaxyChicken wrote:.
for example:
If you're only trying to catch the written log then:

Code: Select all

 
if ( eve.EventType == EET_LOG_TEXT_EVENT )
        {
                return true;
        }
if ( eve.EventType != EET_LOG_TEXT_EVENT )
        {
                return false;
        }
 
Bad idea since any other events that you would try to handle bellow would not be handled because of the 'return false'.
'return false' should be last thing on 'onEvent' function.
Working on game: Marrbles (Currently stopped).
gerdb
Posts: 194
Joined: Wed Dec 02, 2009 8:21 pm
Location: Dresden, Germany

Re: Problems with my own EventReceiver

Post by gerdb »

i almost solved it

ERRORs were:

1. my timer class was really shitty and crashed
2. my enumeration to string function for EKEY_CODES could not work, because the EKEY_CODE enum does not have 255 entries, so the missing entries caused my function to crash

PROBLEMS

3. German Umlaute in console dont work so far directly, i solved it with char constants, but i need a possibility to directly stream strings to cout with special chars
4. the conversion from Keyboard Chars to HTML #Uuml; needs a string-replace function, that irrlicht core::string<T> dont provide (really beyond repair at my point of view)

i need a funtion like:

Code: Select all

 
void stringc.replace(const core::stringc<T>& findTok, const core::stringc<T>& replaceTok);
 
have fun.

EDIT: i dont understand why i cant post my new code here? Are there too many lines? Are german characters bothering the server? WTF is this? The source has 706 lines and 22kByte so whats the problem

UPDATE: Project in a Rarshell

http://gerdb.ge.ohost.de/IrrlichtLogger.rar

compiled with xp, codeblocks, mingw450 and irrlicht

have fun
CuteAlien
Admin
Posts: 9926
Joined: Mon Mar 06, 2006 2:25 pm
Location: Tübingen, Germany
Contact:

Re: Problems with my own EventReceiver

Post by CuteAlien »

gerdb wrote: EDIT: i dont understand why i cant post my new code here? Are there too many lines? Are german characters bothering the server? WTF is this? The source has 706 lines and 22kByte so whats the problem
Too long makes sense. As hint - if you start posting several hundred lines of code in a forum you're already doing it wrong. Reduce your problems always to the minimum code necessary to reproduce whatever bothers you before posting it on a forum.
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
gerdb
Posts: 194
Joined: Wed Dec 02, 2009 8:21 pm
Location: Dresden, Germany

Re: Problems with my own EventReceiver

Post by gerdb »

hi,

i thought this forum is for exchanging knowlegde and irrlicht code,

restricting this such hard (22 kByte is nothing, my avatar can have more) is just embarrassing, and stops people from evolving more quickly in programming.

I have no time in reducing amount and complexity of code just to fit the webservers unbalanced settings.

feel free and try reducing my code, and all you get, is another program, not mine.

By the way, the code window is too small for my taste.

h.a.n.d.
CuteAlien
Admin
Posts: 9926
Joined: Mon Mar 06, 2006 2:25 pm
Location: Tübingen, Germany
Contact:

Re: Problems with my own EventReceiver

Post by CuteAlien »

If even you don't have the time to reduce your own code to the problem - how much time do you expect others will need to understand it? Reading code from other people is _way_ harder than reading and reducing your own code. And every additional line you post reduced the motivation for other people to try understanding what your code is about.

Just trying to help you writing post where people actually can try to help you. I don't think there is anyone enjoying reading several hundred lines code-bombs.

And I don't get what you mean when you say the code window is too small. At least with my browser it is as large as the other forum-text (well a few pixels less because of the border-line) and it resizes anyway to as large as your screen allows. But maybe it's different with the other forum-theme or another browser.
IRC: #irrlicht on irc.libera.chat
Code snippet repository: https://github.com/mzeilfelder/irr-playground-micha
Free racer made with Irrlicht: http://www.irrgheist.com/hcraftsource.htm
Lonesome Ducky
Competition winner
Posts: 1123
Joined: Sun Jun 10, 2007 11:14 pm

Re: Problems with my own EventReceiver

Post by Lonesome Ducky »

You could always use pastebin and post a link to it. I'll agree with CuteAlien here that we don't want to go through hundreds of lines of code, though.
Brkopac
Posts: 88
Joined: Fri Sep 19, 2008 2:36 am

Re: Problems with my own EventReceiver

Post by Brkopac »

gerdb wrote:hi,

i thought this forum is for exchanging knowlegde and irrlicht code,
It is.
gerdb wrote: restricting this such hard (22 kByte is nothing, my avatar can have more) is just embarrassing, and stops people from evolving more quickly in programming.
Hundred line code examples for debugging don't really serve a significant purpose.
gerdb wrote: I have no time in reducing amount and complexity of code just to fit the webservers unbalanced settings.
I have no time helping somebody who can't be bothered to help himself.
gerdb wrote: feel free and try reducing my code, and all you get, is another program, not mine.
No.
gerdb wrote: By the way, the code window is too small for my taste.
qq
Image - The glory days.
Post Reply