Problem mit dem kompletten Code (wie sich rausstellte)

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen

Chrissa

Betreff: Problem mit dem kompletten Code (wie sich rausstellte)

BeitragMo, Dez 28, 2009 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir kommt immer gleich nach Start des Programms die Fehlermeldung: "Not enough Frames in Bitmap"

Das kann aber nicht sein, da ich nirgends in meinem Programm eine bmp-Datei lade. Oder ist diese Fehlermeldung unabhängig vom "fehlerhaften" Dateityp?

Wenn er euch hilft, hier ist der Quelltext:
BlitzBasic: [AUSKLAPPEN]
.oben
AppTitle "Space Shooter"



Graphics 1280,1024,32,1
SetBuffer BackBuffer()
AutoMidHandle(True)


;Globals


Global count_en=0
Global count_ufo=0

Global waffe = 1

Type TSchuss
Field x
Field y
Field s_type
Field strength
Field speed
End Type

Type Talien
Field x
Field y
Field health
Field bild
End Type

Type Tufo
Field x
Field y
Field health
Field picture
End Type

Type player
Field x
Field y
Field health
End Type

Global TPlayer.player=New player
TPlayer\x=1280/2
TPlayer\y=800
TPlayer\health=1000

Global ShuttleFireZeit








;Images

Global space=LoadImage("space.png")
Global alienbild=LoadImage("alien.png")
Global shuttle=LoadImage("shuttle.png")
Global ufobild=LoadImage("ufo.png")
Global shuttle_fire=LoadImage("rocket fire.png")
Global e1_death=LoadAnimImage("alien death anim.png",203,118,0,3)
Global e2_death=LoadAnimImage("ufo death anim.png",239,118,0,3)
Global gameover=LoadImage("Game Over.png")

Global kugel=LoadImage("schuss_2.png")
Global laser=LoadImage("schuss_1.png")
Global rocket=LoadImage("schuss_3.png")

Global back=LoadImage("Main background.png")
Global option=LoadImage("Optionen.png")
Global Anleitung=LoadImage("Ende.png")
Global Ende=LoadImage("Ende.png")
Global Credits=LoadImage("Credits.png")
Global Start=LoadImage("Spiel Starten.png")
Global mouse=LoadImage("Mouse.png")








;Game

.main

While Not KeyDown(1)

draw()
If TPlayer\health >0 Then
move()
waffe()
EndIf

AlienSpawn()
UfoSpawn()
e1_dies()
e2_dies()






Flip
Wend
End






;Funtkion Spielerbewegung

Function move()

If KeyDown(203)
TPlayer\x=TPlayer\x-8
EndIf


If KeyDown(205)
TPlayer\x=TPlayer\x+8
EndIf

If KeyDown(208)
TPlayer\y=TPlayer\y+8
EndIf

If KeyDown(200)
TPlayer\y=TPlayer\y-8
ShuttleFireZeit = MilliSecs()+200
EndIf

If TPlayer\x <= 80 Then
TPlayer\x = 80
EndIf

If TPlayer\x >= 1220 Then
TPlayer\x=1220
EndIf

If TPlayer\y <= 80 Then
TPlayer\y=80
EndIf

If TPlayer\y >= 944 Then
TPlayer\y=944
EndIf

End Function



;Funktion Alienspawn

Function AlienSpawn()
count_en = count_en +1

If count_en >=100 Then
count_en=0

Enemy1.Talien=New Talien
Enemy1\x=Rnd(20,1260)
Enemy1\y=-50
Enemy1\health=100
Enemy1\bild=alienbild
EndIf

End Function



;Funktion Ufospawn

Function UfoSpawn()
count_ufo = count_ufo +1

If count_ufo >=300 Then
count_ufo=0
Enemy2.Tufo=New Tufo
Enemy2\x=Rnd(20,1260)
Enemy2\y=-50
Enemy2\health=300
Enemy2\picture=ufobild
EndIf


End Function


;Funktion Select Weapon und schießen

Function waffe()


If KeyHit(56) Then waffe=waffe+1

If waffe=4 Then waffe=1

Select waffe

Case 1
If KeyHit(57) Then
Schuss.TSchuss = New TSchuss
Schuss\x=TPlayer\x-10
Schuss\y=TPlayer\y+20
Schuss\s_type= kugel
Schuss\speed = 10
Schuss\strength = 10
EndIf

Case 2
If KeyHit(57) Then
Schuss.TSchuss = New TSchuss
Schuss\x=TPlayer\x-10
Schuss\y=TPlayer\y+20
Schuss\speed = 20
Schuss\s_type= laser
Schuss\strength=50
EndIf


