PDA

Vollständige Version anzeigen : An alle C++ Profis, habe Kompilierungsfehler


Antr4ks.de
10-07-2003, 21:24
Hi Leutz, bin grad an nem Mod für Half-Life dran, hab n bisschen im Netz gesucht und echt gute Skripte gefunden. Da hab ich auch ein Skript wie man n Flammenwerfer erstellt. Nur leider hab ichs SDK 2.3 und das Skript wurde sicher für n früheres geschrieben, deshalb bekam ich auch n paar Fehler. Die meisten hab ich gefixt, doch jetzt ist noch ein Fehler da, den ich nicht wegkrieg.
Hier ist erstmal der Code vom Flammenwerfer:


flamethrower.cpp
---------------------------------------------------------------------------------

//zuerst mal die ganzen includes...
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
#include "shake.h" //braucht man nur, wenn man den Spieler beim Auslösen durchschütteln will

//Hier fängt der spannende Teil an: Meine Flamme besteht aus (bis zu 15) "Feuerbällen". Die werden hier "gemacht".
class CFireBall : public CBaseEntity
{
void Spawn( void );
void Precache( void );
void EXPORT AnimateThink( void );
void EXPORT ExplodeTouch( CBaseEntity *pOther );

EHANDLE m_hOwner;

public:
static CFireBall *BallCreate( void );

};


LINK_ENTITY_TO_CLASS( fire_ball, CFireBall );

//Hiermit wird ein neuer Feuerball erstellt...
CFireBall *CFireBall::BallCreate( void )
{
CFireBall *pBall = GetClassPtr( (CFireBall *)NULL );
pBall->pev->classname = MAKE_STRING("fireball");
pBall->Spawn();

return pBall;
}


void CFireBall :: Spawn( void )
{
Precache( );
pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_BBOX;

SET_MODEL(ENT(pev), "sprites/xspark4.spr");
pev->rendermode = kRenderTransAdd;
pev->rendercolor.x = 255;
pev->rendercolor.y = 255;
pev->rendercolor.z = 255;
pev->renderamt = 255;
pev->scale = 0.2;

UTIL_SetSize(pev, Vector( 0, 0, 0), Vector(0, 0, 0));
UTIL_SetOrigin( pev, pev->origin );

SetThink( AnimateThink ); //Das wird jetzt immer wieder ausgeführt...

//Wenn man beim Auftreffen der Bälle irgendwas machen will (Sound, anderes Sprite),
//muss man die nächste Zeile wieder ent-kommentieren
// SetTouch( ExplodeTouch );

m_hOwner = Instance( pev->owner );
pev->dmgtime = gpGlobals->time; // keep track of when ball spawned
pev->nextthink = gpGlobals->time + 0.03;
}


void CFireBall :: Precache( void )
{
PRECACHE_MODEL("sprites/xspark4.spr"); //wir brauchen bloß ein Sprite
}


void CFireBall :: AnimateThink( void )
{
pev->nextthink = gpGlobals->time + 0.05; //das nächste Mal in einer zwanzigstel Sekunde ausführen

pev->frame = ((int)pev->frame + 1) % 11; //Das Sprite ein bischen animieren...
pev->scale = pev->scale * 1.5; //Ganz wichtig: hier wird das Sprite vergrößert
//Am Anfang ist es ganz klein und wird dann immer größer

entvars_t *pevOwner;
if ( pev->owner )
pevOwner = VARS( pev->owner );
else
pevOwner = NULL;
pev->owner = NULL; // can't traceline attack owner if this is set

RadiusDamage( pev->origin, pev, pevOwner, 1, pev->scale * 10, CLASS_NONE, DMG_BURN );
//Hier richten wir dann den Schaden an. Der Ausmaß orientiert sich auch ander Größe des Sprites
//Pro Feuerball ziehe ich hier einen Lebenspunkt ab. Bei 30 Feuerbällen pro Sekunde ist das nicht wenig. Man kann es natürlich noch erhöhen...

//Wenn das Sprite länger als eine halbe Sekunde lebt, wird es hier zerstört.
if (gpGlobals->time - pev->dmgtime > 0.5 || pev->velocity.Length() < 10)
{
SetTouch( NULL );
UTIL_Remove( this );
}
}


void CFireBall::ExplodeTouch( CBaseEntity *pOther )
{

//Wenn man das weiter oben aktiviert hat kann man hier seinen Code reinschreiben...

UTIL_Remove( this );
}



//Hier fängt endlich die eigentliche Waffe an!





LINK_ENTITY_TO_CLASS( weapon_flamethrower, CFlamethrower ); //Unsere Waffe heißt "weapon_flamethrower"

