Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

11

17.10.2010, 21:59

also zu dem Error: er meint damit : "TTF_Init()" und "TTF_Quit()" wären "nicht aufgelöste externe Symbole".
Ich habs auch schon nochmal eingebunden und auf release gings auch nicht...
"Dumm ist, wer dummes tut."

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

12

20.10.2010, 13:58

problem mit "TTF_Init"

Also, das Problem liegt in der Funktion "TTF_Init()".
Wenn ich die ausslashe, kommt kein Error, zumindest erstmal.
er hat nämlich eine "Zugriffsverweigerung" an einer Datei, die Verletzung tritt aber innerhalb der init- Funktion auf...

ich hoffe, das hilft weiter...

MfG RmbRT
"Dumm ist, wer dummes tut."

ich1994

Treue Seele

Beiträge: 164

Wohnort: Erlangen(nähe Nuernberg)

Beruf: Bald Abiturient(kein job eig...)

  • Private Nachricht senden

13

20.10.2010, 22:37

Hier mal meine Header und Dll Files, die bei mir Klappen.
Meine CText Klasse will ich nicht gleich draufkopieren. vllt erst später ;)

http://dl.dropbox.com/u/3765142/SDL.rar

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

14

21.10.2010, 13:57

Error...

es kommt immer noch das gleiche, "Eine Ausnahme (erste Chance) bei 0x01255450 in TowerDefense_02.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000008.
Unbehandelte Ausnahme bei 0x01255450 in TowerDefense_02.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000008.
"

Hier die Text-Funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CSprite *CText::Text(int Size, SDL_Color Color, const char *Text) 
{
    CSprite *pSprite;
    
    SAFE_DELETE(m_pfont);
    m_pfont = TTF_OpenFont("Data/ARIAL.TTF", Size);
    SDL_Color foregroundColor = Color;

    SDL_Color backgroundColor;
    backgroundColor.r = (Uint8)255;    //Hier macht er aus Uint8 einen unsigned char, keine Ahnung weshalb
    backgroundColor.b = (Uint8)220;    //und hier auch.
    backgroundColor.g = (Uint8)210;    //und hier.

    SDL_Surface* textSurface = TTF_RenderText_Shaded(m_pfont, Text, foregroundColor, backgroundColor);    //Hier liefert er "NULL" zurück.
    
    if(textSurface != NULL)
    pSprite->m_pImage = textSurface;
    else                     //"else" tritt ein.
    {
        g_pLogfile->Textout(1,
            "<b>Error: couldn't render \"textSurface\" (CText)</b></br>");
        return 0;
    }

    pSprite->m_Rect.h = pSprite->m_pImage->h;
    pSprite->m_Rect.w = pSprite->m_pImage->w;
    pSprite->m_Rect.x = 0;
    pSprite->m_Rect.y = 0;
    pSprite->m_pScreen = g_pFramework->GetScreen();

    if(!textSurface)
    {
        g_pLogfile->Textout(1,
            "<b>Error: couldn't render \"textSurface\" (CText)</b></br>");
        return 0;
    }
    else
    {
        SDL_FreeSurface( textSurface );
    }


    return( pSprite );





}


der Error kommt bei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// SetColorKey
//
// Aufgabe: Transparente Farbe festlegen
//
void CSprite::SetColorKey (int R, int G, int B)
{
    // Colorkey einstellen
    SDL_SetColorKey (m_pImage, SDL_SRCCOLORKEY,
        SDL_MapRGB (m_pImage->format, R, G, B) );

} // SetColorKey


Edit: manchmal kommt er auch hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void CHud::InitSprite( CSprite *pSprite, const char *Text, int X, int Y)
{
    pSprite = g_pText->Text(Text);
    pSprite->m_Rect.x = X;
    pSprite->m_Rect.y = Y;
    pSprite->SetPos( static_cast<float> ( X ),
                     static_cast<float> ( Y ));
    pSprite->SetColorKey( 255, 220, 210);


}



