Seite 1 von 4
"Schneefall"
Verfasst: 26.04.2008 11:28
von frogsoup
Hallo community,
also ich muss für die Schule ein Spiel erstellen:
Ich habe vor, ein Spiel zu erstellen, bei dem Burger von oben herabfallen und unten Homer Simpson mit den Cursor-Tasten zu bewegen ist um diese aufzufangen. Ich habe bereits oben ein McDonalds-Logo eingefügt und unten meinen Homer, dieser ist bereits beweglich und kann an den Rändern das Feld nicht verlassen.
Ich komme zu meiner Frage: Wie kann ich es einstellen, dass Burger an zufälligen Positionen aus dem Logo fallen, diese nach unten fallen und ich die aufsammeln kann?
Wäre natürlich schön, wenn ich auch ne Punkteanzeige oder etwas ähnliches hinbekommen würde, aber bin noch ein ziemlicher Anfänger, also bitte ich um Hilfe.
Vielen Dank im Vorraus.
mfg
frogsoup

Verfasst: 26.04.2008 11:45
von STARGÅTE
da du sicher mehrere Burger gleichzeitig fallen sehen willst, brauchst du Listen:
Code: Alles auswählen
Structure Burger
x.l
y.l
EndStructure
NewList Burger.Burger()
dann solltest du in bestimmten Intervallen einen Burger erzeugen (an deinem Logo :
Code: Alles auswählen
Pause + 1
If Pause > 100
Pause = 0
AddElement(Burger())
Burger()\x = LogoX
Burger()\y = LogoY
EndIf
nun noch die Bewegung und abfrage auf Homer:
Code: Alles auswählen
ForEach Burger()
Burger()\y + 1
If Abs(Burger()\x-HomerX) < HomerRadius+BurgerRadius And Abs(Burger()\y-HomerY) < HomerRadius+BurgerRadius
; Aktion beim Fressen
EndIf
If Burger()\y > WindowHeight ; Aus dem Bildschirm
DeletElement(Burger())
EndIf
Next
Du musst natürlich jetzt die Datei bei dir einbauen/ändern
EDIT:
@gnasen: haha ^^ ih war schneller, zwei dumme ein gedanke wa

Verfasst: 26.04.2008 11:45
von gnasen
Am besten arbeitest du mit LinkedLists. Diese sind ein mächtiges Werkzeug für solche Dinge.
Zuerst erstellst du eine Struktur, in der alle Daten jedes Burgers stehen. Dies wären zB.:
Code: Alles auswählen
Structure myBurger
X_coor.l
Y_coor.l
Punkte.l
EndStructure
Nun erstellst du eine Liste, in der alle Burger gespeichert werden. Diese ist dynamisch, das heisst du kannst jederzeit einen Burger hinzufügen, ändern oder entfernen:
Wichtig daran: Du übergibst der Liste die myBurger Struktur!
Jetzt wollen wir einen Burger hinzufügen:
Code: Alles auswählen
AddElement(Burger())
Burger()\X_coor = Random(800)
Burger()\Y_coor = 0
Burger()\Punkte = 10
Der erstellte Burger erscheint in dem Koordinatenbereich von 0 bis 800 auf der X-Achse und ganz oben am Bildschirm.
In deinem Schleifendurchlauf lässt du in jedem Durchgang alle Burger um einen nach unten fallen, wenn einer den Boden berührt löscht du diesen:
Code: Alles auswählen
ForEach Burger()
Burger()\Y_coor + 1
If Burger()\Y_coor > 600
DeleteElement(Burger())
EndIf
Next
Das Grundgerüst steht.
Nun musst du nur noch die Position deines Homers mit den Burgern abgleichen (ebenfalls in einer ForEach Schleife) und fügst die Punkte dem Konto zu (in Burger()\Punkte gespeichert).
So das sollte erstmal reichen
Edit: Hmm da war einer schneller....
Verfasst: 26.04.2008 12:03
von frogsoup
hey.. .das sieht gut aus... danke schonmal.
ich probiers gleich mal aus.
EDIT: also hab jetzt deine sachen eingefügt Stargate!
hab die Burger X/Y geändert und nen Global Burger.w gemacht sowie ein bild in meinen ordner gepackt. wie bekomm ich das jetzt hin, dass die dinger runter fallen und der die aufsammeln kann?
Verfasst: 26.04.2008 12:14
von STARGÅTE
kannst du mal dein Code posten, damit ich ihn erweitern kann, macht sich sonst blöd wenn ich dir nur schnipsel an den Kopf klatsche
Verfasst: 26.04.2008 12:15
von frogsoup
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"Beispiel 7_1")
Global SchlaegerX.w
Global SchlaegerY.w
Global BewegX.w
Global BewegY.w
Global Bild1X.w
Global Bild1Y.w
Global Bild2X.w
Global Bild2Y.w
Global Burger.w
Structure Burger
x.l
y.l
EndStructure
NewList Burger.Burger()
Pause + 1
If Pause > 100
Pause = 0
AddElement(Burger())
Burger()\x = testX
Burger()\y = testY
EndIf
ForEach Burger()
Burger()\y + 1
If Abs(Burger()\x-HomerX) < HomerRadius+BurgerRadius And Abs(Burger()\y-HomerY) < HomerRadius+BurgerRadius
; Aktion beim Fressen
EndIf
If Burger()\y > WindowHeight ; Aus dem Bildschirm
DeleteElement(Burger())
EndIf
Next
BewegX = - 1
BewegY = - 1
SchlaegerX = 639 - 500
SchlaegerY = 330
Bild1Y = 0
Bild1X = 0
Bild2X = 0
Bild2Y = 0
LoadSprite(1,"Maces2.bmp",1)
TransparentSpriteColor(1,RGB(255,0,0))
Repeat
DisplaySprite(1,testX,testY)
StartDrawing(ScreenOutput())
FrontColor(255+256*255+256*256*255)
StopDrawing()
FlipBuffers()
LoadSprite(0,"homer_sabber2.bmp",0)
TransparentSpriteColor(0,RGB(255,255,255))
Repeat
DisplaySprite(0,SchlaegerX,SchlaegerY)
StartDrawing(ScreenOutput())
FrontColor(255+256*255+256*256*255)
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Right)
If SchlaegerX < 640-120
SchlaegerX + 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)
If SchlaegerX > 0
SchlaegerX - 1
EndIf
EndIf
If SchlaegerY < 60
SchlaegerY = 20
ElseIf SchlaegerY > 460 - 30
SchlaegerY = 460 - 30
EndIf
If KeyboardPushed(#PB_Key_A)
testX + 1
EndIf
If KeyboardPushed(#PB_Key_S)
testX - 1
EndIf
If testY < 60
testY = 20
ElseIf testY > 460 - 30
testY = 460 - 30
EndIf
BallX + BewegX
BallY + BewegY
If BallX < 20
BewegX = 1
EndIf
If BallY < 20
BewegY = 1
EndIf
If BallY > 460
BewegY = -1
EndIf
If BallX > SchlaegerX And BallX < SchlaegerX + 10 And BallY > SchlaegerY And BallY < SchlaegerY + 30
BewegX = -1
EndIf
ExamineKeyboard()
Until KeyboardPushed(1)
Until KeyboardPushed(1)
das ist das, was ich bis jetz habe... bin mir nicht ganzsicher mit dem burger.... danke
Verfasst: 26.04.2008 12:22
von STARGÅTE
erst mal ist es schlecht eine Doppelschleife zu machen, in der die Bilder angezeigt werden.
Bitte teste mal diesen Code, ob er läuft:
Bitte den Bildnamen des Burgers verbessern!
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"Beispiel 7_1")
Global SchlaegerX.w
Global SchlaegerY.w
Global BewegX.w
Global BewegY.w
Global Bild1X.w
Global Bild1Y.w
Global Bild2X.w
Global Bild2Y.w
Global Burger.w
Structure Burger
x.l
y.l
EndStructure
Global NewList Burger.Burger()
BewegX = - 1
BewegY = - 1
SchlaegerX = 639 - 500
SchlaegerY = 330
Bild1Y = 0
Bild1X = 0
Bild2X = 0
Bild2Y = 0
LoadSprite(2,"Burger.bmp",1)
TransparentSpriteColor(2,RGB(255,0,0))
LoadSprite(1,"Maces2.bmp",1)
TransparentSpriteColor(1,RGB(255,0,0))
LoadSprite(0,"homer_sabber2.bmp",0)
TransparentSpriteColor(0,RGB(255,255,255))
Repeat
ClearScreen(0)
DisplaySprite(1,testX,testY)
DisplaySprite(0,SchlaegerX,SchlaegerY)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Right)
If SchlaegerX < 640-120
SchlaegerX + 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)
If SchlaegerX > 0
SchlaegerX - 1
EndIf
EndIf
If SchlaegerY < 60
SchlaegerY = 20
ElseIf SchlaegerY > 460 - 30
SchlaegerY = 460 - 30
EndIf
If KeyboardPushed(#PB_Key_A)
testX + 1
EndIf
If KeyboardPushed(#PB_Key_S)
testX - 1
EndIf
If testY < 60
testY = 20
ElseIf testY > 460 - 30
testY = 460 - 30
EndIf
Pause + 1
If Pause > 100
Pause = 0
AddElement(Burger())
Burger()\x = testX
Burger()\y = testY
EndIf
ForEach Burger()
Burger()\y + 1
If Abs(Burger()\x-SchlaegerX) < 60 And Abs(Burger()\y-SchlaegerY) < 60
DeleteElement(Burger())
EndIf
If Burger()\y > 480 ; Aus dem Bildschirm
DeleteElement(Burger())
EndIf
DisplayTransparentSprite(2,Burger()\x,Burger()\y)
Next
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(1)
Verfasst: 26.04.2008 12:25
von frogsoup
okay.. danke vielmals....
also burger fallen jetzt ganz links runter, aber alle links und direkt hintereinander.
wenn homer die aufsammelt crashed das prog. i-welche hilfen ??

Verfasst: 26.04.2008 12:34
von STARGÅTE
ja ^^^der Code:
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen(640,480,16,"Beispiel 7_1")
Global SchlaegerX.w
Global SchlaegerY.w
Global BewegX.w
Global BewegY.w
Global Bild1X.w
Global Bild1Y.w
Global Bild2X.w
Global Bild2Y.w
Global Burger.w
Structure Burger
x.l
y.l
EndStructure
Global NewList Burger.Burger()
BewegX = - 1
BewegY = - 1
SchlaegerX = 639 - 500
SchlaegerY = 330
Bild1Y = 0
Bild1X = 0
Bild2X = 0
Bild2Y = 0
LoadSprite(2,"Burger.bmp",1)
TransparentSpriteColor(2,RGB(255,0,0))
LoadSprite(1,"Maces2.bmp",1)
TransparentSpriteColor(1,RGB(255,0,0))
LoadSprite(0,"homer_sabber2.bmp",0)
TransparentSpriteColor(0,RGB(255,255,255))
Repeat
ClearScreen(0)
DisplaySprite(1,testX,testY)
DisplaySprite(0,SchlaegerX,SchlaegerY)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Right)
If SchlaegerX < 640-120
SchlaegerX + 1
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)
If SchlaegerX > 0
SchlaegerX - 1
EndIf
EndIf
If SchlaegerY < 60
SchlaegerY = 20
ElseIf SchlaegerY > 460 - 30
SchlaegerY = 460 - 30
EndIf
If KeyboardPushed(#PB_Key_A)
testX + 1
EndIf
If KeyboardPushed(#PB_Key_S)
testX - 1
EndIf
If testY < 60
testY = 20
ElseIf testY > 460 - 30
testY = 460 - 30
EndIf
Pause + 1
If Pause > 400
Pause = 0
AddElement(Burger())
Burger()\x = testX+Random(600)
Burger()\y = testY
EndIf
ForEach Burger()
Burger()\y + 1
If Abs(Burger()\x-SchlaegerX) < 60 And Abs(Burger()\y-SchlaegerY) < 60
DeleteElement(Burger())
Continue
EndIf
If Burger()\y > 480 ; Aus dem Bildschirm
DeleteElement(Burger())
EndIf
DisplayTransparentSprite(2,Burger()\x,Burger()\y)
Next
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(1)
Den Zeitabstand kannst du hier verändern: Pause > 400
machst du es größer fallen weniger pro Minute
die stelle der Burger stellst du da ein:
AddElement(Burger())
Burger()\x = testX+Random(600)
Burger()\y = testY
Verfasst: 26.04.2008 12:38
von frogsoup
okay, das scheint zu funktionieren.
hehe vielen dank dafür,
wäre nett, wenn du mir noch bei folgendem hilfst....
wie kann ich die geschwindigkeit von homer ändern?
wie mach ich nen punkte-zähler?
wie kann ich in den 32-Farben modus wechseln?
warum crashed der, wenn ein burger zur hälfte aus dem bild auf den boden kommt?
mfg
frogsoup