Case 3
If KeyHit(57)
Schuss.TSchuss= New TSchuss
Schuss\x=TPlayer\x-10
Schuss\y=TPlayer\y+20
Schuss\s_type= rocket
Schuss\speed=6
Schuss\strength=100
EndIf

End Select



End Function

;Funktion Alien Dies

Function e1_dies()
For Schuss.TSchuss=Each TSchuss
For Enemy1.Talien=Each Talien


If ImagesCollide(Schuss\s_type,Schuss\x,Schuss\y,0,alienbild,Enemy1\x,Enemy1\y,0) Then
Enemy1\health=Enemy1\health-Schuss\strength
Delete Schuss.TSchuss
If Enemy1\health <= 0 Then
Enemy1\health=0
Delete Enemy1.Talien
Exit
EndIf
EndIf

If Enemy1\y=1024-50 Then
Delete Enemy1.Talien
Exit
EndIf

Next
Next

End Function

;Funktion Ufo Dies

Function e2_dies()
For Schuss.TSchuss=Each TSchuss
For Enemy2.Tufo=Each Tufo

If ImagesCollide(Schuss\s_type,Schuss\x,Schuss\y,0,ufobild,Enemy2\x,Enemy2\y,0) Then
Enemy2\health=Enemy2\health-Schuss\strength
Delete Schuss.TSchuss
If Enemy2\health <=0 Then
Enemy2\health=0
Delete Enemy2.Tufo
Exit
EndIf
EndIf

If Enemy2\y=1024-50 Then
Delete Enemy2.Tufo
Exit
EndIf

Next
Next

End Function



;Funktion Player Dies

Function pl_dies()
For Enemy1.Talien=Each Talien


If ImagesCollide(shuttle,TPlayer\x,TPlayer\y,0,Enemy1\bild,Enemy1\x,Enemy1\y,0) Then
TPlayer\health=TPlayer\health-50
EndIf

Next


For Enemy2.Tufo=Each Tufo

If ImagesCollide(shuttle,TPlayer\x,TPlayer\y,0,Enemy2\picture,Enemy2\x,Enemy2\y,0) Then
TPlayer\health=TPlayer\health-100
EndIf
Next



End Function





;Funktion Screen malen

Function draw()
Cls

DrawImage space,1280/2,1024/2
DrawImage shuttle,TPlayer\x,TPlayer\y

For Enemy1.Talien = Each Talien
Enemy1\y=Enemy1\y+5
DrawImage Enemy1\bild,Enemy1\x,Enemy1\y-5
Next

For Enemy2.Tufo = Each Tufo
Enemy2\y=Enemy2\y+3
DrawImage Enemy2\picture,Enemy2\x,Enemy2\y
Next

For Schuss.TSchuss = Each TSchuss
Schuss\y=Schuss\y-Schuss\speed
DrawImage Schuss\s_type,Schuss\x,Schuss\y-40
Next

If ShuttleFireZeit > MilliSecs() Then
DrawImage shuttle_fire,TPlayer\x-4,TPlayer\y+55
EndIf

If TPlayer\health <=0 Then
DrawImage Gameover,1280/2,1024/2
End
EndIf
End Function


EDIT 19.1.2010 14:14

Das Problem liegt anscheinend an der Zeile:
e1_death=LoadAnimImage("alien death anim.png",610,118,0,3)
, denn erst seit ich diese eingefügt habe, geht es nicht mehr...

Die Zeile stimmt doch oder?

Danke schon mal im Voraus Smile
  • Zuletzt bearbeitet von Chrissa am Di, Jan 19, 2010 19:34, insgesamt 5-mal bearbeitet

Midimaster

BeitragMo, Dez 28, 2009 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Sind die 4 Einzelbilder Deiner Animation wirklich jeweils 610 pixel breit?

Zitat:
e1_death=LoadAnimImage("alien death anim.png",610,118,0,3)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 28, 2009 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Bitmap ist nicht gleich eine BMP-Datei, sondern eine BMP-Datei ist eine Bitmap, wie auch PNG, JPG, PCX, GIF etc...

Die Alternative zu einer Bitmap ist eine Vektor-Grafik.

Wenn du nun e1_death=LoadAnimImage("alien death anim.png",610,118,0,3) hin schreibst, erwartet der Befehl eine Bilddatei ''Bitmap'' von mindestens den Ausmaßen von 1830x118 oder 1220x236 oder 610x354 Pixeln, da du 3 Frames mit diesen Größen daraus grabbst.

Wie groß ist sind denn die Ausmaße der Kantenlängen von ''alien death anim.png''?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Chrissa

BeitragMo, Dez 28, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ach so^^ verdammt nein das ist die Breite des gesamten Bildes^^ aber eigentlich sind es nur 3 Bilder... Warum meinst du es seien 4?
Das Bild ist 610x118 Pixel groß...