Weiß jemand weiter? ?(


MfG RmbRT
"Dumm ist, wer dummes tut."

ich1994

Treue Seele

Beiträge: 164

Wohnort: Erlangen(nähe Nuernberg)

Beruf: Bald Abiturient(kein job eig...)

  • Private Nachricht senden

15

21.10.2010, 16:07

Ich glaub, weil SDL_TTF schon ein Surface mit Alpha zurückgibt -> RBG geht nicht. Ich empfehl die eine von Sprite unabhänige Klasse zu machen. Erstens glaube ich, dass es schneller ist und zweitens hast du danach davon mehr.

MfG

Hier hast mal meine Headerdatei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef TEXT_HPP
#define TEXT_HPP

#include "Framework.hpp"
#include <string>
#include <SDL_ttf.h>
class CText
{
public:
    CText(const string Filename,const int Size);
    ~CText();
    void Load(const string Filename,const int Size);//Zum Laden des Fonts
    void SetColor(int R,int G,int B);//Farben setzen
    void SetPos(int X,int Y);//Koordinaten setzen
    void Render();//Rendern
    void SetText(string TextTemp);//den Text setzen
private:
    void Update();
    CText(const CText &TempCText);
    SDL_Surface *Surface;//Der echte Surface
    SDL_Surface *SurfaceText;
    SDL_Color Text_color;//Farbe des Textes
    SDL_Rect Rect;//Koordinaten des Textes
    string Text;//der Text
    TTF_Font *Font;//Font + Größe
};
#endif



Jaja paar unnüzige kommantere ;)

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (21.10.2010, 16:35)


RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

16

21.10.2010, 18:56

Geht immer noch nicht

