Aktuelle Zeit: 14.05.2025, 00:15

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ego Shooter
BeitragVerfasst: 02.12.2008, 18:10 
Hi,
ich versuche grade einen online Ego Shooter zu programmieren. (ich spiele erstmal nur damit rum)
Dass hier habe ich bis jetzt:
Code:
#include <windows.h>
#include <irrlicht.h>
#include <TCHAR.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

TCHAR *szAppName = TEXT("Ego Shooter by Marlene Deluxe");
ICameraSceneNode* camera;

class Character
{
private:
   int hp;
public:
   int getHP()
   {
      return hp;
   }

   void setHP(int health)
   {
      hp = health;
   }

};

class MyEventReceiver : public IEventReceiver
{
public:
   bool OnEvent(const SEvent& event)
    {
      if (event.EventType == EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown)
        {
         // tastenreaktionen brauch ich jetzt noch nicht
         /*switch (event.KeyInput.Key)
            {
            case KEY_SPACE:
                return true;
            }*/
      }
                return false;
   }
};



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               PSTR szCmdLine, int iCmdShow)
{
   // initialisieren usw.
   MyEventReceiver receiver;
   int cx = GetSystemMetrics(SM_CXSCREEN), cy = GetSystemMetrics(SM_CYSCREEN);
   IrrlichtDevice *device = createDevice(EDT_DIRECT3D9, dimension2d<s32>(cx, cy), 32, true, false, true, &receiver);
    if (!device)
      return 1;
   IVideoDriver* driver = device->getVideoDriver();
    ISceneManager* smgr = device->getSceneManager();
    IGUIEnvironment* guienv = device->getGUIEnvironment();

   // Maus off, Kamera und Name
   device->getCursorControl()->setVisible(false);
   device->setWindowCaption(szAppName);
   SKeyMap keyMap[5];
    keyMap[0].Action = EKA_MOVE_FORWARD;
    keyMap[0].KeyCode = KEY_KEY_W;
   keyMap[1].Action = EKA_MOVE_BACKWARD;
   keyMap[1].KeyCode = KEY_KEY_S;
   keyMap[2].Action = EKA_STRAFE_LEFT;
   keyMap[2].KeyCode = KEY_KEY_A;
   keyMap[3].Action = EKA_STRAFE_RIGHT;
   keyMap[3].KeyCode = KEY_KEY_D;
   keyMap[4].Action = EKA_JUMP_UP;
   keyMap[4].KeyCode = KEY_SPACE;
   camera = smgr->addCameraSceneNodeFPS(0, 100.0f, 300.0f, -1, keyMap, 5, true, 1.0);


   // Map und Collision
   device->getFileSystem()->addZipFileArchive("media/lifeline.pk3");
   IAnimatedMesh* mesh = smgr->getMesh("lifeline.bsp");
   ISceneNode* node = 0;
   node = smgr->addOctTreeSceneNode(mesh->getMesh(0), 0, -1, 128);
    node->setPosition(core::vector3df(-1300,-144,-1249));
   ITriangleSelector* selector=smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node,128);
    node->setTriangleSelector(selector);
   if (selector)
    {
      ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
        selector, camera, vector3df(30,50,30),
        vector3df(0,-1,0),
        vector3df(0,50,0));
        selector->drop();
        camera->addAnimator(anim);
        anim->drop();
   }

   // skybox erstellen
    driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, false);
    smgr->addSkyBoxSceneNode(
            driver->getTexture("media/irrlicht2_up.jpg"),
                driver->getTexture("media/irrlicht2_dn.jpg"),
                driver->getTexture("media/irrlicht2_lf.jpg"),
                driver->getTexture("media/irrlicht2_rt.jpg"),
                driver->getTexture("media/irrlicht2_ft.jpg"),
                driver->getTexture("media/irrlicht2_bk.jpg"));
    driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, true);

   // Hauptcharacter
   Character main;
   main.setHP(100);
   TCHAR hp[10];

   // Font
   IGUIFont* font = guienv->getFont("media/bigfont.png");

   // Chat
   IGUIEditBox* chat = guienv->addEditBox(L"",rect<s32>(400, cy-90, cx-390, cy-60));

   // Gun
   IAnimatedMesh* gun = smgr->getMesh("media/Gun.3ds");
   IAnimatedMeshSceneNode* meshGun = smgr->addAnimatedMeshSceneNode(gun);
   meshGun->setMaterialFlag(EMF_LIGHTING, false);
   meshGun->setFrameLoop(0, 0);
   meshGun->setMaterialTexture( 0, driver->getTexture("media/gunTexture.bmp") );
   camera->addChild(meshGun);
   meshGun->setPosition(meshGun->getPosition() + vector3df(13, -30, 0));
   meshGun->setRotation(meshGun->getRotation() + vector3df(0, 180, 0));

    while(device->run())
    {
      driver->beginScene(true, true, SColor(255,100,101,140));
      smgr->drawAll();
        guienv->drawAll();
      _stprintf(hp, TEXT("HP: %d"), main.getHP());
      font->draw(hp, rect<s32>(50, cy-100, 100, cy-50), SColor(255, 255, 0, 0));
        driver->endScene();
    }

    device->drop();
   return 0;
}