PS: Da ich es jetzt durch 3 geteilt habe funktioniert es, aber leider viel zu schnell.... - trotzdem danke Smile .Außerdem meine ich, dass nicht alle 3 Bilder abgespielt werden... wie mache ich das langsamer???

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 28, 2009 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Für eine langsamer Animation kannst du einen selbst gebastelten Timer alá MilliSecs ausprobieren. Ist aber eine nicht so ganz einfache Sache, wenn man gerade angefangen hat zu programmieren. Ansonsten kannst du auch einfach nur die Frames zählen, bis das nächste Animationsframe angezeigt werden soll. Das schliesst mit ein, dass man einen Timer per CreateTimer in der Hauptschleife laufen lässt.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Chrissa

BeitragMo, Dez 28, 2009 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Kapier ich jetzt nicht so ganz... Wie meinst du das? Soll ich dann einen 3. Parameter für das DrawImage machen, der den Timer beinhaltet?


PS: Mein Kumpel meinte ich solle eine For-Schleife darum machen. Etwa so:
Mein Code:
Code: [AUSKLAPPEN]
For i = 0 To 2
DrawImage e2_death,bla\x,bla\y,i
blabla\health=0
blabla\x=-10000000000000000000
Next


Sein Code:
Code: [AUSKLAPPEN]
For i = 0 To 2
DrawImage (e1_anim,noob\f_x,noob\f_y,i)
noob\f_alive = 0
noob\f_y = -100000000000
Next


Funktioniert bei ihm, aber iwie nich bei mir... was mache ich falsch?
 

Lion

BeitragMo, Dez 28, 2009 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
oh gott nein. doch keine for-schleife.
In einer for-schleife wird die hauptschleife erstmal nicht weitergeführt, so dass nicht geflippt oder ähnliches wird, sprich du siehst die zwischenschritte gar nicht.
machs mit millisecs()

Den timer sollst du nicht machen. du sollst den aktuellen frame in dem parameter haben, der mit ablauf des timers um 1 erhöht wird und mit Mod 3 nach ablauf des bildes wieder auf 0 gesetzt wird...
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Midimaster

BeitragDi, Dez 29, 2009 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
neinnein, deine

DrawImage (e1_anim,noob\f_x,noob\f_y,i)

hat doch hinten den Parameter i

und der darf einfach nicht so schnell von 0 bis 2 durchlaufen, wie er das mit einer FOR/NEXT schafft:

BlitzBasic: [AUSKLAPPEN]
Function AnimAblauf()
Local Frame%, FrameZeit%
FrameZeit=MilliSecs()+500
Repeat
DrawImage e1_anim,noob\f_x,noob\f_y,Frame
If MilliSecs()>FrameZeit
FrameZeit=MilliSecs()+500
Frame=Frame+1
EndIf
Flip
Until AktFrame>3
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Dez 29, 2009 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich finde den Code doch etwas komisch Midimaster. Sein Programm wird doch nicht nur die eine Animation anzeigen, sondern nebenbei auch noch eine Spielemechanik beinhalten. Da würde ich lieber folgendes vorschlagen:

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

Local Timer=CreateTimer(58)
Local Frame1Count
Local Frame1Wait
Local MS


While Not KeyHit(1)
   
   MS=MilliSecs()
   
   If MS>Frame1Wait Then
      Frame1Count=(Frame1Count+1) Mod 4
      Frame1Wait=MS+500
   End If
   
   Text MouseX()-20,MouseY(),Frame1Count
   
   WaitTimer Timer
   Flip 0
   Cls
Wend
End


Aber ich lasse mich gerne vom Gegenteil überzeugen. Der Code beinhaltet einen Framezähler und ein nebeher laufendem Programm. Der Timer reduziert das ganze auf nahe 60 FPS, was den meisten Flachbildschirmen entspricht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Chrissa

BeitragDi, Dez 29, 2009 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann trage ich also für die Animation DrawImage e1_death,bla\x,bla\y,Frame1Count anstatt dein Text ein, richtig?
Das Problem ist jetzt nur: "Memory acces violation" Markiert ist die Zeile: "Waittimer Timer"

Hier der Code:
Code: [AUSKLAPPEN]
;Enemy Dies
For noob.schuss=Each schuss
For bla.alien=Each alien
For blabla.ufo=Each ufo

If ImagesCollide(noob\s_type,noob\x,noob\y,0,alien,bla\x,bla\y,0) Then
bla\health=bla\health-noob\strength
noob\x=-10000000000000
If bla\health <= 0 Then


Local Timer=CreateTimer(58)
Local Frame1Count
Local Frame1Wait
Local MS
MS=MilliSecs()
   
