UFO - Fight

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

cleminator

Betreff: UFO - Fight

BeitragMi, Apr 19, 2006 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo! Hab mir heute gedacht ich schreib mal so ne art Moorhuhn nur mid Ufos... So halt auch alles ziemlich gut geklappt. Mein Problem ist nur eines:
Alle Ufos sind Types. So Wenn ich jetzt irgend eines abschiesse dann passiert nix, ziel ich auf das "Älteste" Also auf das Ufo das von allen die gerade auf dem Bildschrim sind zuerst erstellte dann wird es gelöscht. Was muss ich machen damit jedes das ich anklicke gelöscht wird. (Also nicht wenn ich auf eines Zeile alle sondern einfach jedes auf das ich Klicke) ...Wieder mal unglücklich formuliert..aber vielleicht bringts ja was (PS: Habs übrigens schon mit jedem Typestutorial versucht ich versteh keines.)

Hier der CODE:

Code: [AUSKLAPPEN]



Graphics 1024,768,32,1
SetBuffer BackBuffer()


;Globals
Global bgmenu = LoadAnimImage("bg-menu.bmp",1024,768,0,2)
Global ufo = LoadImage("ufo.bmp")
Global cursor = LoadAnimImage("cursor.bmp",19,22,0,3)
Global bggame = LoadImage("bg-game.jpg")
Global menuschleife = True 
Global bgframe = 0
Global spieleschleife = False
Global timeup = False
Global timer
Global gegner
Global restzeit = 4
;Einstellungen der Images
MaskImage cursor,255,0,255
MaskImage ufo, 255,0,255

;Types
Type enemy
   Field x,y
   Field speed#
End Type


SeedRnd(MilliSecs())

;Functions
Function menusteuerung()
If KeyHit(208) Then
bgframe = bgframe + 1
EndIf

If KeyHit(200) Then
bgframe = bgframe - 1
EndIf

If bgframe > 1 Then
bgframe = 0
EndIf

If bgframe < 0 Then
bgframe = 1
EndIf

If bgframe > 0 And KeyHit(28) Then
menuschleife = False
EndIf


If bgframe < 1 And KeyDown(28) Then
menuschleife = False
FlushKeys
spieleschleife = True
EndIf

End Function

Function neuergegner()
If MilliSecs() > timer + Rnd(800,2000) Then
gegner = Rnd(0,10)
If gegner < 5 Then
n.enemy = New enemy
n\x = -80
n\y = Rnd(50,700)
n\speed = Rnd(1,3)
EndIf

If gegner > 5 Then
g.enemy = New enemy
g\x = 1050
g\y = Rnd(50,700)
g\speed = Rnd(-3,-1)
EndIf
timer = MilliSecs()
EndIf
End Function


Function updategegner()
For n.enemy = Each enemy
DrawImage ufo,n\x,n\y
n\x = n\x + n\speed
Next

For g.enemy = Each enemy
DrawImage ufo,g\x,g\y
g\x = g\x + g\speed
Next

End Function

Function gegnerabschiessen()
For n.enemy = Each enemy
If ImagesCollide(ufo,n\x,n\y,0,cursor,MouseX(),MouseY(),0) And MouseHit(1)
Delete n.enemy
Exit
EndIf
Next

For g.enemy = Each enemy
If ImagesCollide(ufo,g\x,g\y,0,cursor,MouseX(),MouseY(),0) And MouseHit(1)
Delete g.enemy
Exit
EndIf
Next

End Function
;Menüschleife



Repeat
Cls
DrawImage bgmenu,0,0,bgframe
menusteuerung()
Flip
Until menuschleife = False



;Spielschleife

If spieleschleife = False
Goto ende
EndIf

Repeat
Cls

If MilliSecs() > timer + 1000
restzeit = restzeit - 1
timer = MilliSecs()
EndIf

If restzeit < 1 Then
timeup = True
EndIf

Text 410,330, "Noch " + restzeit + " bis zum Start!"
FlushKeys
Flip
Until timeup = True
;______


Repeat
Cls
DrawImage bggame,0,0
neuergegner()
updategegner()
gegnerabschiessen()
DrawImage cursor,MouseX(),MouseY(),0
If KeyHit(1) Then
Goto ende
EndIf

Flip
Until spieleschleife = False



;______
.ende
End






5k41

BeitragMi, Apr 19, 2006 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal glaub ich du hast den sinn einer For-Each schleife noch nicht verstanden! Ich mein sie durchläuft alle Objekte und da lässt beim löschen 2 mal eine durchlaufen für die verschiedenen Instanzierungen Ö.ö

Ausserdem wundert mich es, das es so funktioniert! Ich dachte immer damit funktionen etwas an Types ändern können/welche erstellen können müssen sie als "Datentyp" den Type haben also: Updategegner.enemy()

Hoffe das hilft dir schonmal weiter!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Apr 19, 2006 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Problem liegt an Mousehit(1)!
Code: [AUSKLAPPEN]

; MainLoop
MH = Mousehit(1)



Function gegnerabschiessen ()
if MH  then
    For n.enemy = Each enemy
        If ImagesCollide (ufo,n\x,n\y,0,cursor,MouseX () ,MouseY () ,0) And Then
            Delete n.enemy
            Exit
        EndIf
    Next
End If 
End Function

Wenn du Mousehit() oder Keyhit() benutzt wird dieser automatisch auf 0 zurück gesetzt, bzw geleert!
Da ist es am besten wenn du das nur einmal in der Mainloop machst und den Wert in einer globalen Variablen speicherst.

Deine doppelten Schleifen bringen dir da auch nichts!
Weiter habe ich es mir auch nicht angesehen, kannst das ja erst mal abändern!
[BB2D | BB3D | BB+]
 

cleminator

BeitragMi, Apr 19, 2006 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 5k41 ne also deine antwort hab ich gar nicht gecheckt *gg* ...
@Rallimen Jetzt funtzt gar nix mehr..

Achja und als ich angefangen hab mal ein bischen Types zu verstehen hab ich mir einfach mal das Spiel "Heli Hunter" von Robs-Kurs hergenommen.da ist es auch so ähnlich drin...fällt mir grad ein, ich sollte mal reinschauen vl find ich da ne lösung

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Apr 19, 2006 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau funzt nicht mehr?

Vielleicht vergessen MH als Global zu deklariern?
[BB2D | BB3D | BB+]

5k41

BeitragDo, Apr 20, 2006 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
naja eine For-Each schleife läuft alle Objekte durch (in deinem Fall die von Enemy) heißt die n.enemy und die g.enemy (BEIDE), das heißt, das du beim löschen nur eine schleife brauchst, da die Namen der Instanzierungen (ableitungen eines Types die per New erstellt werden) nicht berücksichtigt werden.

Zu dem MouseHit problem: Würden statt mousehit mousedown und nen Timer nehmen, da du jenen sowieso später noch fürs nachladen brauchst und du dir die sache per mousehit nur unnötig komplex machst Wink

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Apr 20, 2006 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke mal das es für einen Anfänger schwer ist, sich selbst ein Mausehit mit Mousdown zu basteln!
Und das nachladen wird doch mit der rechten Maustaste gemacht!
[BB2D | BB3D | BB+]
 

cleminator

BeitragFr, Apr 21, 2006 9:08
Antworten mit Zitat
Benutzer-Profile anzeigen
okay danke!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group