Variable umwandeln

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

ZaRaK

Betreff: Variable umwandeln

BeitragDo, Nov 19, 2009 1:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich probiere schon seit einigen Stunden rum, aber komme zu keinem vernünftigen Ergebnis.

Ich wollte als "kleinen" Einstieg, ein Zombiespielchen machen.
Man selbst ist der Zombie, rennt über den Bildschirm,
beisst Gegner welche sich dann auch in Zombies verwandeln und Gegner jagen.

Allerdings bekomme ich diese "Verwandlung" nicht hin.

Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()

Global status=1
Global spieler=LoadImage("z.JPG")
Global gegner=LoadImage("e.JPG")
Global zombie=LoadImage("za.JPG")
Global slp=100
Global glp=100
Global zlp=50
Global zx#=100
Global zy#=100
Global sx#=400
Global sy#=300
Global gx#=400
Global gy#=80

While Not KeyHit(1)
Cls

SpielerUpdate()
GegnerUpdate()
Angriff()
Zombif()

Flip
Wend

Function SpielerUpdate()
DrawImage(spieler,sx,sy)
If KeyDown(17) sy#=sy#-1
If KeyDown(30) sx#=sx#-1
If KeyDown(31) sy#=sy#+1
If KeyDown(32) sx#=sx#+1
Text sx#+55,sy#+35,"LP: "+slp
End Function

Function GegnerUpdate()
If status=1 Then
DrawImage(gegner,gx,gy)
If sx<gx gx#=gx#+0.1
If sx>gx gx#=gx#-0.1
If sy<gy gy#=gy#+0.1
If sy>gy gy#=gy#-0.1
Text gx+55,gy+35,"LP: "+glp
EndIf
End Function

