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 :cry:

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 :D

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:

Code: Alles auswählen

Define NewList Burger.myBurger()
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