Findet ihr den Ansatz so ok? Hier mal ein Screen, wie es bis jetzt aussieht:
(die Texturen müssen natürlich noch geändert werden)
Bild

Zu meiner Frage:
Wie kann ich einen "Schuss" mit der linken Maustaste realisieren?
Ich möchte es nicht so haben wie in cs, also das man nur den Schuss hört.
Ich möchte es so machen, dass ein Strahl oder sowas aus der Gun kommt.
Wie würdet ihr dass machen? Und wo bekomme ich solche Texturen und Modelle her(Strahlen usw.)?
Und findet ihr es realistisch, einen guten Shooter zu programmieren, mit Modellen und Grafiken ausm Netz?
Also ohne Grafiker oder eigene Grafiken?
Danke


Nach oben
  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 02.12.2008, 18:52 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Ich hoffe doch mal, dass das nicht wirklich eine Datei ist. Wenn ja: unbedingt ändern. Spätestens ins 2 wochen würdest du nichtmehr durchblicken was warum wo steht.

Dann solltest du dir erstmal Gedanken machen, wie du welche Techniken wofür einsetzen willst.
Welche Klasse macht was. Muss Klasse A von Klasse B abhänig sein? Was passiert mit Klasse C wenn du Klasse D änderst. Kannst du ohne weiteres von sagen wir Fmod für den Sound auf OpenAL umsteigen, oder müsstest du wieder von vorne Anfangen. Was passiert, wenn deine Verwaltungsklasse für die Gamemaps doch nicht so funktioniert und komplett umgeschrieben werden muss.

Zum rumprobieren, was die Engine kann ist das in Ordnung. Aber wenn mehr draus werden soll, muss da unbedingt struktur rein.

Und als ein erstes Projekt wird ein Ego-Shooter sowieso nichts. Glaub mir ich weiß wovon ich rede ( 3mal versucht einen 3d-netzwerk-shooter zu schreiben, bis ich dann auch irgendwann mal auf die Idee gekommen bin, dass ich vielleicht doch mit kleineren Sachen anfangen sollte)

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 02.12.2008, 20:21 
danke für deine Tipps Sylence.
Also erstmal... meinst du mit eine Datei, dass ich es lieber in mehrere Dateien aufteilen sollte? Also eher eine extra Quellcodedatei für eine neue Klasse? Ich bin das irgendwie so gewohnt, dass ich alles in einer Datei habe. Dann hab ich alles auf einen Blick aber diese schlechte Angewohnheit werde ich wohl ändern müssen.

Ich bin mir noch nicht sicher ob es nur eine Spielerei, oder doch etwas mehr werden soll. Ich hab mir halt gedacht, dass ich mal bisschen drauf losprogrammiere und sehe, was sich ergibt. Eigentlich ist doch schon einiges zusammen. Wenn die Waffe jetzt noch schießt, dann habe ich doch schon mal die Grundlagen. Man kann herumlaufen, hüpfen, die Map erkunden, schießen usw. Und wenn ich dann noch einen Server erstelle, der alle Positionen mit GetPosition an alle Clienten sendet, weiß ich ja, wo sich die Spieler befinden und an der Stelle muss halt noch ein Ziel her. Natürlich muss ich dann noch die Waffen, gegen Menschen mit Waffen ersetzten, damit man auch die Ziele sieht. Ich weiß, ich stell mir das viel zu leicht vor, aber mal sehen...