If MS>Frame1Wait Then
Frame1Count=(Frame1Count+1) Mod 4
Frame1Wait=MS+500
DrawImage e1_death,bla\x,bla\y,Frame1Count
EndIf

bla\x=-1000000000000000000
bla\health=0

EndIf
EndIf


If ImagesCollide(noob\s_type,noob\x,noob\y,0,ufo,blabla\x,blabla\y,0) Then
blabla\health=blabla\health-noob\strength
noob\x=-100000000000000
If blabla\health <=0 Then


MS=MilliSecs()
   
If MS>Frame1Wait Then
Frame1Count=(Frame1Count+1) Mod 4
Frame1Wait=MS+500
EndIf
DrawImage e2_death,bla\x,bla\y,Frame1Count 
WaitTimer Timer
blabla\health=0
blabla\x=-10000000000000000000

EndIf
EndIf

If ImagesCollide(shuttle,lol\x,lol\y,0,alien,bla\x,bla\y,0) Then
player_health=player_health-50
EndIf

If ImagesCollide(shuttle,lol\x,lol\y,0,ufo,blabla\x,blabla\y,0) Then
player_health=player_health-100
EndIf

If player_health <=0 Then
DrawImage gameover,1280/2,1024/2
Delay 2000
End
EndIf




Next
Next
Next

hazumu-kun

BeitragDi, Dez 29, 2009 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Rücke deinen Code bitte ein Smile

Ich denke wenn du bei Waittimer einen MAV bekommst, ist eben kein timer da.
Tippfehler bei der variable?
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Xeres

Moderator

BeitragDi, Dez 29, 2009 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreifach verschachtelte For..each Schleifen, Variablen die ganz eindeutig falsch sind (der Wert -10000000000000 -10 Billiarden- kann eine Interger Variable nicht enthalten...), und innerhalb der dreifachen verschachtelung ein Waittimer, ganz abgesehen von Delay...
Bitte schau dir mal ein paar Tutorials an wenn du das noch nicht gemacht hast und mach dich erst mal mit kleinen Beispielen mit den Befehlen vertraut die du benutzt.
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)

Midimaster

BeitragDi, Dez 29, 2009 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Schreibstil sieht leider sehr nach Spaghetti-Code aus. Ich nehme einmal an, das in dieser Code dazu dient festzustellen, ob ein Enemy stirbt.

Dazu mußt Du die Kollisionen überprüfen. Immer wenn etwas stirbt solltest Du in die Funktion SterbeAnimation wechseln. Die wird in eine Funktion ausgelagert und dann von den verschiedenen Stellen Deines Codes angesprungen. Diese SterbeAnimation muss natürlich wissen, wer gestorben ist, deshalb musst Du ihr den Enemy als Parameter übergeben.

Das ist zwar keine 100% optimale Lösung, aber vielleicht das, was Du in diesen Code auch selbst einbauen kannst.

Auch ich habe den Eindruck, dass Du selbst nicht ganz verstanden hast, was Du hier genau mit den Befehlen bewirkst.

Beispiel: Wenn Du Kollisionen testest, dann doch immer nur 2 Objekte miteinander. Das können dann höchsten 2fach verschachtelte FOR/NEXT sein. Dafür dann 3 Blöcke hintereinander oder?



BlitzBasic: [AUSKLAPPEN]
For A.Typ1= Each..
ForB.Typ2= Each...
TesteCollision A B
Next
Next

For A.Typ1= Each..
ForC.Typ2= Each...
TesteCollision A C
Next
Next

For B.Typ1= Each..
ForC.Typ2= Each...
TesteCollision B C
Next
Next



Der WAITTIMER geht nicht, weil Du die Variable TIMER local gemacht hast.

vielleicht wirfst Du ma ein Auge auf meine drei Tutorials:

https://www.blitzforum.de/foru...hp?t=33456

https://www.blitzforum.de/foru...hp?t=33468

https://www.blitzforum.de/foru...hp?t=33510


Hier ein paar Tipps zum Umbau Deines Codes:

Erst einmal rückst Du alle Strukturen bitte ein. Dann gliederst Du alle Aktionen wie z.B. "Alien neu" in jeweils eine Funktion aus.

Diese Funktionen werden dabei entstehen:

- Screen malen

- Neues Alien erschaffen

- Neues Ufo

- Waffenwahl

- Schuss abgeben

-Kollisionen checken

- Enemy stirbt

-Spieler bewegt sich

Diesen Code stellst Du wieder hier ins Forum zur Diskussion.

Dazu wird es dann diese Main-Schleife geben:

BlitzBasic: [AUSKLAPPEN]
While Not KeyDown(1)
Cls
NeuerEnemy
.....
SpielerBewegen
ScreenMalen
Flip 0
Wend


