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

1

15.11.2006, 13:49

Wie Laser-Feuer realisiern?

Hi


sry das ich euch nochma belästige, aber ich komm einfach net weiter.

ich will in meinem spiel natürlich auch das man schießen kann und das die laser gesehen werden. so, jetz ist die frage, wo die laser objekte speichern? erst kam mir die idee, mit einem begrenzten pointer array zu arbeiten, aber das würd extrem viel speicher verbrauchen.
dann hatte ich die idee, das immer wen ein laser entweder ein schiff trifft oder vom bildschirm verschwindet dieser aus einem array gelöscht wird. das array müsste dann immer vergrößert und verkleinert werden. wenn etwas in der mitte weggenommen werden würde, müsste alles verschoben werden. mmn nicht sehr performant und sehr aufwendig.

gibt es da bessere lösungen?

danke im voraus

Mfg
Eldarion72

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

2

15.11.2006, 14:52

Ja, Datenstrukturen. Wenn du Spass dran hast, kannst du die selber Programmieren, ist nich so komplex wie man denkt.
Andererseits gibt's die STL. Klick

Eine weitere Moeglichkeit ist deine beiden Methoden zu kombinieren: Du hast ein Pointerarray, das du dynamisch vergroesserst. Elemente im speicher zu verscheiben ist dann unnoetig, du setzt einfach den Pointer auf NULL. Mir persoenlich sagt diese Methode immer noch am meisten zu.
"Have you tried turning it off and on again?"

3

15.11.2006, 15:10

mir wurd grad von wem die möglichkeit verkette listen geraten. das werd ich wohl ersma testen.

trotzdem danke :)

4

18.11.2006, 21:53

Hi

sry das ich hier nen doppelpost mache und euch nochma nerve, aber ich komm net weiter.

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
//Hauptklasse


#ifndef GAME
#define GAME

#include "DDraw.h"
#include "Player.h"
#include <list>
#include "Fire.h"

class Game
{
      private:
              DDraw Game_DDraw;
              Player MainPlayer;
              list<Fire*> lFire;      // Verkettete Liste

              list<Fire*>::iterator iFire; // Iterator

              int Fire_Count;
              float time_old;
              float time_new;
              float time_diff;  
              int Check; 
      public:
             bool Init_All();
             void Release_All();
             void Render();
             void Clear_Scren();
             void Blit_Bitmap(RECT, LPDIRECTDRAWSURFACE7);
             DDraw getDirectDrawInstance ();
             void Check_Input();
             float get_Time_Diff();
             void Add_Fire();
};

#endif


das ist meine mainklasse. wennich jetz einen laser mit Add_Fire(); hinzufügen will, mache ich das so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Game::Add_Fire()
{
    
      Fire *Temp = NULL;   
      Temp = new Fire(Fire_Count);
      Fire_Count = Fire_Count + 1;
      
      lFire.push_back (Temp);
      
      iFire = lFire.end();
      (*iFire)->LoadBitmap("Fire.bmp");  
      float x, y;
      x = MainPlayer.get_Koordinate_x();
      y = MainPlayer.get_Koordinate_y();
      (*iFire)->set_Koordinaten(x,y);
      
     
}


so, aber bei lFire.push_back(Temp);
stürzt das programm mit dem fehelrberichterstattungsassisten ab. habt ihr
ne idee woran das liegt?

danke im voraus.

Mfg
Eldarion72

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

18.11.2006, 22:13

Das Programm stürzt vermutlich nicht bei push_back ab, sondern direkt dannach. Das liegt daran, dass end() die Position hinter dem letzten Element der Liste zurückgibt. Ein Zugriff darauf ist ungültig. Ich würde dir raten, iFire einfach nach der Zuweisung mit end() einen Schritt zurückzusetzen.

C-/C++-Quelltext

1
2
3
4
5
      lFire.push_back (Temp);
     
      iFire = lFire.end();
      iFire--;
      (*iFire)->LoadBitmap("Fire.bmp");  

6

18.11.2006, 23:28

hmm, funzt net. ich zeigt nochma ne andere stelle, wo auch etwas mit der liste gemacht wird. vermutlich liegts daran:

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 Game::Render()
{
     float x, y;
     for(iFire=lFire.begin(); iFire!=lFire.end(); ++iFire)
     {
          x = (*iFire)->get_Koordinate_x();
          y = (*iFire)->get_Koordinate_y(); 
          x -= 2;
          y -= 2;
          if (x<0 || y<0)
          {
                delete (*iFire);
               (*iFire) = NULL;
          }
          else
          {
              (*iFire)->set_Koordinaten(x, y);
              (*iFire)->Draw_Object();
          }
     }
     MainPlayer.Draw_Object();
     MainPlayer.Act_Position();
     Game_DDraw.DrawAll();
     
     time_new = timeGetTime();
     time_diff = time_new - time_old;
     time_diff = time_diff/24;
}


dabei soll geprüft werden, ob die laser den bildschirm verlassen haben, udn wenn ja, der laser gelöscht werden.

wär über hilfe super erfreut.

Mfg
Eldarion

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

19.11.2006, 00:27

C-/C++-Quelltext

1
2
3
4
5
          if (x<0 || y<0)
          {
                delete (*iFire);
                (*iFire) = NULL;
          } 

da würde ich eher dazu tendieren, den Schuss gleich richtig aus der Liste zu entfernen, weiß aber nicht, ob das ne Fehlerquelle ist.

C-/C++-Quelltext

1
2
3
4
5
6
7
          if (x<0 || y<0)
          {
                delete (*iFire);
                iFire=lFire.erase(iFire);
                if (iFire==lFire.end())
                      break;
          } 


Warum bewegst du deine Schüsse eigentlich in X und Y Richtung?

8

19.11.2006, 00:32

super, es funzt.

öhm, :oops: oO
müssen ja nur in öhm, y richtung bewegt werden^^. ich mach ja nen upscroller.

danke für den tipp^^

Werbeanzeige