Trotzdem noch die 3 Fragen:
Meinst du ich könnte auch (wenn es was wird) einen guten Shooter mit Grafiken ausm Netz usw. erstellen? Also ohne Grafiker oder selber Grafiken erstellen?
Um Sound abzuspielen, muss er ja erstmal vorhanden sein. Ist es schwer, Sound für so nen Shooter selber zu erstellen oder doch lieber auf fertige Sachen zurückgreifen?
Und dann noch das Problem mit dem Schuss... wie mache ich es, dass ein Lichtstrahl aus der Gun kommt?
Ich meine das so in der Art wie in diesem Shooter: http://de.youtube.com/watch?v=RnWV4Ahv7lk
also was anderes als Cs.
Edit: Ich denke mal, dass ich hier erstmal bisschen rumspiele und mir mal ansehe wie man so Grundlegende Dinge wie schießen, hüpfen usw. macht und mache dir dann überlegungen, was ich will und wie es strukturiert sein soll (inklusive Name vom Game usw.) vielleicht wird mal was kommerzielles draus.


Nach oben
  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 02.12.2008, 23:59 
Offline

Registriert: 22.04.2007, 13:12
Beiträge: 53
Antwort auf deine Frage:
Für zum testen sind Modelle usw aus dem Netz gut.. da es dabei meist ja sowieso nur um den Programmcode geht.
Für alles andere würde ich eigene Medien(Modelle,Texturen,Sounds usw)verwenden, da bei den meisten sachen die Lizensbedingungen nicht 100% eindeutig sind.

Solltest du sounds wie z.B. Teile aus Musikstücken verwenden wollen so musst du IMMER die Rechte der Eigentümer beachten.
Kopieren und weitergabe ist somit untersagt.

Achso was auch beachtet werden sollte (wird sehr häufig auser acht gelassen) sind Dateiformate, diese sind meist auch Lizenzsiert.

Wenn du vrohast einen Netzwekspiel zu machen, so solltest du dir erstmal gedanken darüber machen welche Pakete gesendet werden.
Position und Rotation reichen dafür meist nicht aus.
du solltest dir Gedanken darüber machen was der Server alles bekommen und verarbeiten muss.

wennn du das alles hast soltest du dir auch gedanken über das manipulieren der Daten gedanken machen.
den wenn du einfach nur informationen wie z.B Player hat Player2 Getötet sendest und der Server das so verarbeitet und weitersendet wirst du sehr schnell merken das diese informationen genutzt und manipuliert werden.
das Heißt der Client sendet einfach die Information das er Player2 gekillt hat an den Server obwohl das garnicht der fall ist... den Server interessiert die nicht und er sendet diese Information weiter...
daher alle Entscheidungen sollte der Server treffen.

Wie Sylence schon sagte ist dieses Thema echt nicht einfach und bedarf sehr viel planung und Erfahrung aus vorgehenden Projekten.

fange am besten mit was kleinerem an.

Ok du denkst bestimmt wie jeder von uns am anfang, Wieso sollte ich den 10000. Pacman Clone schreiben....
Antwort weil es dir bei deinen nächsten Projekten sicherlich hilft und du nicht die gleichen Fehler 2x machst.

schau dir mal meine Beiträge an.....
Ich bin nicht neu in der Spieleentwicklung und mein Beruf ist Softwareentwickler aber all dies nützt mir nichts wenn ich die Engine nicht kenne.
Für mich ist Irrlicht auch noch sehr neu und ich muss auch immer wieder fragen.
Als erstes Projekt habe ich z.B. einen BrealOut Clone geschrieben bei dem ich sehr viele Fehler gemacht hatte, welche ich jetzt kenne und sicherlich nichtmehr machen werde.

So langer Beitrag nichts dahinter... :D
Wünsche dir aber viel erfalg und Spaß beim testen von Irrlicht, auch wenn sehr häufig Sachen nicht so funktionieren wie du das möchtest.

Mach immer weiter denn durch jede Niederlage gewinnst du Erfahrung.

Gruß SAS

