Bestimmte Types nach Collision löschen [erledigt]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

EyezT

Betreff: Bestimmte Types nach Collision löschen [erledigt]

BeitragSa, Sep 15, 2007 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho =)

Habe die Forensuche breits benutzt und mir auch einige Threads/Tuts durchgelesen. Allerdings halfen mir diese nicht, mein Problem zu beseitigen =\ Hoffe ihr könnt mir Tipps oder zumindestens nen Denkanstoß geben Wink

Mein Problem:
Beim Drücken der RMT werden Schüsse abgefeuert Kollidieren diese mit einem der Gegner (im Moment noch einfache Cubes zum Testen), werden sie deleted und der Gegner bekommt 25 Lebenspunkte (von 100) abgezogen. Treffe ich einen Gegner 4 Mal, so ist seiner LebensPunkte = 0 und er soll deleted werden.

So weit, so gut. Vom Prinzip her klappt es schon, allerdings wird nicht der Gegner (Cube) gelöscht, welchen ich beschieße. Die Gegner werden in der Reihenfolge der Erstellung gelöscht.

Wie frage ich denn nun ab, welcher Gegner getroffen wird, bzw wenn Lebenspunkte = 0 sind, gelöscht werden soll? =\

Btw: Ich benutze trotz einer vordefinierten Anzahl von Gegnern Types, da ich später eine zufällige Anzahl verwenden will. Die vordefinierte Anzahl ist nur zum Testen Wink

Hier der Code:

Code: [AUSKLAPPEN]

Type Shot
   Field Rotation#
   Field Sprite
   Field TimeOut
End Type

Type Enemy
   Field Entity
   Field Enemy_X#
   Field Enemy_Z#
   Field Enemy_hp
End Type

...

Global modCube = CreateCube() ; Model der Gegner
HideEntity modCube

Collisions 1,2,2,2
Collisions 1,3,2,2
Collisions 1,5,2,2
Collisions 4,5,2,1

...

Global Shot_x# = 1.5
Global ShotTime = 0
Global MaxTime = 15

Global EnemiesHit = 0
Global EnemiesKilled = 0
Global EnemyCount = 0
Global DmgDone = 0

SeedRnd(MilliSecs())

Timer = CreateTimer(50)

While Not KeyDown(1)
   Cls
   
   Setup()
   
   If MouseDown(2) And ShotTime <= 0
      CreateShot()
   EndIf
   
        ...

        If ShotTime > 0 Then ShotTime = ShotTime - 1
   
   UpdateGame()
   
   UpdateWorld
   RenderWorld
   
   Text 10, 20, "EnemiesHit: " + EnemiesHit
   Text 10, 40, "EnemiesKilled " + EnemiesKilled
   Text 10, 60, "EnemyCount: " + EnemyCount
   CountFPS()
      
   Flip WaitTimer(Timer)
Wend

...

Function Setup()
   If EnemyCount < 5 Then CreateEnemy() : EnemyCount = EnemyCount + 1
End Function

Function UpdateGame()
   For s.Shot = Each Shot
      UpdateShot(s)
   Next
   
   For e.Enemy = Each Enemy
      UpdateEnemy(e)
   Next
End Function

Function CreateShot()
   Shot_x = -Shot_x
   s.Shot = New Shot
   s\TimeOut=150
   s\Sprite = CopyEntity(sprShot, Player)
   TranslateEntity s\Sprite, Shot_x, 6, .25
   EntityParent s\Sprite,0
   EntityType s\Sprite, 4
   ScaleSprite s\Sprite, 10, 10
   EmitSound sndShot, s\Sprite
   ShotTime = MaxTime
End Function

Function UpdateShot(s.Shot)
   s\TimeOut = s\TimeOut - 1
   
   If s\TimeOut = 0
      FreeEntity s\Sprite
      Delete s
      Return
   EndIf
   
   s\Rotation = s\Rotation + 30
   RotateSprite s\Sprite, S\Rotation
   MoveEntity s\Sprite, 0, 0, 0.5
   
   If EntityCollided(s\Sprite, 5)
      FreeEntity s\Sprite
      Delete s
      DmgDone = 25
      EnemiesHit = EnemiesHit + 1
      Return
   EndIf
End Function

