Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
21.10.2001, 22:35
BloodyHarry



Ich habe mich mal an C++ gewagt und versucht mein erstes Entity zu coden... soweit so gut.... env_sprite kopiert und angepasst, klappt alles wunderbar... mein Ziel: Ein Feuer aus Sprites....
Diese Sprites sollen nach oben gehen und gleichzeitig kleiner gescaled werden.... wenn man das ganze mit genügend sprites macht, die alle samt kleine abweichungen haben sollte es ja eigentlich recht gut aussehen =) soweit habe ich es mir gedacht....
Ich habe folgendes schon fertig: Die Bewegung des Sprites nach oben, mir fehlt noch die scalierung und natürlich die Abweichung bzw: dass mehrere Sprites created werden und nicht nur eine....

Könntet ihr mir ein paar tpps geben, wie ich es schaffe, dass mehrere Sprites gemacht werden?

Und: Wie schaffe ich es, das der Sprite sozusagen wieder unten anfgängt? Für die Bewegung habe ich ein recht simples system:
pev->origin.z = pev->origin.z +1
Also total simpel... :D
Nun bewegt sich der Sprite aber den ganzen Tag nach oben..... ich haeb es schon so versucht:
if (pev- >origin >= 20)
{
pev->origin = pev->origin -20
}
Was natürlichvorne und hinten nicht klappt :D
Also könntet ihr mir ein paar tipps dazu geben?
Ich sage aber besser gleich, das ich keinen vollständigen code haben will... ich will ja schliesslich wsas lernen und nicht abschreiben =)

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche
001
22.10.2001, 00:19
Tomz



hmm... schmeiss doch den start origin in eine variable und dann machst du, wenn der neue wert um mehr als 20 von der variabel abweicht, dann setzt du wieder den alten wert. da ich nicht hlcoden kanbn mach ich es malm mit anderen variabelnamen
Quellcode:
for(x = origin.z; origin.z - x <= 20; origin.z ++);

ist halt nur ein billiger versuch zu helfen, hoffe aber du verstehst was ich meine (und gotteswillen nimm nicht den variabelnamen x)

[edit]
hmm, zwar könnte das völliger mist sein, da ich nicht weis, wie das bei hl abläuft, aber so etwa mit der variabel sollte es doch klappen

Quellcode:
DATENTYP x=0;
if(!x)
x=origin.z
if(origin.z - x <= 20))
{
  origin.z ++;
}
else
{
  origin.z -= 20;
  x = origin.z;
}

--

...denn das atombrot wird nicht ruhen bis es den letzten erwischt hat...


Dieser Beitrag wurde am 22.10.2001 um 00:24 von Tomz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
22.10.2001, 01:41
BloodyHarry