_________________
Progammiersprache: VB.NET 2005
Irrlichtversion: Irrlicht.Net CP 0.8


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 03.12.2008, 15:01 
ok und wie ist das mit dem schießen?
Ich habe mal so angefangen: aus der Waffe soll diese Leuchtkugel aus den irrlicht media Dateien kommen.
Also habe ich sie erstmal geladen die camera zum parent gesetzt und die Kugel so positioniert, dass man sie sieht. Naja das hilft nicht wirklich viel weiter. Meint ihr das klappt so, wenn ich die Kugel sichtbar mache wenn die linke Maustaste gedrückt wird und dann muss sich die Kugel immer weiter entfernen(Position mit setPosition erhöhen?)
Code:
   // schuss
    ISceneNode* bill = smgr->addBillboardSceneNode(0, dimension2d<f32>(60, 60));
    bill->setMaterialFlag(video::EMF_LIGHTING, false);
    bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
    bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
    bill->setMaterialTexture(0, driver->getTexture("media/schuss.bmp"));
   bill->setParent(camera);
   bill->setPosition(bill->getPosition() + vector3df(0, 0, 50));


Nach oben
  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 03.12.2008, 15:33 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Guck dir mal die Irrlicht Demo an. Da ist das Schießen implementiert

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 03.12.2008, 18:09 
das Funktioniert schon mal ganz gut!
Code:
      if(event.EventType == EET_MOUSE_INPUT_EVENT)
      {

         switch (event.MouseInput.Event)
            {

            case EMIE_LMOUSE_PRESSED_DOWN:
                ISceneManager* sm = device->getSceneManager();
                ISceneNodeAnimator* anim = 0;
                // set flight line
                vector3df start = camera->getPosition();
                vector3df end = (camera->getTarget() - start);
                end.normalize();
                start += end*8.0f;
                end = start + (end * camera->getFarValue());
                anim = sm->createFlyStraightAnimator(start, end, 1000);
                bill->addAnimator(anim);
                return true;
         }}
   
                return false;
   }
};

Warum verschwindet wenn ich 2 mal hinterinander schieße, die 1. Kugel? Also so dass immer nur 1 sichtbar ist. Wie ändere ich das?


Nach oben
  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 03.12.2008, 18:31 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Weil du nur ein Billboard hast.
Beim ersten schuss setzt du das mit dem FlyStraightAnim in bewegung. Beim 2. auch wieder, dh dass der Ball wieder an die Anfangsposition gesetzt wird von animator.

Also musst du schon für jede Kugel ein eigenes SceneNode erstellen und wieder löschen, wenn die Kugel am Ziel angekommen ist.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 03.12.2008, 21:37 
Code:
         switch (event.MouseInput.Event)
            {

            case EMIE_LMOUSE_PRESSED_DOWN:
                // schuss
                bill = smgr->addBillboardSceneNode(0, dimension2d<f32>(60, 60));
                bill->setMaterialFlag(video::EMF_LIGHTING, false);
                bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
                bill->setMaterialTexture(0, driver->getTexture("media/schuss.bmp"));
                ISceneManager* sm = device->getSceneManager();
                ISceneNodeAnimator* anim = 0;
                // set flight line
                vector3df start = camera->getPosition();
                vector3df end = (camera->getTarget() - start);
                end.normalize();
                start += end*8.0f;
                end = start + (end * camera->getFarValue());
                anim = sm->createFlyStraightAnimator(start, end, 2000);
                bill->addAnimator(anim);
                return true;
         }}

bill ist Global. So funktioniert es. Aber die müssen ja auch wieder gelöscht werden oder(wegen speicher)? Wo würdest du dass machen?


Nach oben
  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 03.12.2008, 22:57 
Offline

Registriert: 22.04.2007, 13:12
Beiträge: 53
Sagte er doch :P
Sobalt die Kugel ein Ziel getroffen hat oder sie eine gewisse reichweite geflogen ist....

_________________
Progammiersprache: VB.NET 2005
Irrlichtversion: Irrlicht.Net CP 0.8


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 04.12.2008, 18:53 
ja schon aber wie genau kann ich es verschwinden lassen?
sowas wie bill = smgr->removeBillboardSceneNode(0, dimension2d<f32>(60, 60));
gibt es ja nicht. Außerdem brauche ich ja dann Threads oder? Weil ich kann ja nicht
bill->addAnimator(anim);
return true;
unter addAnimator es gleich wieder löschen, da ja erst geschossen werden muss


Nach oben
  
 
 Betreff des Beitrags: Re: Ego Shooter
BeitragVerfasst: 04.12.2008, 21:12 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
ISceneNode::remove()

Threads brauchst du dafür nicht.
Du brauchst nur irgendwo eine Liste, wann welcher Ball gelöscht werden soll. Die Fragst du jeden Frame ab und guckst ob halt ein Ball gelöscht werden soll. Wenn ja entfernst du ihn und streichst ihn aus der Liste.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de