Function CreateEnemy()
   e.Enemy = New Enemy
   e\Entity = CopyEntity(modCube, 0)
   e\Enemy_X = Rand(4, 60)
   e\Enemy_Z = Rand(4, 60)
   e\Enemy_hp = 100
   EntityType e\Entity, 5
   EntityRadius e\Entity, 2
   EntityColor e\Entity, Rand(255), Rand(255), Rand(255)
    PositionEntity e\Entity, e\Enemy_X, 0, e\Enemy_Z
End Function

Function UpdateEnemy(e.Enemy)
   e\Enemy_hp = e\Enemy_hp - DmgDone
   DmgDone = 0
   
   If e\Enemy_hp = 0
      FreeEntity e\Entity
      Delete e
      EnemiesKilled = EnemiesKilled + 1
      EnemyCount = EnemyCount - 1
   EndIf
End Function

ClearWorld
End


Hoffe der Code ist soweit verständlich, dass ihr mir weiter helfen könnt =\

Vielen Dank im Voraus
Mfg EyezT
  • Zuletzt bearbeitet von EyezT am So, Sep 16, 2007 19:49, insgesamt einmal bearbeitet

Noobody

BeitragSa, Sep 15, 2007 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Logisch, dass sie nur der Reihe nach gekillt werden - du liest in einer For...Each-Schleife alle Gegner aus und ziehst den Schaden von den Lebenspunkten ab.
Und zwar nur beim ersten Gegner, weil du keine Abfrage drin hast, welcher Gegner getroffen wird.
Also bei UpdateShot() herausfinden, welcher Gegner getroffen wurde und nur diesem den Schaden berechnen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

peacemaker

BeitragSa, Sep 15, 2007 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Dies könntest du mithilfe einer einfachen Kollision machen, oder mit Picken.

MfG
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/
 

EyezT

BeitragSo, Sep 16, 2007 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vielen Dank für die schnellen Antworten =)

Dass ich so eine Abfrage benötige, dachte ich mir schon. Nur, wie realisier ich das?

@ Peacemaker1
Wie müsste die Kollision sein? Bzw. was müsste ich da abfragen? Oder wär es mit picken einfacher?

Noobody

BeitragSo, Sep 16, 2007 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
EntityCollided() gibt ja das Handle der getroffenen Entity zurück.
Diesen musst du nur zwischenspeichern und der Funktion UpdateEnemy() übergeben.
Die kann dann schauen, ob e\entity gleich dem übergebenen Wert ist und dann den Schaden abziehen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

EyezT

Betreff: Gelöst =)

BeitragSo, Sep 16, 2007 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für eure Hilfe, klappt jetzt super Wink

Habe einfach, wie Noobody sagte, EntityCollided() zwischengespeichert, an UpdateGame() übergeben und dort abgefragt, ob e\Entity = EntityCollided() ist. Danach den Schaden berechnet und EntityCollided() auf 0 gesetzt.

Hier der veränderte Code
Code: [AUSKLAPPEN]


Global CheckEnemyCollision = 0

...

Function UpdateGame(CheckEnemyCollision)
   For s.Shot = Each Shot
      UpdateShot(s)
   Next
   
   For e.Enemy = Each Enemy
      If CheckEnemyCollision = e\Entity ; Abfragen, ob e\Entity = der zwischengespeicherten Kollison
                    UpdateEnemy(e)
                EndIF
   Next
End Function

...

Function UpdateShot(s.Shot)
   s\TimeOut = s\TimeOut - 1
   
   If s\TimeOut = 0
      FreeEntity s\Sprite
      Delete s
      Return
   EndIf
   
   s\Rotation = s\Rotation + 30
   RotateSprite s\Sprite, S\Rotation
   MoveEntity s\Sprite, 0, 0, 0.5
   
   If EntityCollided(s\Sprite, 5)
      CheckEnemyCollision = EntityCollided(s\Sprite, 5)                   ; EntityCollided() zwischenspeichern
      FreeEntity s\Sprite
      Delete s
      DmgDone = 25
      EnemiesHit = EnemiesHit + 1
      Return
   EndIf
End Function

...

Function UpdateEnemy(e.Enemy)
   e\Enemy_hp = e\Enemy_hp - DmgDone
   DmgDone = 0
   
   If e\Enemy_hp = 0
      FreeEntity e\Entity
      Delete e
      EnemiesKilled = EnemiesKilled + 1
      EnemyCount = EnemyCount - 1
   EndIf
   CheckEnemyCollision = 0                                                                ; Variable auf 0 setzen
End Function

...


Mfg EyezT

Edit: grml -.- wieso is der code jezz nich eingerückt? ^^ als ich ihn gepostet hab, war er das...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group