Function Angriff()
If ImagesOverlap(spieler,sx#,sy#,gegner,gx#,gy#) And MouseHit(1) glp=glp-10
End Function

Function Zombif()
If glp<=50 And ImagesOverlap(spieler,sx#,sy#,gegner,gx#,gy#) And MouseHit(2) Then
zx#=gx#
zy#=gy#
DrawImage(zombie,zx#,zy#)
status=0
EndIf
End Function


Irgendwo bei der Funktion "Zombif()" steckt ein Fehler drin.
Wenn ich die rechte Maustaste drücke, sobald der Gegner gleich oder weniger 50 LP hat,
verschwindet das Bild des Gegners, allerdings taucht kein neues auf.
Wie kann ich diesen Fehler beheben?
Was könnte ich generell besser/anders machen?


Für Tipps, Hilfen und Anregungen bin ich sehr dankbar!
ZaRaK
 

ZaRaK

BeitragDo, Nov 19, 2009 3:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So, habs einigermaßen hinbekommen.
Allerdings scheint mir das eine äußerst unschöne Methode zu sein,
da man so für jeden Zombie und jeden Gegner was separat schreiben muss.
Da gibts doch sicher eine bessere Variante für, oder? ^^

Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()

Global zstatus=0
Global status=1
Global spieler=LoadImage("z.JPG")
Global gegner=LoadImage("e.JPG")
Global zombie=LoadImage("za.JPG")
Global slp=100
Global glp=100
Global glp2=100
Global zlp=50
Global zx#=100
Global zy#=100
Global sx#=400
Global sy#=300
Global gx#=400
Global gy#=80
Global gx2#=250
Global gy2#=90

While Not KeyHit(1)
Cls

SpielerUpdate()
GegnerUpdate()
GegnerUpdate2()
ZombieUpdate()
Angriff()
Zombif()

Flip
Wend

Function SpielerUpdate()
DrawImage(spieler,sx,sy)
If KeyDown(17) sy#=sy#-0.8
If KeyDown(30) sx#=sx#-0.8
If KeyDown(31) sy#=sy#+0.8
If KeyDown(32) sx#=sx#+0.8
Text sx#+55,sy#+35,"LP: "+slp
End Function

Function GegnerUpdate()
If status=1 Then
DrawImage(gegner,gx,gy)
If sx<gx gx#=gx#+0.1
If sx>gx gx#=gx#-0.1
If sy<gy gy#=gy#+0.1
If sy>gy gy#=gy#-0.1
Text gx+55,gy+35,"LP: "+glp
EndIf
End Function

Function GegnerUpdate2()
DrawImage(gegner,gx2,gy2)
If sx<gx2 gx2#=gx2#+0.1
If sx>gx2 gx2#=gx2#-0.1
If sy<gy2 gy2#=gy2#+0.1
If sy>gy2 gy2#=gy2#-0.1
Text gx2+55,gy2+35,"LP: "+glp2
End Function

Function Angriff()
If ImagesOverlap(spieler,sx#,sy#,gegner,gx#,gy#) And MouseHit(1) glp=glp-10
End Function

Function Zombif()
If glp<=50 And ImagesOverlap(spieler,sx#,sy#,gegner,gx#,gy#) And MouseHit(2) And zstatus=0 Then
zx#=gx#
zy#=gy#
status=0
zstatus=1
EndIf
End Function

Function ZombieUpdate()
If zstatus=1 Then
DrawImage(zombie,zx,zy)
If gx2>zx zx#=zx#+0.1
If gx2<zx zx#=zx#-0.1
If gy2>zy zy#=zy#+0.1
If gy2<zy zy#=zy#-0.1
Text zx+55,zy+35,"LP: "+zlp
EndIf
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Nov 19, 2009 4:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Für unbekannte Anzahl Sachen werden Types benutzt --> Type

Für bekannte Anzahl Sachen werden i.d.R. Arrays benutzt --> Dim

Dann ersparst du dir Unendliche Codeketten alá

Function GegnerUpdate2()
Function GegnerUpdate3()
Function GegnerUpdate4()
Function GegnerUpdate5()

Hier gleich mal ein TestCode: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(50)

Type TFlare
   Field XP#
   Field YP#
   Field XG#
   Field YG#
   Field AT%
   Field FA%
End Type

Local XP#=0
Local YP#=0
Local XG#=0
Local YG#=0
Local TF.TFlare


While Not KeyHit(1)
   XP=MouseX()
   YP=MouseY()
   XG=MouseXSpeed()
   YG=MouseYSpeed()
   XG=XG/10
   YG=YG/10
   
   
   If MouseDown(1) Then
      ;Neuen Partikel erstellen
      TF.TFlare=New TFlare
      ;Zufälligen Farbwert zuweisen
      TF\FA=Rand(0,255)
      ;Position aus Mausposition
      TF\XP=XP
      TF\YP=YP
      ;Geschwindigkeit aus MausSpeed
      TF\XG=XG+Rnd(-.1,.1)
      TF\YG=YG+Rnd(-.1,.1)
   End If
   
   
   ;Alle Partikel bewegen
   For TF.TFlare=Each TFlare
      ;Geschwindigkeit zur Position zurechnen
      TF\XP=TF\XP+TF\XG
      TF\YP=TF\YP+TF\YG
      ;Bildschirmeingrenzung beibehalten
      If TF\XP>400 Or TF\XP<0 Then TF\XG=-TF\XG
      If TF\YP>400 Or TF\YP<0 Then TF\YG=-TF\YG
      ;Altern vom Partikel um eins
      TF\AT=TF\AT+1
      ;Farbe und Position vom Partikel zeichnen
      Color 255,TF\FA,255-TF\FA
      Rect TF\XP-2,TF\YP-2,5,5,1
      ;Wenn Partikel älter als 500 dann diesen löschen
      If TF\AT>500 Then Delete TF
   Next
   
   WaitTimer(Timer)
   Flip 0
   Cls
Wend
End


Und normaler Weise geht man pennen um die Zeit. Shocked
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

M0rgenstern

BeitragDo, Nov 19, 2009 11:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd das so machen:

Wenn die Lebenspunkte <= 50 sind und sich die Bilder überlappen und man die Maustaste drückt, dann:
Wird das Image für den Type einfach geändert.


Ich würde dir sowieso raten, eine einheitliche "AllesZeichnen" Funktion zu schreiben.
Ansonsten kann ich dir auch nur raten dich wirklich mal mit Types zu beschäftigen. UNdzwar ordentlich. Sonst seh ich für das Spiel da schwarz.

Lg, M0rgenstern
 

ZaRaK

BeitragDo, Nov 19, 2009 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für eure Antworten!
Das mit den Types habe ich nun mal versucht, allerdings flackern die Gegner hier wie wild über den Bildschirm.
Irgendwas habe ich wohl mit der 'for Schleife' falsch gemacht.
Es werden ständig 3 neue Gegner irgendwo erstellt und sofort wieder entfernt.
Wo liegt hier der Fehler? Ich kann ihn einfach nicht finden.

Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer BackBuffer()

Global zstatus=0
Global status=1
Global spielerimg=LoadImage("z.JPG")
Global gegnerimg=LoadImage("e.JPG")
Global zombieimg=LoadImage("za.JPG")
Global slp=100
Global zlp=50
Global zx#=100
Global zy#=100
Global sx#=400
Global sy#=300

Type Gegner
Field glp#
Field gx#
Field gy#
Field zomb#
End Type

Global g.gegner
Global glp#=100
Global gx#=0
Global gy#=0
Global zomb#=0

While Not KeyHit(1)
Cls

For g.gegner=Each gegner Delete g Next
SpielerUpdate()
Gegner()
GegnerUpdate()

Flip
Wend

Function SpielerUpdate()
DrawImage(spielerimg,sx,sy)
If KeyDown(17) sy#=sy#-1
If KeyDown(30) sx#=sx#-1
If KeyDown(31) sy#=sy#+1
If KeyDown(32) sx#=sx#+1
Text sx#+55,sy#+35,"LP: "+slp
End Function

Function Gegner()
For i=1 To 3
   g.gegner=New Gegner
   g\gx#=Rnd(800)
   g\gy#=Rnd(600)
Next
End Function

Function GegnerUpdate()
For g.gegner=Each gegner
   DrawImage(gegnerimg,g\gx#,g\gy#)
   Text g\gx#+55,g\gy#+35,"LP: "+glp
   If ImagesOverlap(spielerimg,sx#,sy#,gegnerimg,gx#,gy#) And MouseHit(1) glp=glp-10
Next
End Function

Starwar

BeitragDo, Nov 19, 2009 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Du darfst die Gegner nicht immer löschen und dann an einer Zufallsposition neu setzen. Wink
Vor der Hauptschleife erstellst du sie (For i=0 to anzahl-1 Und New) und in der Hauptschleife änderst du ihre Position und zeichnest sie (For-Each)
MFG

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group