...und länger sollte die Mainschleife gar nicht werden!

Ich helfe Dir gern dabei, da genau dies auch das Thema meines nächsten Tutorials Grundsätzlicher Aufbau eines Spiels wird

Chrissa

BeitragDi, Dez 29, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
das Problem dabei ist, dass ich nicht wirklich kapiere wie man dann eine fertige function abspielt Crying or Very sad Embarassed ... In dem Tutorial, das ich habe, ist das sehr durchsichtig... Sry aber Funktionen sind einfach nich mein Ding... Embarassed


Und was meint ihr mit Code einrücken?



EDIT: Blöder Weise bekomme ich jetzt die Fehlermeldung: "Function can only appear in Main Programm" ... Jetzt bin ich am Ende mit meinem Latein Embarassed Crying or Very sad
  • Zuletzt bearbeitet von Chrissa am Di, Dez 29, 2009 23:06, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Dez 29, 2009 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionen sind very easy

Du nimmtst einen Teil aus dem Main-Programm (Main-Programm=damit meine ich den lange Code von Dir) und schreibst es ganz unten an das Ende deines Codes. Und an die Stelle, wo jetzt das Loch klafft, kommt der Funktionsaufruf. Probier das mal mit dem Block "Alien spawn", aber lass das Malen im Hauptprogramm. Unten soll dann eine Funktion AlienSpawn() stehen, in der nix anderes geschieht, als das ein neues Alien entsteht. Schreib mir das Eregbnis hier.

Einrücken:

lies mal Kapitel 1 meines "Fehler vermeiden" Tutorial:

https://www.blitzforum.de/foru...highlight=

geht ganz schnell, hift aber...

Chrissa

BeitragDi, Dez 29, 2009 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier der Code:
Code: [AUSKLAPPEN]
AppTitle "Space Shooter"



Graphics 1280,1024,32,1
SetBuffer BackBuffer()
AutoMidHandle(True)


;Globals

Global player_x = 1280/2
Global player_y = 900
Global player_health=1000

Global ufo_x = 1280/2
Global ufo_y = 0

Global count_en=0
Global count_ufo=0

Global waffe = 1

Type schuss
Field x
Field y
Field s_type
Field strength
Field speed
End Type

Type alien
Field x
Field y
Field health
End Type

Type ufo
Field x
Field y
Field health
End Type

Type player
Field x
Field y
Field health
End Type

lol.player=New player
lol\x=1280/2
lol\y=800
lol\health=1000






;Images

space=LoadImage("space.png")
alien=LoadImage("alien.png")
shuttle=LoadImage("shuttle.png")
ufo=LoadImage("ufo.png")
kugel=LoadImage("schuss_2.png")
laser=LoadImage("schuss_1.png")
rocket=LoadImage("schuss_3.png")
shuttle_fire=LoadImage("rocket fire.png")
e1_death=LoadAnimImage("alien death anim.png",203,118,0,3)
e2_death=LoadAnimImage("ufo death anim.png",239,118,0,3)
gameover=LoadImage("Game Over.png")





;Game



While Not KeyDown(1)

Cls


DrawImage space,1280/2,1024/2
DrawImage shuttle,lol\x,lol\y







Flip
Wend
End






;Funtkion Spielerbewegung

Function move(2)

If KeyDown(203)
lol\x=lol\x-8
EndIf

If KeyDown(205)
lol\x=lol\x+8
EndIf

If KeyDown(208)
lol\y=lol\y+8
EndIf

If KeyDown(200)
lol\y=lol\y-8
DrawImage shuttle_fire,lol\x-4,lol\y+55
EndIf

If lol\x <= 80 Then lol\x = 80
If lol\x >= 1220 Then lol\x=1220
If lol\y <= 80 Then lol\y=80
If lol\y >= 944 Then lol\y=944

End Function



;Funktion Alienspawn

Function alien(3)
count_en = count_en +1
If count_en >=100 Then
count_en=0


bla.alien=New alien
bla\x=Rnd(20,1260)
bla\y=-50
bla\health=100
EndIf

For bla.alien = Each alien
bla\y=bla\y+5
DrawImage alien,bla\x,bla\y
Next

End Function



;Funktion Ufospawn

Function ufo(4)
count_ufo = count_ufo +1
If count_ufo >=300 Then
count_ufo=0

blabla.ufo=New ufo
blabla\x=Rnd(20,1260)
blabla\y=-50
blabla\health=300
EndIf

For blabla.ufo = Each ufo
blabla\y=blabla\y+3
DrawImage ufo,blabla\x,blabla\y
Next
End Function


;Funktion Select Weapon und schießen

Function waffe(5)
If KeyHit(56) Then waffe=waffe+1

If waffe=4 Then waffe=1

