ImagesCollide und delete...Hilfe...SOS

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Tobchen

BeitragSo, Jan 03, 2010 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir dich auch, wir dich auch.
Tobchen - die Welt von Tobi!

Silver_Knee

BeitragSo, Jan 03, 2010 4:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster: In blitz darfst du je einen Type, Variable, Label und Funktion den selben Namen geben. Bltz kann das unterscheiden. Ob es sinnvoll ist ist was anderes.

Midimaster

BeitragSo, Jan 03, 2010 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@silver_knee

Oh, das war mir neu. Danke. Aber wir sind uns ja einig, dass das alles andere als hilfreich ist. Du schreibst in "Blitz".... Das probier ich gleich mal BlitzMax aus. Ich fände es schrecklich, wenn SUPERSTRICT dies erlauben würde.
 

MarieBube

BeitragSo, Jan 03, 2010 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab noch eine Frage. Und zwar hab ich jetzt noch so eine Startseite für das Spiel gebastelt. Da steht halt wie das Spiel funktioniert und dann "drücke Enter". Ich möchte halt, dass das Spiel anfängt, wenn man dann Enter gedrückt hat.
Wie verknüpfe ich denn diese beiden Fenster (oder wie man das nennt...)?
LG

Xeres

Moderator

BeitragSo, Jan 03, 2010 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Du packst alles in Funktionen... Meine übliche Struktur wäre etwa:
BlitzBasic: [AUSKLAPPEN]
Local timer = CreateTimer(60)

Const Game_State_MENU=0, Game_State_PLAY=1
Global Game_State=Game_State_MENU ;Das Spiel startet im Menu

Repeat

Select Game_State
Case Game_State_MENU
Run_Menu()
Case Game_State_PLAY
Run_Play()
End Select

Flip(0)
WaitTimer(timer)
Cls
Until KeyHit(1)
End


Function Run_Menu()

End Function

Function Run_Play()

End Function
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)
 

MarieBube

BeitragSo, Jan 03, 2010 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
eeeeeeeeehm.... jaaaa. danke.
*hust. ich hab keine ahnung, wie ich das einbaue.hust*

Xeres

Moderator

BeitragSo, Jan 03, 2010 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast eine Hauptschleife. Aus der Rufst du endweder die Funktion für das Spiel oder für das Menü auf. In den Funktionen steht einfach der Code für dein Spiel.
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)
 

MarieBube

BeitragSo, Jan 03, 2010 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
wo schreib ich den dahin, dass der zu "Game.bb" wechseln soll?

Midimaster

BeitragSo, Jan 03, 2010 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Repeat
Select Game_State
Case Game_State_MENU
Run_Menu()
Case Game_State_PLAY
Run_Play()
End Select
Until KeyHit(1)
End


Function Run_Menu()
; hier kommt das rein, was Du als Title schreiben willst
While Not KeyDown(28) ; = RETURN-Taste
Text "Herzlich willkommem....
Flip
Wend
Game_State=Game_State_Play
End Function

Function Run_Play()
; hier kommt die While-Schleife rein, die du bereits jetzt im Spiel hast
While Not KeyDown(1)
Color Rnd(256),Rnd(256),Rnd(256)
counter = counter + 1
If counter>60 Then
c.cookie = New cookie
....
Flip
....Wend
Game_State=Game_State_Menu

End Function


@Xeres
vielleicht besser erst mal so mit 2 WHILE/FLIP/WENDs, das ist leichter zu verstehen.
  • Zuletzt bearbeitet von Midimaster am So, Jan 03, 2010 14:21, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragSo, Jan 03, 2010 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst den Code mittels include einfügen - normalerweise stehen in den Zusätzlichen Code-Dateien nur Funktionen die man aufruft. Da du die Auflösung und Laden von Ressourcen vor der Hauptschleife erledigen solltest, würde ich das in eine Datei zusammenschreiben und den Inhalt deiner derzeitigen Spiel-Hauptschleife in eine Funktion verfrachten.

Edit:
Midimaster: Was ist der Sinn hinter den Funktionen, wenn man doch alles doppelt und dreifach ausführt? Das würde es für mich noch unverständlicher machen...
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)
 

MarieBube

BeitragSo, Jan 03, 2010 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
-.-
-.-
-.-
Also das ist die Startseite ("startseite.bb"). "game.bb" hätte ich gerne bei Drücken von Enter...

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


