Bestimmte Types nach Collision löschen [erledigt]
Übersicht

EyezTBetreff: Bestimmte Types nach Collision löschen [erledigt] |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dies könntest du mithilfe einer einfachen Kollision machen, oder mit Picken.
MfG |
||
~Tehadon~
www.tehadon.de http://www.blitzforum.de/worklogs/14/ |
EyezT |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
EyezTBetreff: Gelöst =) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für eure Hilfe, klappt jetzt super ![]() 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... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group