Select waffe

Case 1
If KeyHit(57) Then
noob.schuss = New schuss
noob\x=lol\x-10
noob\y=lol\y+20
noob\s_type= kugel
noob\speed = 10
noob\strength = 10
DrawImage kugel,noob\x,noob\y-40
EndIf

Case 2
If KeyHit(57) Then
noob.schuss = New schuss
noob\x=lol\x-10
noob\y=lol\y+20
noob\speed = 20
noob\s_type= laser
noob\strength=50
DrawImage rocket,noob\x,noob\y-40
EndIf


Case 3
If KeyHit(57)
noob.schuss = New schuss
noob\x=lol\x-10
noob\y=lol\y+20
noob\s_type= rocket
noob\speed=6
noob\strength=100
DrawImage rocket,noob\x,noob\y-40
EndIf
End Select

For noob.schuss = Each schuss
noob\y=noob\y-noob\speed
DrawImage noob\s_type,noob\x,noob\y-40


Next

End Function

;Funktion Alien Dies
Function e1_dies(6)
For noob.schuss=Each schuss
For bla.alien=Each alien


If ImagesCollide(noob\s_type,noob\x,noob\y,0,alien,bla\x,bla\y,0) Then
bla\health=bla\health-noob\strength
noob\x=-100000
If bla\health <= 0 Then


Local Timer=CreateTimer(58)
Local Frame1Count
Local Frame1Wait
Local MS
MS=MilliSecs()
   
If MS>Frame1Wait Then
Frame1Count=(Frame1Count+1) Mod 4
Frame1Wait=MS+500
DrawImage e1_death,bla\x,bla\y,Frame1Count
EndIf

bla\x=-1000000
bla\health=0

EndIf
EndIf



Next
Next


;Funktion Ufo Dies

Function e2_dies(7)
For noob.schuss=Each schuss
For blabla.ufo=Each ufo

If ImagesCollide(noob\s_type,noob\x,noob\y,0,ufo,blabla\x,blabla\y,0) Then
blabla\health=blabla\health-noob\strength
noob\x=-10000
If blabla\health <=0 Then


MS=MilliSecs()
   
If MS>Frame1Wait Then
Frame1Count=(Frame1Count+1) Mod 4
Frame1Wait=MS+500
EndIf
DrawImage e2_death,bla\x,bla\y,Frame1Count 
WaitTimer Timer
blabla\health=0
blabla\x=-100000

EndIf
EndIf

Next
Next

End Function



;Funktion Player Dies

Function pl_dies(8)
For bla.alien=Each alien
For lol.player=Each player
If ImagesCollide(shuttle,lol\x,lol\y,0,alien,bla\x,bla\y,0) Then
player_health=player_health-50
EndIf

Next
Next

For blabla.ufo=Each alien
For lol.player=Each player
If ImagesCollide(shuttle,lol\x,lol\y,0,ufo,blabla\x,blabla\y,0) Then
player_health=player_health-100
EndIf
Next
Next

If player_health <=0 Then
DrawImage gameover,1280/2,1024/2
Delay 2000
End
EndIf

End Function







Die Funktionsaufrufe hab ich noch nicht drinn, weil ich nicht kapiere wie das gehen soll... Genau das gleiche mit den Parametern in den Klmmaern der Funtionen... Embarassed



PS: Deine Tutorials sind echt gut thxx Very Happy

Midimaster

BeitragDi, Dez 29, 2009 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
einfach den Namen der Funktion an dies Stelle schreiben, wo du den code vorher entfernt hast.


Allerdings bist du gleich ganz schön weit gegangen. hast du das original noch? du solltest erst mal nur den alienspan rausnehmen, dann diskutieren wir darüber, dann machst du den nächsten schritt, usw

am ende kannst du es für immer


sind keine zeilen jetzt schon eingerückt?

im forum sehen sie ja ziemlich platt aus:

Zitat:
Global waffe = 1

Type schuss
Field x
Field y
Field s_type
Field strength
Field speed
End Type


und so sollte es aussehen:

BlitzBasic: [AUSKLAPPEN]
Global waffe = 1
Type schuss
Field x
Field y
Field s_type
Field strength
Field speed
End Type




oder so:

BlitzBasic: [AUSKLAPPEN]
Function Alienspawn()
count_en = count_en +1
If count_en >=100 Then
count_en=0
bla.alien=New alien
bla\x=Rnd(20,1260)
bla\y=-50
bla\health=100
EndIf
End Function


