gegner als type...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Sponsor

Betreff: gegner als type...

BeitragSo, Apr 24, 2011 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
moinsen, der titel triffts nicht ganz aber ich hab folgendes problem:

ich hab mir ein kleines game gebastelt, indem ich schießen kann, auch auf gegner die ich vorerst als würfel erstellt hab. die schüsse werden auch fein gelöscht wenn sie mit den gegner kollidieren, aber:
Arrow der sound wird nicht abgespielt
Arrow den cubes wird kein leben abgezogen

Code: [AUSKLAPPEN]
Graphics3D 1024,768,16,1
t#=CreateTimer(60)

Type g
   Field e
   Field x#
   Field y#
   Field z#
   Field leben%
   Field sx#
   Field sy#
   Field sz#
   Field tex
   Field ty
End Type

Type k
   Field e
   Field x#
   Field y#
   Field z#
   Field sx#
   Field sy#
   Field sz#
   Field tex
   Field ty
   Field move#
   Field dista#
   Field zaehler%
End Type

Global timer=CreateTimer(60)

SetBuffer BackBuffer()



licht=CreateLight(3)
PositionEntity licht,50,200,50

welt=CreateTerrain(256)
welt_tex=LoadTexture("pic\gras.png")
EntityTexture welt,welt_tex
ScaleTexture welt_tex,2,2

;box=CreateCube()
;PositionEntity box,10,1,20
;EntityType box,3
box_tex=LoadTexture("pic\metall.jpg")
;box_tex_hit=LoadTexture("pic\metall hit.jpg")
;box_tex_hit2=LoadTexture("pic\metall hit2.jpg")
;box_tex_hit3=LoadTexture("pic\metall hit3.jpg")
;box_tex_hit4=LoadTexture("pic\metall hit4.jpg")
;EntityTexture box,box_tex

boom=LoadSprite("pic\explode.bmp")
ScaleSprite boom,5,5
PositionEntity boom,10,1,20
HideEntity boom

shot=LoadSound("sound\shot2.wav")
hit=LoadSound("sound\hit.wav")
explode=LoadSound("sound\explode.wav")


Global f_k = CreatePivot() 
PositionEntity f_k,0,2,5

Global cam=CreateCamera(f_k)
CameraClsColor cam,10,100,255





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

;leben% = 100

For i=1 To 100
   gegner.g = New g
   gegner\e = CreateCube()
   gegner\leben% = 100
   gegner\x# = Rand(0,256)
   gegner\y# = 1
   gegner\z# = Rand(0,256)
   ;gegner\sx# = 0.9
   ;gegner\sy# = 0.9
   ;gegner\sz# = 0.9
   gegner\ty = 3
   gegner\tex = box_tex
   PositionEntity gegner\e,gegner\x#,gegner\y#,gegner\z#
   EntityType gegner\e,gegner\ty
   EntityTexture gegner\e,gegner\tex
Next
   

While Not KeyHit (1)



If KeyDown(200)=True Then MoveEntity f_k,0,0,0.1
If KeyDown(208)=True Then MoveEntity f_k,0,0,-0.1
If KeyDown(203)=True Then TurnEntity f_k,0,1,0
If KeyDown(205)=True Then TurnEntity f_k,0,-1,0
 


If KeyHit(28) Then
   PlaySound shot
   kugel.k = New k
   kugel\e = CreateSphere(5,cam)
   kugel\x# = EntityX(cam)
   kugel\y# = EntityY(cam)
   kugel\z# = EntityZ(cam)
   kugel\sx# = 0.2
   kugel\sy# = 0.2
   kugel\sz# = 0.2
   kugel\tex = box_tex
   kugel\ty = 4
   kugel\move# = 10
   kugel\dista# = 50
   zaehler% = zaehler% + 1
   PositionEntity kugel\e,kugel\x#,kugel\y#,kugel\z#
   EntityType kugel\e,kugel\ty
   EntityTexture kugel\e,kugel\tex
   ScaleEntity kugel\e,kugel\sx#,kugel\sy#,kugel\sz#
EndIf
For kugel.k = Each k
updateshot(kugel.k)
freeshot(kugel.k)

Next




;If EntityCollided(box,4) Then
   ;leben% = leben% - 1
   ;PlaySound hit
;EndIf

If EntityCollided(gegner\e,4) Then
   gegner\leben% = gegner\leben% - 1
   PlaySound hit
EndIf

;If leben% = 80 Then EntityTexture box,box_tex_hit
;If leben% = 50 Then EntityTexture box,box_tex_hit2
;If leben% = 20 Then EntityTexture box,box_tex_hit3


;If leben% = 0 Then
   ;ShowEntity boom
   ;EntityTexture box,box_tex_hit4
   ;EntityType box,4
   ;PlaySound explode
   ;leben% = leben% -1
   ;HideEntity boom
;EndIf

WaitTimer t#

UpdateWorld()
RenderWorld()
Text 10,10, gegner\leben%;leben%
Text 10,20, zaehler%
Flip
Wend
End

Function updateshot(kugel.k)
MoveEntity kugel\e,0,0,1
End Function

Function freeshot(kugel.k)
If EntityDistance(cam,kugel\e) > 100 Or EntityCollided(kugel\e,3) Then
   zaehler% = zaehler% - 1
   FreeEntity kugel\e
   Delete kugel
EndIf
End Function