//Ich verwende das Model der Egon. Passt eigentlich ganz gut.
enum egon_e {
EGON_IDLE1 = 0,
EGON_FIDGET1,
EGON_ALTFIREON,
EGON_ALTFIRECYCLE,
EGON_ALTFIREOFF,
EGON_FIRE1,
EGON_FIRE2,
EGON_FIRE3,
EGON_FIRE4,
EGON_DRAW,
EGON_HOLSTER
};

int CFlamethrower::AddToPlayer( CBasePlayer *pPlayer ) //langweilig, aber nötig...
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}

void CFlamethrower::Spawn( ) //Hier wird das Model zum Aufsammeln gespawned
{
Precache( );
m_iId = 16;
SET_MODEL(ENT(pev), "models/w_egon.mdl");
m_iClip = 20;
FallInit();
}

void CFlamethrower::Precache( void )
{
//Wir brauchen drei Models (wie für jede Waffe)
PRECACHE_MODEL("models/w_egon.mdl");
PRECACHE_MODEL("models/v_egon.mdl");
PRECACHE_MODEL("models/p_egon.mdl");

//Und zwei Sounds. Die müsst ihr schon selber machen.
PRECACHE_SOUND("weapons/flamethrower.wav"); //FLAMMENWERFER AKTIV
PRECACHE_SOUND("weapons/flameout.wav"); //FLAMME STIRBT

//Das ist ganz wichtig; wir brauchen für unsere Waffe Feuerbälle
UTIL_PrecacheOther( "fire_ball" );

}
int CFlamethrower::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "uranium"; //wir verwenden die gleiche Muni wie für Egon und Gauss. Könnt ihr ändern.
p->iMaxAmmo1 = URANIUM_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = WEAPON_NOCLIP;
p->iSlot = 0; //Ich hab die Waffe direkt unter die Brechstange gesetzt. Wollt ihr sicher auch ändern.
p->iPosition = 1;
p->iId = m_iId = 16;
p->iFlags = 0;
p->iWeight = EGON_WEIGHT;
return 1;
}


BOOL CFlamethrower::Deploy( void )
{
return DefaultDeploy( "models/v_egon.mdl", "models/p_egon.mdl", EGON_DRAW, "egon" );
}

void CFlamethrower::Holster( int skiplocal /* = 0 */ )
{
SendWeaponAnim( EGON_HOLSTER );
}

//Aha, jetzt wirds ernst.

void CFlamethrower::PrimaryAttack()
{
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
return; //Pech, Ammo ist leer...

if (!Working) {m_flAmmoUseTime = gpGlobals->time;} //Wenn wir gerade erst anschalten -> zieh gleich mal ein Ammo ab!
m_flTimeWeaponIdle = gpGlobals->time + 0.1;
m_flNextPrimaryAttack = gpGlobals->time + 0.1; //sollte klar sein
SendWeaponAnim( EGON_FIRE4 ); //sucht euch eine aus..
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_STATIC, "weapons/flamethrower.wav", 0.98, ATTN_NORM, 0, 125 ); //unser Sound läuft
Working = TRUE;

if ( gpGlobals->time >= m_flAmmoUseTime ) //Zieh ein Ammo ab, wenn die Zeit reif ist
{
UseAmmo( 1 );
m_flAmmoUseTime = gpGlobals->time + 0.2;
}

Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
UTIL_MakeVectors( anglesAim );
anglesAim.x = -anglesAim.x;
Vector vecSrc = m_pPlayer->GetGunPosition( ) - gpGlobals->v_up * 2; //Wo wir sind..
Vector vecDir = gpGlobals->v_forward; // ..und wo wir hinwollen!

float delta = 0.06976; //8 Grad Abweichung..

//Jetzt werden drei Feuerbälle ertellt. Alle mit zufälliger Abweichung und Geschwindigkeit

vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) );
CFireBall *pBall1 = CFireBall::BallCreate();
pBall1->pev->origin = vecSrc;
pBall1->pev->angles = anglesAim;
pBall1->pev->owner = m_pPlayer->edict();
pBall1->pev->velocity = vecDir * RANDOM_FLOAT( 400, 600 );

vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) );
CFireBall *pBall2 = CFireBall::BallCreate();
pBall2->pev->origin = vecSrc;
pBall2->pev->angles = anglesAim;
pBall2->pev->owner = m_pPlayer->edict();
pBall2->pev->velocity = vecDir * RANDOM_FLOAT( 400, 600 );

vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) );
CFireBall *pBall3 = CFireBall::BallCreate();
pBall3->pev->origin = vecSrc;
pBall3->pev->angles = anglesAim;
pBall3->pev->owner = m_pPlayer->edict();
pBall3->pev->velocity = vecDir * RANDOM_FLOAT( 400, 600 );
}