Fragen dazu:
1.
warum nennst du die Funktion nicht einfach AlienSpawn() ? Das ist erlaubt.
2.
warum machst du so nummern in die funktionen: Function ufo(4)??? Das ist unnötig!
3.
warum nennst Du die localen Typen blabla? Wie wäre es mit tempUfo (für temporäres (Ufo) oder so. Nur "Ufo" ginge auch, aber leider heißt dein Type ja "Ufo". Für Typen schlage ich daher immer "UfoTyp" vor.


Tipps:

Du kannst die Mal-Befehle auch in den Funktionen lassen, aber ich würde dafür schon wieder neue Funktionen schreiben, oder sie erst mal im Main-Programm belassen.
  • Zuletzt bearbeitet von Midimaster am Do, Dez 31, 2009 0:35, insgesamt 2-mal bearbeitet

Chrissa

BeitragDi, Dez 29, 2009 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Vorgänger version noch und eine so genannte bb_bak1 datei, die sich auch öffnen lässt Smile

da schreib ich dann z.B. einfach alien() . mehr nicht?


jez is alles eingerückt:
Code: [AUSKLAPPEN]
AppTitle "Space Shooter"



Graphics 1280,1024,32,1
SetBuffer BackBuffer()
AutoMidHandle(True)


;Globals


Global count_en=0
Global count_ufo=0

Global waffe = 1

Type schuss
   Field x
   Field y
   Field s_type
   Field strength
   Field speed
End Type

Type alien
   Field x
   Field y
   Field health
End Type

Type ufo
   Field x
   Field y
   Field health
End Type

Type player
   Field x
   Field y
   Field health
End Type

Global pl.player=New player
pl\x=1280/2
pl\y=800
pl\health=1000






;Images

space=LoadImage("space.png")
alien=LoadImage("alien.png")
shuttle=LoadImage("shuttle.png")
ufo=LoadImage("ufo.png")
kugel=LoadImage("schuss_2.png")
laser=LoadImage("schuss_1.png")
rocket=LoadImage("schuss_3.png")
shuttle_fire=LoadImage("rocket fire.png")
e1_death=LoadAnimImage("alien death anim.png",203,118,0,3)
e2_death=LoadAnimImage("ufo death anim.png",239,118,0,3)
gameover=LoadImage("Game Over.png")








;Game


While Not KeyDown(1)

Cls


   DrawImage space,1280/2,1024/2
   DrawImage shuttle,pl\x,pl\y
   

move()
AlienSpawn()
UfoSpawn()
waffe()
e1_dies()
e2_dies()
pl_dies()


Flip
Wend
End






;Funtkion Spielerbewegung

Function move()

   If KeyDown(203)
      pl\x=pl\x-8
   EndIf
   

   If KeyDown(205)   
      pl\x=pl\x+8
   EndIf

   If KeyDown(208)
      pl\y=pl\y+8
   EndIf

   If KeyDown(200)
      pl\y=pl\y-8
      DrawImage shuttle_fire,pl\x-4,pl\y+55
   EndIf

   If pl\x <= 80 Then
      pl\x = 80
   EndIf
   
   If pl\x >= 1220 Then
      pl\x=1220
   EndIf
   
   If pl\y <= 80 Then
      pl\y=80
   EndIf
   
   If pl\y >= 944 Then
      pl\y=944
   EndIf

End Function



;Funktion Alienspawn

Function AlienSpawn()
   count_en = count_en +1
   
   If count_en >=100 Then
         count_en=0

      typ_1.alien=New alien
      typ_1\x=Rnd(20,1260)
      typ_1\y=-50
      typ_1\health=100
   EndIf

   For typ_1.alien = Each alien
      typ_1\y=typ_1\y+5
      DrawImage alien,typ_1\x,typ_1\y
   Next

End Function



;Funktion Ufospawn

Function UfoSpawn()
      count_ufo = count_ufo +1
   If count_ufo >=300 Then
      count_ufo=0

      typ_2.ufo=New ufo
      typ_2\x=Rnd(20,1260)
      typ_2\y=-50
      typ_2\health=300
   EndIf

   For typ_2.ufo = Each ufo
      typ_2\y=typ_2\y+3
      DrawImage ufo,typ_2\x,typ_2\y
   Next
End Function


;Funktion Select Weapon und schießen

Function waffe()

   If KeyHit(56) Then waffe=waffe+1

   If waffe=4 Then waffe=1

      Select waffe

      Case 1
   If KeyHit(57) Then
      typ.schuss = New schuss
      typ\x=pl\x-10
      typ\y=pl\y+20
      typ\s_type= kugel
      typ\speed = 10
      typ\strength = 10
      DrawImage kugel,typ\x,typ\y-40
   EndIf

      Case 2
   If KeyHit(57) Then
      typ.schuss = New schuss
      typ\x=pl\x-10
      typ\y=pl\y+20
      typ\speed = 20
      typ\s_type= laser
      typ\strength=50
      DrawImage rocket,typ\x,typ\y-40
   EndIf


      Case 3
   If KeyHit(57)
      typ.schuss = New schuss
      typ\x=pl\x-10
      typ\y=pl\y+20
      typ\s_type= rocket
      typ\speed=6
      typ\strength=100
      DrawImage rocket,typ\x,typ\y-40
   EndIf
   End Select

   For typ.schuss = Each schuss
      typ\y=typ\y-typ\speed
      DrawImage typ\s_type,typ\x,typ\y-40


   Next

End Function

;Funktion Alien Dies

Function e1_dies()
   For typ.schuss=Each schuss
   For typ_1.alien=Each alien


   If ImagesCollide(typ\s_type,typ\x,typ\y,0,alien,typ_1\x,typ_1\y,0) Then
      typ_1\health=typ_1\health-typ\strength
      typ\x=-100000
   If typ_1\health <= 0 Then


      Local Timer=CreateTimer(58)
      Local Frame1Count
      Local Frame1Wait
      Local MS
      MS=MilliSecs()
   
   If MS>Frame1Wait Then
      Frame1Count=(Frame1Count+1) Mod 4
      Frame1Wait=MS+500
      DrawImage e1_death,typ_1\x,typ_1\y,Frame1Count
   EndIf

      typ_1\x=-1000000
      typ_1\health=0

   EndIf
   EndIf



   Next
   Next

End Function

;Funktion Ufo Dies

Function e2_dies()
   For typ.schuss=Each schuss
   For typ_2.ufo=Each ufo

   If ImagesCollide(typ\s_type,typ\x,typ\y,0,ufo,typ_2\x,typ_2\y,0) Then
      typ_2\health=typ_2\health-typ\strength
      typ\x=-10000
   If typ_2\health <=0 Then


      MS=MilliSecs()
   
   If MS>Frame1Wait Then
      Frame1Count=(Frame1Count+1) Mod 4
      Frame1Wait=MS+500
   EndIf
      DrawImage e2_death,typ_1\x,typ_1\y,Frame1Count 
      WaitTimer Timer
      typ_2\health=0
      typ_2\x=-100000

   EndIf
   EndIf

   Next
   Next

End Function



;Funktion Player Dies

Function pl_dies()
   For typ_1.alien=Each alien
   For pl.player=Each player
   
   If ImagesCollide(shuttle,pl\x,pl\y,0,alien,typ_1\x,typ_1\y,0) Then
      pl\health=pl\health-50
   EndIf

   Next
   Next

   For typ_2.ufo=Each alien
   For pl.player=Each player
   
   If ImagesCollide(shuttle,pl\x,pl\y,0,ufo,typ_2\x,typ_2\y,0) Then
      player_health=player_health-100
   EndIf
   
   Next
   Next

   If pl\health <=0 Then
      DrawImage gameover,1280/2,1024/2
      Delay 2000
      End
   EndIf

End Function




Bei diesem Code bekomme ich jetzt nur leider die Meldung "Variable must be a type"...
  • Zuletzt bearbeitet von Chrissa am Mi, Dez 30, 2009 0:00, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Dez 29, 2009 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
"Alien()" geht nicht, weil ein Typ von dir ja schon so heißt. Bleib doch bei AlienSpawn().

Ich habe der letzten post noch etwas angefügt (siehe oben)

Vergiß auch nicht alle Variablen, die irgendwo vorkommen, oben im Code jetzt vorerst mit GLOBAL zu definieren. Später können wir das ja noch einmal überdenken.

Für das Beispiel der AlienSpawn() wäre das die Variable count_en:

Global count_en%

Du kannst übrigens hier im Forum den aktuellen Code immer mit EDIT in deinem allerersten Beitrag ersetzen. dann bekommen wir hier keinen Ärger für "häufiges Zitieren". Die zweite Codestelle nimmst Du dann bitte raus.

So, ich bin schon gespannt auf Deine neue Version.



Noch'n Tipp:

Ersetze mal das Graphics... durch

Graphics 800,600,32,2

sonst siehst Du ja den Debugger gar nicht. Ist der schon eingeschaltet?
  • Zuletzt bearbeitet von Midimaster am Mi, Dez 30, 2009 0:40, insgesamt 2-mal bearbeitet

Chrissa

BeitragMi, Dez 30, 2009 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
so oben ist jetzt der neue Quelltext drinn... Jedoch immer noch die Meldung Variable must be a type .... Markiert ist die Zeile: Code: [AUSKLAPPEN]
DrawImage e2_death,typ_1\x,typ_1\y,Frame1Count 



1. Die Types haben neue namen

2. die überflüssigen Zahlen sind weg

3. die Funktionen heißen jetzt so wie du gemeint hast

Gehe zu Seite 1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group