hmmm so ganz klappt es leider noch net :(
aber danke für die Hilfe....

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche
003
22.10.2001, 09:39
hausi



Die Idee war nicht Schlecht. Definier eine Variable, die den Anfags Origin speichert.
Nun musst du nur noch ungefähr folgenden Code einbauen (Nur Idee, damit du das noch selber machen kannst und etwas lernst ;) )
Quellcode:
::Spawn( void )
{
SpawnOrigin = pev->origin; //Oder wie die Variable bei dir heisst
int HeightAboveOrigin = 0;
// Hier muss auch die Think-Routine (und ev., falls du Schaden willst auch die Touch-Routine) aufgerufen werden
...
::Think( void )
{
UTIL_SetOrigin(...) //Heisst das Schlüsselwort. Weiss die Parameter nicht, da ich das SDK nicht hier habe. Einfach ev. origin.z zuerst erhöhen...
HeightAboveOrigin++;
if (HeightAboveOrigin >= 20)
{
HeightAboveOrigin = 0;
pev->origin = SpawnOrigin;
}
pev->nextthink = gpGlobals->time + 0.1; //Oder was du auch immer willst...
... }

Natürlich musst du noch alles ein bisschen anpassen und anders machen. Es könnte sein, dass das UTIL_SetOrigin nicht nötig ist, ich würde es aber trotzdem machen. Es wird mit diesem Code auch so sein (falls das UTIL_SetOrigin nötig ist), dass das Sprite sobald es das erste mal hoch geflogen ist 1 Unit über dem Spawnpoint wieder beginnt. Ausserdem wird es nicht gerade sehr optimiert sein und ev. noch verbugt. Musst einfach ein bisschen probieren. Aber das ist wenigstens eine Idee, die du verfolgen kannst...

--

zum Seitenanfang zum Seitenende Profil || Suche
004
22.10.2001, 14:06
BloodyHarry



@Superhausi
Hey das war ne gute Idee, leider geht sie nicht :(
Soweit ich das verstanden habe, erstellst du eine neue Variable (HeightAboveOrigin) die mit der gleichen geschwinidkeit wie der SPrite steigt, und wenn diese Variable höher als 20 ist, wird sie zurückgesetzt auf 0 und der Origin eigentlich auch. Bei mir leider net :-/ Ich glaube es liegt daran, das er SpawnOrigin nicht richtig setzt. Ich denke das er Spawnorigin die ganze Zeit aktualisiert, wodurch SpawnOrigin die den gleichen wert wie origin.z hat, was einen ungewollten Fehler verursacht, der Sprite bleibt auf seinem Weg :(
Thx für die Anregung, ich werde weiterprobieren :D

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche
005
22.10.2001, 16:25
hausi



Poste doch mal ein paar Screenshots oder einen Video. Dann kann man den Fehler leichter nachvollziehen. Oder bleibt das Sprite einfach am Spawnpoint stehen?
[Edit]
Ach ja. wegen dem "mehrere Sprites erstellen".
Mach einfach zwei for-Schleifen, die ungefähr so aussehen:
Quellcode:
for (x = -20; x < 20; x+=4)
{
for (y = -20; y < 20; y+=4)
{
//ev. noch folgendes:
if (RANDOM_LONG(0,1))
{
// Spawn-Code für ein Sprite
UTIL_SetOrigin ( Sprite->pev, pev->origin + Vector( x, y, 0 ) )
UTIL_SetModel ( Sprite->pev, <Feuersprite> );
}
}
}

Nun werden um den Origin herum ca. 50 Sprites gespawnt. Mach den Spawn-Code einfach gleich, wie bei CMP5::SecondaryAttack einfach für ein CFlame (oder was du auch immer gemacht hast).

--


Dieser Beitrag wurde am 22.10.2001 um 16:30 von Superhausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
22.10.2001, 17:48
BloodyHarry



Hmm also das mit dem Mehree Spawnen mache ich gleich mal...
Und das Sprite funktiononiert bisher so:
Ein leerer gang. Das Sprite ist auf dem Boden gemappt. Das sprite fängt an zu fliegen, nach oben gleichmässige geschwindigkeit =) Und verschwindet in der decke... man kann noch mit noclip hinterherfliegen wenn man will =)

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche
007
22.10.2001, 22:08
TheTinySteini



Also erstmal: du kannst mit pev->velocity gleich die Geschwindigkeit angeben. pev->velocity = Vector(0,0,10) wären 10 units pro Sekunde nach oben.
So, das mit dem Skalieren müsste über pev->scale gehen. Mach am besten ne Think, die alle 0.05 Sekunden oder so den scale etwas verringert. Nunja, und wenn pev->scale == 0, dann setzt du das Sprite zurück.
Vermutlich ist es am besten, wenn du ein normales Entity (z.B. CFire) nimmst, was diese Sprites spawn und dann kontrolliert, sich selbst aber nicht bewegt. Mach einfach ein Array oder so mit Pointern auf ein env_sprite. Diese füllst du dann, in dem du ein Sprite erstellst, dann gibst du den Sprites die Geschwindigkeit, veränderst die Sprites per CFire::Think() und, wenn die Sprites eine scale von 0 haben, setzt du sie auf den Origin von CFire/env_fire zurück.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
008
23.10.2001, 19:40
hausi



Ach ja. Und mach am besten, dass nicht alle Sprites gleichzeitig und gleich schnell steigen. Das sieht nämlich scheisse aus...

--

zum Seitenanfang zum Seitenende Profil || Suche
009
23.10.2001, 21:15
Archangel



und nochwas:

zusätzlich zu der pev->scale == 0 abfrage könntest du auch noch ne abfrage:

UTIL_PointContents(pev->origin) == CONTENTS_SOLID machen, säh ja doof aus wenn die sprites durch die decke fliegen würden...

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
010
24.10.2001, 00:30
BloodyHarry



Hmm irgendwas stimmt mit dem scale noch net :( der sprite ist beim starten ungefähr auf das 100fache gescaled... also sehe ich nur ne orangene wand :D
Ich glaube ich sollte dem Teil mal eine Feste grösse geben...
und das sie verscheiden aufsteigen ist klar :D
Die kolisionsabfreage wollte ich auch machen, aber auf ne andere art, die nicht ging... deine wird gleich ausprobiert @archangel :D

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche
011
24.10.2001, 18:30
hausi



Dann mach doch einfach die Scale-Func anders. Anstatt mit pev->scale = 1; startest du dann einfach mit pev->scale = 1/100; (Falls es wirklich 100 mal ist) oder natürlich = 0.01;)

--

zum Seitenanfang zum Seitenende Profil || Suche
012
24.10.2001, 23:50
BloodyHarry



Das ist natürlich ne geschickte Möglichkeit :D

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche
013
25.10.2001, 13:08
Creeper



Hm ist doch schon mal ein kleiner Schritt um zu Partikeln zu kommen.

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
014
25.10.2001, 13:58
BloodyHarry



Genau deswegen wollte ich es ja machen :D
Partikel sind mir zu schwer, deshalb mache ich ne Sprite kette ;)

--

--< BloodyHarry >--

zum Seitenanfang zum Seitenende Profil || Suche