wie kann ich es hinbekommen, dass jedem cube einzeln, wenn ich ihn treffe lebenspunkte abgezogen werden?

danke schonmal im vorraus Smile
Was passiert wenn man sich zweimal Halbtot gelacht hat?

Xeres

Moderator

BeitragSo, Apr 24, 2011 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
a) Ich würde die Types ordentlich benennen. "g" und "k" sind für die Lokalen Variablen gut genug, nicht für die Types selbst:
Code: [AUSKLAPPEN]
gegner.g = New g
g.Tgegner = New Tgegner ;<-- Besser!


b) Du prüfst die gegner-Kollission nicht in einer for...each schleife.

c) Wird der Sound geladen? Sind die Boxen an? Funktioniert's mit ChannelVolume?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sponsor

BeitragMo, Apr 25, 2011 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
zu a) ok, ich werds mir für die zukunft merken.

zu b) meinst du, dass ich collisions nicht in einer for... each schleife habe?

zu c) ja, ist geladen und es hat vorher, als ich es nicht mit types, sondern mit nur einem einzelnen cube versucht habe auch wunderbar funktioniert, genauso wie mit den lebenspunkten, hatte alles schon funktioniert, nur jett mit den Types nicht mehr....

ich kann ja mal das game hochladen, welches ich zuerst gemacht habe und indem es so funktioniert hat wie ich es wollte (halt nur mit dem einen cube...)

Arrow hier

so wie in dem hier soll es funktionieren, bloß halt das die gegner types sind und jeder einzeln 100 Lebenspunkte hat und das genau dem, den ich treffe 1 Lebenspunktabgezogen wird...
Was passiert wenn man sich zweimal Halbtot gelacht hat?

Xeres

Moderator

BeitragMo, Apr 25, 2011 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Kugeln updatest du in der Hauptschleife mit For...each:
Code: [AUSKLAPPEN]
For kugel.k = Each k
updateshot(kugel.k)
freeshot(kugel.k)

Next

Das ist fein. Dann kommt aber die gegner-kollision:
Code: [AUSKLAPPEN]
If EntityCollided(gegner\e,4) Then

Das prüft das Objekt, das als letztes in gegner gesteckt wurde, also vermutlich das zu letzt mit NEW erstellte. Da musst du ebenfalls eine For...each Konstruktion herum bauen.
Momentan wird nur ein Type überprüft und wenn du den nicht triffst, gibt es auch keinen Sound...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sponsor

BeitragMo, Apr 25, 2011 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, ich versteh erstmal was du meinst. danke

aber ich hab nicht so richig ein plan wie ich das mach, hab jetzt bisl rumprobiert, aber kam nichts bei rum...

wenn ich so eine schleife drum rum bastel, dann funktioniert das mit dem lebenspunkten komischer weise nicht mehr. Also die Anzeige funktioniert nicht mehr die weiter unten als Text steht... "Objekt does not exist"
Code: [AUSKLAPPEN]
For gegner.g = Each g
If EntityCollided(gegner\e,4) Then
   gegner\leben% = gegner\leben% - 1
   PlaySound hit
EndIf
Next

Xeres

Moderator

BeitragMo, Apr 25, 2011 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Natürlich kann das nicht funktionieren: Die for..each schleife stopft nacheinander ein gegner-Objekt in die Variable "gegner" und wenn die komplette liste abgearbeitet wurde, das Null-Objekt. Nach einer for...each schleife enthält gegener also kein gültiges Objekt mehr.
Das Leben welchen Objekts willst du anzeigen?
Erstes Arrow First, Letztes Arrow Last usw. (siehe weitere Befehle in der OH).
Um die Werte alle gegner aus zu geben, musst du wohl eine for..each Schleife verwenden (und am besten die Zeilen mit zählen um nicht alles übereinander zu zeichnen).
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sponsor

BeitragDi, Apr 26, 2011 10:29
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, danke erstmal für die erklärung:)
nun weiß ich nicht recht weiter.... Embarassed

mir kam gerade der gedanke, das ich immer das Leben des gegners anzeigen will, der beschossen wird. wenn das auch irgendwie geht...

oder kann man das auch recht einfach mit einer anzeige in form eines Blakens über jedem gegner machen?

P.s. hat leider etwas länger gedauert, da ich gestern unverhofft noch Termine bekommen hatte....
Was passiert wenn man sich zweimal Halbtot gelacht hat?

Xeres

Moderator

BeitragDi, Apr 26, 2011 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine simple Möglichkeit:
BlitzBasic: [AUSKLAPPEN]
Local g.Tgegner, LetzterGegner.Tgegner

For g = Each Tgegner
If EntityCollided(g\e,4) Then
g\leben% = g\leben% - 1
PlaySound hit
LetzterGegner = g
EndIf
Next

If LetzterGegner <> Null Then
; LetzterGegner\leben Zeichnen
EndIf

Der zuletzt getroffene Gegner wird in LetzterGegner abgelegt, damit kann man dann weiter arbeiten.

Balken wären sicher hübscher, dafür musst du dich mit CameraProject, ProjectedX/Y/Z auseinandersetzen um 3D->2D um zu rechnen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Action Ape

BeitragDi, Jul 26, 2011 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst die Gegnerenergie auch einfach nur kurz auftauchen und wieder verschwinden lassen. Dann bräuchtest du keine extra Variable für den zuletzt beschossenen Gegner...
:^1

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group