landschaft2=LoadImage("landschaft2.bmp")
ScaleImage landschaft2,1.2,1;

hungry=LoadImage("hungry.bmp")
ScaleImage hungry,1,1;
MaskImage hungry,255,255,255;

mammoth1=LoadImage("Mammoth1.bmp")
ScaleImage mammoth1,1,1;
MaskImage mammoth1,255,255,255;


While Not KeyDown (1)
Cls;

DrawImage landschaft2,x,y;
DrawImage hungry,120,5;
DrawImage mammoth1,400,250;


If Blink Then Text 20,200 , "Bewege Mammuth mit der linken und der rechten Pfeiltaste und fang die Cookies auf."
   font = LoadFont("Comic Sans MS",25,15)
   SetFont Font
   Color 237,126,218
   If Blinktimer < MilliSecs () Then
        Blink = 1 - Blink
        Blinktimer = MilliSecs () + 600
End If

 

Flip

Wend

Chester

BeitragSo, Jan 03, 2010 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Pack doch einfach den Inhalt deiner jeweiligen Mainloops in unterschiedliche Funktionen.

Dann machst du eine Bedingung:

Code: [AUSKLAPPEN]
IF Game_State = 0 THen
Menue()
else
Game()
Endif


Dann musst du in dem Menü wenn du Enter drückst, die Variable Game_State auf 1 setzten, dann wird nicht mehr das Menue() aufgerufen, sondern Game()

Midimaster

BeitragSo, Jan 03, 2010 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres

Hast Du gerade den Eindruck MarieBube würde deine Hilfe verstanden haben? Schließlich fragt er zum 3.Mal nach!
Deine Lösung ist elegant und richtig. Aber nix für MarieBube....

Für ihn sind es ja sogar zwei BB-Programme: eines das den Titel zeigt und eines das das Spiel macht. Und es überfordert ihn gerade sich vorzustellen, dass beides mit einer WHILE/FLIP/WEND hinzukriegen wäre.

Er hat ja bereits das Modell mit zwei WHILE/FLIP/WEND fertig. Darüber stellen wir ihm jetzt eine Entscheidungsebene.

Code: [AUSKLAPPEN]
While
   If
      Entweder Titel
   oder
      Spiel
   Endif
Wend

Funktion Titel
   While
   ...
   Flip
   Wend
End Function

Funktion Spiel
   While
   ...
   Flip
   Wend
End Function




 

MarieBube

BeitragSo, Jan 03, 2010 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, ICH BIN EIN HOFFNUNGSLOSER ANFÄNGER, ich kann das nicht "einfach" mal machen... Ich mache das nicht schon seit Jahren, so wie einige von euch, sondern seit ein paar Wochen.
Ich brauch das halt dür die Schule, sonst würde ich euch nicht mit meinen Problemen belästigen. Crying or Very sad Sad

Also da oben ist ja meine Startseite. Kann das nicht jemand "einfach mal" dareinschreiben? Embarassed Embarassed

Ah, danke Midimaster Smile Ich bin übrigens ein Mädchen Razz Very Happy

Midimaster

BeitragSo, Jan 03, 2010 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wink dann helfen WIR jetzt gleich doppelt so gern....

Chester

BeitragSo, Jan 03, 2010 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast doch bei beiden Dateien immer eine Mainloop:


BlitzBasic: [AUSKLAPPEN]
While Not KeyDown (1)
Cls
;[ Game ]
Flip
Wend


Dann nimmst du bei beiden Dateien jeweils das, was dazwischen ist( hier jetzt Game ) , und schreibst diese in Funktionen:

BlitzBasic: [AUSKLAPPEN]
Function Game()
;[ Game ]
End Function

Function Menue()
;[ Menue ]
End Function


Danach schreibst du alles was bei beiden BB Dateien geladen wird in einer Datei komplett oben drüber, sodass das, was du für das Menü brauchst, gleichzeitig mit dem, was du fürs Spiel brauchst, geladen wird (nur so nebenbei: LoadFont besser auch obendrüber).

Dann musst du die Funktionen in die Mainloop einbauen:

BlitzBasic: [AUSKLAPPEN]
While Not KeyDown (1)
Cls

If Game_State = 0 Then
Menue()
Else
Game()
EndIf

Flip
Wend