//der WeaponIdle wird etwas Zweckentfremdet. Hier stellen wir fest, wenn der Spieler aufhört zu feuern.
void CFlamethrower::WeaponIdle()
{
if (m_pPlayer->pev->button & IN_ATTACK)
return;

if (Working == TRUE)
{
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/flameout.wav", 0.8, ATTN_NORM);
Working = FALSE;
SendWeaponAnim( EGON_FIDGET1 ); //Dreh am Hebel des Flammenwerfers
}
m_flTimeWeaponIdle = gpGlobals->time + 0.1;
return;
}






So, wenn ich jetzt kompielieren will, zeigt der Compiler (Visual c++ 6.0) den Fehler


--------------------Konfiguration: hl - Win32 Profile--------------------
Kompilierung läuft...
flamethrower.cpp
C:\SIERRA\SDK\Source Code\dlls\flamethrower.cpp(207) : error C2065: 'Working' : nichtdeklarierter Bezeichner
Fehler beim Ausführen von cl.exe.

flamethrower.obj - 1 Fehler, 0 Warnung(en)

(Siehe Rot!)

Könnt ihr mir helfen? Was muss ich machen?? :(
THX Wenn ihrs könnt :yes:

surfer7
10-07-2003, 21:32
äh? wie wärs wenn du das machst was da steht.

also das "worker" deklarieren...

versuchs mal.

declare .... bla bla bla

Super_Blubl
10-07-2003, 21:34
sollt der tread nicht in andere games is ja kein C&C frgae nur dumm!

Sven
10-07-2003, 21:36
Nöö, der sollte in den Tech Support -> :chron:

Antr4ks.de
10-07-2003, 21:36
Original geschrieben von surfer7
äh? wie wärs wenn du das machst was da steht.

also das "worker" deklarieren...

versuchs mal.

declare .... bla bla bla

Wie genau geht das?
Ich bin noch völlige C++ Noob :rolleyes:

ComSubVie
10-07-2003, 22:25
wenn du keine ahnung von c++ hast, dann solltest du das gleich wieder vergessen.... ich kann nix weniger leiden als leute die irgendwo einen code runterladen, den nicht verstehen und sich dann beschweren...

du musst Working deklarieren. aber in c++ geht das nicht mit declare sondern mit "variablen-typ variablenname" - und das am besten in der class-definition. der von dir benötigte typ ist bool bzw. boolean, int tuts auch.

ansonsten ist der code nicht ganz einfach, sehr unsauber, und bescheuert gequoted (wofür glaubst du gibt es den vB-Code [ code ] [ /code ] ?)

Antr4ks.de
10-07-2003, 23:06
Original geschrieben von ComSubVie
wenn du keine ahnung von c++ hast, dann solltest du das gleich wieder vergessen.... ich kann nix weniger leiden als leute die irgendwo einen code runterladen, den nicht verstehen und sich dann beschweren...

du musst Working deklarieren. aber in c++ geht das nicht mit declare sondern mit "variablen-typ variablenname" - und das am besten in der class-definition. der von dir benötigte typ ist bool bzw. boolean, int tuts auch.

ansonsten ist der code nicht ganz einfach, sehr unsauber, und bescheuert gequoted (wofür glaubst du gibt es den vB-Code [ code ] [ /code ] ?)

Sorry Sorry, aber ich lade mir nicht einfach nen code runter, ich guck auch rein wie das so geht. Außerdem beschwere ich mich nicht sondern bitte um Rat. Und ICH mag keine Leute die unhöflich sind!! :mad1:
Und den VB-Code kannte ich bis jetzt noch nich, sorry


EDIT:
Original geschrieben von ComSubVie
du musst Working deklarieren. aber in c++ geht das nicht mit declare sondern mit "variablen-typ variablenname" - und das am besten in der class-definition. der von dir benötigte typ ist bool bzw. boolean, int tuts auch.


Danke :rolleyes: KOmpilieren hat jetzt gefunkt mit
BOOL Working;
Aber, ich habs schonmal ausprobiert, da hab ich jedoch das ";" vergessen :(

ComSubVie
10-07-2003, 23:40
Original geschrieben von Zongolo
Sorry Sorry, aber ich lade mir nicht einfach nen code runter, ich guck auch rein wie das so geht. Außerdem beschwere ich mich nicht sondern bitte um Rat. Und ICH mag keine Leute die unhöflich sind!! :mad1:

Hm, sorry, aber wenn du "auch guckst wie das geht", wie willst du das denn tun wenn du von c keine ahnung hast?? das ist mir irgendwie zu hoch....

sorry, aber ich finde trotzdem das jemand der nicht weiß wie man in c eine variable deklariert (bzw. mit eindeutigen fehlermeldungen umgehen kann) zuerst mal die sprache lernen sollte.

das ist in etwa genauso wie die ganzen script-kiddies...
SK: sag mir deine IP, dann fliegst gleich raus
ME: 127.0.0.1
SK: disconnected
:D

Antr4ks.de
11-07-2003, 01:30
Na, völliger Noob bin ich nun auch wieder nich :rolleyes:
Hab n paar Bücher, Tutorials...
Außerdem, wie du gesehen hast war bei mir das Problem, das ich das ";" am Anfang vergessen habe, und es deshalb nicht gefunzt hast. Aber wie du meinst..

The Bang 2
11-07-2003, 07:11
Original geschrieben von ComSubVie
ME: 127.0.0.1
SK: disconnected
:D

Jaja, root is schon was feines.:rolleyes:

almhirte
11-07-2003, 10:07
Original geschrieben von ComSubVie
wenn du keine ahnung von c++ hast, dann solltest du das gleich wieder vergessen.... ich kann nix weniger leiden als leute die irgendwo einen code runterladen, den nicht verstehen und sich dann beschweren...

du musst Working deklarieren. aber in c++ geht das nicht mit declare sondern mit "variablen-typ variablenname" - und das am besten in der class-definition. der von dir benötigte typ ist bool bzw. boolean, int tuts auch.

ansonsten ist der code nicht ganz einfach, sehr unsauber, und bescheuert gequoted (wofür glaubst du gibt es den vB-Code [ code ] [ /code ] ?)

Hehe, da regt sich aber einer auf ;)

Gemeint ist aber die class-declaration nicht die definition. Kann man sich doch leicht merken:

deklarieren -> ansagen was geht
definieren -> ansagen wie's geht

Original geschrieben von Zongolo
hab n bisschen im Netz gesucht und echt gute Skripte gefunden. Da hab ich auch ein Skript wie man n Flammenwerfer erstellt.


also echt mal C++ hat doch nix mit scripten zu tun :rolleyes:

Aber trotzdem, was willst du denn noch so in dein mod einbauen?
Ich hatte eigentlich schon mal dran gedacht ne Kettensäge zu bauen. Die fehlt uns immer irgendwie. Doom Style Kettensäge rockt :cool:

Nur hat mich die Faulheit bisher dran gehindert.

MyersGer
11-07-2003, 12:22
Original geschrieben von Zongolo
Na, völliger Noob bin ich nun auch wieder nich :rolleyes:
Hab n paar Bücher, Tutorials...
Außerdem, wie du gesehen hast war bei mir das Problem, das ich das ";" am Anfang vergessen habe, und es deshalb nicht gefunzt hast. Aber wie du meinst..

zum programmieren gehört auch, dass man kompilermeldungen versteht :rolleyes:

Antr4ks.de
12-07-2003, 11:36
Wie lustig, denkst du ich bin total bescheuert????
Ich wusste nur nicht richtig was ich machen muss.
Na gut Thema beendet, der kann :lock:

Chrissyx
13-07-2003, 23:37
Da wir gerade beim Thema C++ sind, kennt ihr ein wirklich gutes online Tutorial für C++ auf deutsch?

Und eine Frage hab ich noch: Was ist der Unterschied zwischen Visual C++ und dem"normalen" C++ ?

almhirte
13-07-2003, 23:47
Visual C++ ist so ne Art Entwicklungsumgebung für C++.

Bei Visual C++ gibt dir die Entwicklungsumgebung die Möglichkeit die sog. MFC ua. zur Oberflächengestaltung einfach zu benutzen. Ausserdem kann man mit dem Classwizard verschiedene immer wiederkehrende Dinge per wenigen Mausklicks erstellen lassen. Dann gibt die VC++ auch einen netten Debugger dazu und noch reichlich tools (ausser den Spy hab ich aber noch nix davon benutzt).

C++ ist einfach nur die reine Programmiersprache. Ohne alles.

ComSubVie
14-07-2003, 02:07
visual c+ ist quasi m$ c++, also die nicht-standardkonforme version von c++.

im prinzip ist VC++ C++ mit entwicklungsumgebung (Visual Studio), zusätzlich kommen dann noch die M$-"Features" dazu, d.h. nicht alles was c++ ist kann mit vc++ kompiliert werden und umgekehrt.

AuzingLG
14-07-2003, 20:54
Es gibt kein "normales" C++. Es gibt nur die Grundsyntax und die Compilereigenen Befehle. Aber Visual C++ .net ist ein guter Standard, viele haben VC und die Codes von den älteren VC++-Versionen laufen auch (man muss aber die Projekte konvertieren).

Chrissyx
16-07-2003, 20:13
OK, danke für die Antworten!
Aber ein gutes, ausführliches, deutsches Tutorial kennt keiner, oder?

MyersGer
16-07-2003, 20:23
da kauft man sich einmal n vernünftiges buch und gut is.

kack tutorials... bis du da mal eines findest, das gut ist und wissen vermittelt über "hello world" hinaus, kannste lieber 10€ ausgeben ;)

oder du nimmst n ebook :p gibt da ja auch genug kostenlose.