also hier bekommt er eine "Zugriffsverletzung"( und zwar irgendwie überall?():

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void CText::RenderText( char *Filename, char *Text,int Size, int X, int Y)
{
    SetText(Text);            //das gibt n error
    Load(Filename, Size);     //das macht auch n error
    SetPos(X, Y);             // da gibt's auch n error
    SetTextColor(Black);      //da auch
    Render();
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CText::Render()
{

    m_pScreen = g_pFramework->GetScreen();

    SDL_Surface *Surf = TTF_RenderText_Blended(m_pFont, m_Text, m_TextColor); //Hier gibt's auch ne Zugriffsverletzung


        SDL_FillRect(m_pTextSurface,NULL,
        (SDL_MapRGB (m_pScreen->format, Score.r, Score.g, Score.b)));

    SDL_BlitSurface(Surf, NULL, m_pTextSurface, NULL);

    SDL_BlitSurface(m_pTextSurface, NULL, m_pScreen, &m_Rect);
    SDL_FreeSurface(m_pTextSurface);

}


C-/C++-Quelltext

1
2
3
4
5
6
7
void CText::SetTextColor( int R, int G, int B )
{
    m_TextColor.r = R;    //Zugriffsverletzung
    m_TextColor.g = G;    //hier auch
    m_TextColor.b = B;    //und hier auch

}




Edit: könntest du mir vllt. den quellcode der klasse schicken? bei mir hauts einfach nicht hin...

MfG RmbRT
"Dumm ist, wer dummes tut."

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RmbRT« (21.10.2010, 19:11)


ich1994

Treue Seele

Beiträge: 164

Wohnort: Erlangen(nähe Nuernberg)

Beruf: Bald Abiturient(kein job eig...)

  • Private Nachricht senden

17

21.10.2010, 20:30

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "Text.hpp"


CText::CText(const string Filename,const int Size)
{
    Surface=g_pFramework->GetScreen();
    Text=std::string(" ");
    SDL_Color Temp={1,1,1};
    Text_color=Temp;
    Rect.x=Rect.y=Rect.h=Rect.w=0;
    Font = TTF_OpenFont(Filename.c_str(), Size);
    SurfaceText = TTF_RenderText_Blended(Font,Text.c_str(),Text_color);
}

CText::~CText()
{
    SDL_FreeSurface (Surface);
    SDL_FreeSurface (SurfaceText);
}

void CText::Load(const string Filename,const int Size)
{
    Font = TTF_OpenFont(Filename.c_str(), Size);
    Update();
}

void CText::SetColor(int R,int G,int B)
{
    SDL_Color Temp={R,G,B};
    Text_color=Temp;
    Update();
}

void CText::SetPos(int X,int Y)
{
    Rect.x=X;
    Rect.y=Y;
    Rect.h=Rect.w=1;
    Update();
}

void CText::SetText(string TextTemp)
{
    Text=TextTemp;
    Update();
}

void CText::Render()
{
    if ((SDL_BlitSurface(SurfaceText , NULL, Surface, &Rect    )!= 0))
    {
        cerr << "SDL_BlitSurface() Failed: " << SDL_GetError() << endl;
    }
}

void CText::Update()
{
    SDL_FreeSurface(SurfaceText);
    SurfaceText = TTF_RenderText_Blended(Font,Text.c_str(),Text_color);
}

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

18

22.10.2010, 16:42

Ich weiß jetzt, woher die Zugriffsverletzung kommt.
und zwar habe ich eine Funktion namens "CreateText( const string Filename, const int Size, int R, int G, int B, const string Text)".
Darin werden alle sachen in eine Funktion verpackt. nun kommt es aber zu der Zugriffsverletzung in der "Output.c", wenn ich versuche,
einen "char *" per "sprintf" einen Wert zuzuweisen, also:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void CHud::InitSprite( CText *pText, string Text, int X, int Y)
{
    pText->CreateText("ARIAL.TTF", 24, 255, 255, 0, Text);
}

void CHud::UpdateSprites()
{
    char *Lifes   = " ";
    char *Score   = " ";
    char *Level   = " ";
    char *Money   = " ";
    char *CreepHP = " ";

                  //ERROR
    sprintf( Lifes, "Lifes: %i", g_pGame->m_Lives );
    sprintf( Score, "Score: %i", (g_pGame->m_Lives * g_pGame->m_Level));
    sprintf( Level, "Level: %i", g_pGame->m_Level);
    sprintf( Money, "Money: %i", g_pGame->m_Money );
    sprintf( CreepHP, "Creep HP: %i", g_pGame->m_HP);


    InitSprite( m_pLifes, Lifes, 820, 60);
    InitSprite( m_pScore, Score, 820, 160);
    InitSprite( m_pLevel, Level, 820, 260);
    InitSprite( m_pMoney, Money, 820, 360);
    InitSprite( m_pCreepHP, CreepHP, 820, 460);

}



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CText::CreateText(const string Filename, const int Size, int R, int G, int B, string TempText)
{
    
    Load(Filename, Size);
    SetColor( R, G, B);
    SetPos( 0, 0 );
    SetText(TempText);
    Render();
}



Weiß jemand weiter???

EDIT: Ich bin mir unsicher, wie ich auf die Klasse richtig zugreife(Reihenfolge). Und kann es sein, dass das nicht so gut funktioniert, wenn man das ganze
über einen CText-Zeiger macht?

MfG RmbRT
"Dumm ist, wer dummes tut."

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

19

22.10.2010, 16:52

Ja, das ist tödlich. Mit der Zeile

Quellcode

1
char* blubb = " ";


erzeugst Du nur einen Zeiger auf chars und initialisierst den dann mit der Adresse der Zeichenkette " ". Zeichenketten, die im Code angegeben sind, werden vom Compiler mit in die Exe eingebettet - und noch dazu je nach Optimierungsstufe nur einmal, egal wie oft der selbe Text im Code vorkommt. Du legst in Deinem Code-Ausschnitt also fünf char-Zeiger an, die jeweils auf die selbe 2 chars große Zeichenkette zeigen! Und dann schreibst Du da mit sprintf() rein. Jeder Schreibversuch muss da bereits abstürzen, weil der Zielspeicher wie gesagt in der eigenen Exe liegt. Und selbst, wenn der Rechner Dir das durchgehen lassen würde, wäre der Zielspeicher nur 2 Byte groß, nämlich ein Leerzeichen und ein Nullbyte als Endmarkierung.

Was Du also mindestens machen musst, damit der Code überhaupt funktioniert, ist das Austauschen aller char* an dieser Stelle durch char blubb[20] - vorausgesetzt, deine ausgegebenen Texte sind immer kleiner als 20 Zeichen. Ich persönlich würde aber, wenn die Rechenzeit nicht sooo kritisch ist, eher das von mir sehr geschätzte Boost rausholen:

Quellcode

1
  std::string livesText = boost::lexical_cast<std::string> (g_pGame->m_Lives);


Dass Du Dir bei diesen Namen nicht die Finger beim Tippen brichst... :-)
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

20

22.10.2010, 17:05

woher kommpt das "boost"?
bei mir findet er's nicht. was muss ich da einbinden?
"Dumm ist, wer dummes tut."

Werbeanzeige