Da ja aber bei dem was du dann bis zu dieser Stelle gemacht hast, Game_State immer nur 0 ist, also nur das Menü aufgerufen wird, musst du noch in die Menue() eine Abfrage reinmachen, in der du Game_State auf 1 setzt:

BlitzBasic: [AUSKLAPPEN]

Function Menue()

DrawImage landschaft2,x,y;
DrawImage hungry,120,5;
DrawImage mammoth1,400,250;


If Blink Then Text 20,200 , "Bewege Mammuth mit der linken und der rechten Pfeiltaste und fang die Cookies auf."
font = LoadFont("Comic Sans MS",25,15) ; Das hier besser hier raus und ganz obendrüber.
SetFont Font
Color 237,126,218
If Blinktimer < MilliSecs () Then
Blink = 1 - Blink
Blinktimer = MilliSecs () + 600
End If

If KeyHit(28) Then Game_State = 1

End Function


Übrigens, wenn du da noch nicht ganz so fit bist, schau dir mal Midimaster's Tutorial an(@Midimaster, sei mir nicht böse für die Werbung Very Happy )
 

MarieBube

BeitragSo, Jan 03, 2010 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Schritt verstehe ich nicht Embarassed
Den Rest hab ich gemacht. Mehr oder weniger richtig. Aber da erscheint dann "'Function' can only appear in main program"

Zitat:

Danach schreibst du alles was bei beiden BB Dateien geladen wird in einer Datei komplett oben drüber, sodass das, was du für das Menü brauchst, gleichzeitig mit dem, was du fürs Spiel brauchst, geladen wird

Dann musst du die Funktionen in die Mainloop einbauen:

BlitzBasic: [AUSKLAPPEN]
While Not KeyDown (1)
Cls

If Game_State = 0 Then
Menue()
Else
Game()
EndIf

Flip
Wend


Thorsten

BeitragSo, Jan 03, 2010 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
MarieBube hat Folgendes geschrieben:
Aber da erscheint dann "'Function' can only appear in main program"

Dann solltet du bis hierhin erstmal deinen QuellCode posten.
 

MarieBube

BeitragSo, Jan 03, 2010 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Also gut Freunde. Hier sind meine Codes:

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


landschaft2=LoadImage("landschaft2.bmp")
ScaleImage landschaft2,1.2,1;

hungry=LoadImage("hungry.bmp")
ScaleImage hungry,1,1;
MaskImage hungry,255,255,255;

mammoth1=LoadImage("Mammoth1.bmp")
ScaleImage mammoth1,1,1;
MaskImage mammoth1,255,255,255;


While Not KeyDown (1)
Cls;

;Funktion
Function Menue()

DrawImage landschaft2,x,y;
DrawImage hungry,120,5;
DrawImage mammoth1,400,250;


If Blink Then Text 20,200 , "Bewege Mammuth mit der linken und der rechten Pfeiltaste und fang die Cookies auf."
   font = LoadFont("Comic Sans MS",25,15)
   SetFont Font
   Color 237,126,218
   If Blinktimer < MilliSecs () Then
        Blink = 1 - Blink
        Blinktimer = MilliSecs () + 600
End If

;funktion

If KeyHit(28) Then Game_State = 1

End Function

Flip

Wend


Dann das Spiel:
Code: [AUSKLAPPEN]
AppTitle "Mammuth hat Hunger!"

PlayMusic("ice.wav")

SeedRnd MilliSecs()

Const width=10,height=10,depth=1
Global points=0,mx=100,my=550

Graphics 1024,768
SetBuffer BackBuffer()

landschaft=LoadImage("Landschaft.bmp")

i=MilliSecs()
zeit=i-m

;bilder hochladen
mammoth=LoadImage("Mammoth3.bmp")
ScaleImage mammoth,0.75,0.75
MaskImage mammoth,255,255,255

cookie=LoadImage("cookie2.bmp")
ScaleImage cookie,0.04,0.04
MaskImage cookie,255,255,255

;type erstellen
Type cookie
   Field x
   Field y
   Field gfx
   Field punkte
   Field speed
End Type

;counter
counter = 1
fontno=LoadFont("verdana",50)
SetFont fontno


While Not KeyDown(1)
   Color Rnd(256),Rnd(256),Rnd(256)

     counter = counter + 1

   If counter>45 Then
      c.cookie = New cookie
      c\x = Rnd(1,950)
      c\y = 0
      c\gfx = cookie
      c\speed = Rnd(1.5,6)
      c\punkte = z
      counter = 0
   EndIf

      ;steuerung
   If KeyDown(205)
      mx=mx+10
   EndIf
   If KeyDown(203)
      mx=mx-10
   EndIf
 
  Cls

;funktion
Function Game()
   DrawImage landschaft,x,y
   DrawImage Mammoth,mx,my

  If mx>820 Then
      mx=820
   EndIf
   
   If mx<0 Then
      mx=0
   EndIf
   
   For c.cookie=Each cookie
      DrawImage c\gfx,c\x,c\y
      c\y = c\y + c\speed
      If ImagesCollide(Mammoth,mx,my,0,c\gfx,c\x,c\y,0) Then
         Delete c.Cookie
         points = points+10
      EndIf
   Next
   
   ;anzeige
   Text 10,0,"Zeit: "
   Text 10,40,"Leben: "
   Text 10,80,"Punkte: "+points
   
   ;counter
   ;Text 960,720,counter

;funktion
End Function

Flip
Wend
End

Chester

BeitragSo, Jan 03, 2010 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nach meiner Anleitung müsste eigentlich das hier auskommen:

BlitzBasic: [AUSKLAPPEN]
AppTitle "Mammuth hat Hunger!"

PlayMusic("ice.wav")

SeedRnd MilliSecs()

Const width=10,height=10,depth=1
Global points=0,mx=100,my=550

Graphics 1024,768
SetBuffer BackBuffer()

landschaft=LoadImage("Landschaft.bmp")

i=MilliSecs()
zeit=i-m

;bilder hochladen
mammoth=LoadImage("Mammoth3.bmp")
ScaleImage mammoth,0.75,0.75
MaskImage mammoth,255,255,255

cookie=LoadImage("cookie2.bmp")
ScaleImage cookie,0.04,0.04
MaskImage cookie,255,255,255


;type erstellen
Type cookie
Field x
Field y
Field gfx
Field punkte
Field speed
End Type

;counter
counter = 1
fontno=LoadFont("verdana",50)
SetFont fontno


landschaft2=LoadImage("landschaft2.bmp")
ScaleImage landschaft2,1.2,1;

hungry=LoadImage("hungry.bmp")
ScaleImage hungry,1,1;
MaskImage hungry,255,255,255;

mammoth1=LoadImage("Mammoth1.bmp")
ScaleImage mammoth1,1,1;
MaskImage mammoth1,255,255,255;

Global Game_State
While Not KeyDown(1)
Cls
If Game_State = 0 Then
Menue()
Else
Game()
EndIf
Flip
Wend
End


Function Menue()

DrawImage landschaft2,x,y;
DrawImage hungry,120,5;
DrawImage mammoth1,400,250;


If Blink Then Text 20,200 , "Bewege Mammuth mit der linken und der rechten Pfeiltaste und fang die Cookies auf."
font = LoadFont("Comic Sans MS",25,15)
SetFont Font
Color 237,126,218
If Blinktimer < MilliSecs () Then
Blink = 1 - Blink
Blinktimer = MilliSecs () + 600
End If

;funktion

If KeyHit(28) Then Game_State = 1

End Function



Function Game()
Color Rnd(256),Rnd(256),Rnd(256)

counter = counter + 1

If counter>45 Then
c.cookie = New cookie
c\x = Rnd(1,950)
c\y = 0
c\gfx = cookie
c\speed = Rnd(1.5,6)
c\punkte = z
counter = 0
EndIf

;steuerung
If KeyDown(205)
mx=mx+10
EndIf
If KeyDown(203)
mx=mx-10
EndIf



;funktion

DrawImage landschaft,x,y
DrawImage Mammoth,mx,my

If mx>820 Then
mx=820
EndIf

If mx<0 Then
mx=0
EndIf

For c.cookie=Each cookie
DrawImage c\gfx,c\x,c\y
c\y = c\y + c\speed
If ImagesCollide(Mammoth,mx,my,0,c\gfx,c\x,c\y,0) Then
Delete c.Cookie
points = points+10
EndIf
Next

;anzeige
Text 10,0,"Zeit: "
Text 10,40,"Leben: "
Text 10,80,"Punkte: "+points

;counter
;Text 960,720,counter

;funktion
End Function


Aber wie ich schon schrieb, schau dir am besten mal Midimaster's Tutorials an, die wären für dich genau das richtige Wink

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group