AddBullet ?

Anfängerfragen zum Programmieren mit PureBasic.
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

AddBullet ?

Beitrag von Svking »

Hallo,
Ich habe ein Spiel gemacht und bin nun dabei ein Raumschiff zum schießen zu bringen.

Ich habe in dem PureBasic Beispiel Weaponz II diese Funktuin "AddBullet()" gefunden und habe meinen code so umgestaltet

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
InitMovie()
OpenScreen(800,600,32,"eating Sv") 


LoadSprite(1,"data\pics\player.bmp") 
LoadSprite(2,"data\pics\battery.bmp") 
LoadSprite(3,"data\pics\bonus.bmp") 
LoadSprite(4,"data\pics\background.bmp") 
LoadSprite(6,"data\pics\schuss.bmp")
LoadSprite(7,"data\pics\schuss.bmp")
LoadSprite(10,"data\pics\start.bmp")
LoadMovie(1,"data\1.wav")
LoadMovie(2,"data\2.wav")
LoadMovie(3,"data\exp.wav")
LoadMovie(4,"data\schuss.wav")
LoadMovie(5,"data\timetofly.wav")
player_x = 363 
player_y = 559

schuss_x = 1000
schuss_y = 1000

schuss2_x = 1000
schuss2_y = 1000
ice_x = 0 
ice_y = 0 
bonus_x = 60
bonus_y = 40

back_y = 0

Structure Bullet
  x.w
  y.w
  Width.w
  Height.w
  Image.w
  SpeedX.w
  SpeedY.w
EndStructure

NewList Bullet.Bullet()

Procedure AddBullet(Sprite, x, y, SpeedX, SpeedY)
  AddElement(Bullet())           
  Bullet()\x      = x
  Bullet()\y      = y
  Bullet()\Width  = SpriteWidth(Sprite)
  Bullet()\Height = SpriteHeight(Sprite)
  Bullet()\Image  = Sprite
  Bullet()\SpeedX = SpeedX
  Bullet()\SpeedY = SpeedY
EndProcedure

explosion_x = 1000
explosion_y = 1000
wetter = 4
punkte = 0
speed = 3 
zeit = 30000
playerspeed = 3
start = 0
 PlayMovie(5,0)
    Repeat 
   
DisplaySprite(10,0,0)

    
ExamineKeyboard()
;GAME START
If KeyboardPushed(#PB_Key_S)
StopMovie()

start = 1
EndIf

    If start = 1
    zeit - 1
    back_y + 1
     ice_y + speed 
     If back_y > 0
back_y = -600
EndIf
bonus_y + speed
If ice_y > 600 
   ice_y = 0 
   ice_x = Random(770-20) 
EndIf 

If bonus_y > 600  
bonus_y = -5000
bonus_x = Random(770-20)
EndIf 

If schuss_y > 0
schuss_y - 6
schuss2_y -6
Else 
schuss2_y = -1000
schuss_y = -1000
EndIf

If schuss3_y > 0
schuss3_y - 6
schuss4_y -6
Else 
schuss4_y = -1000
schuss3_y = -1000
EndIf



    ExamineKeyboard() 
    ClearScreen(0,0,0) 
   
If KeyboardPushed(#PB_Key_Space)
AddBullet(6,player_x,player_y,0,1)
EndIf
If KeyboardReleased(#PB_Key_Space)
PlayMovie(4,0)
EndIf
StartDrawing(ScreenOutput())  
  Locate(150-TextLength("Punkte: "+Str(punkte)), 10) 
  DrawText("Punkte: "+Str(punkte)) 
StopDrawing()
    
    StartDrawing(ScreenOutput()) 
  Locate(750-TextLength("Zeit: "+Str(zeit)), 10) 
  DrawText("Zeit: "+Str(zeit)) 
StopDrawing()


    
   If zeit = 0
   CloseScreen() 
MessageRequester("game by Sven Schober","Punkte: "+Str(punkte)) 
   EndIf
    
     If Punkte > 600
     If punkte < 1000
    speed = 4
    EndIf
    EndIf
    
    
    If Punkte > 1000
    If punkte < 2000
    speed = 6
    EndIf
    EndIf
    
    If Punkte > 2000
    speed = 8
    EndIf
    
 If SpriteCollision(1,player_x,559,2,ice_x,ice_y) = 1   
punkte + 10
PlayMovie(1,0)
ice_y = 0 
ice_x = Random(640-20) 
EndIf

If SpriteCollision(1,player_x,559,3,bonus_x,bonus_y) = 1   
playerspeed + 1 
PlayMovie(2,0)
bonus_y = -5000
bonus_x = Random(640-20) 
EndIf

If SpriteCollision(6,schuss_x,schuss_y,2,ice_x,ice_y) = 1   
punkte + 50
PlayMovie(3,0)
ice_y = 0 
ice_x = Random(640-20) 
EndIf

If SpriteCollision(6,schuss_x,schuss_y,3,bonus_x,bonus_y) = 1   
playerspeed + 1
PlayMovie(3,0)
bonus_y = -5000
bonus_x = Random(640-20) 
EndIf

If SpriteCollision(7,schuss2_x,schuss2_y,2,ice_x,ice_y) = 1   
punkte + 50
PlayMovie(3,0)
ice_y = 0 
ice_x = Random(640-20) 

EndIf

If SpriteCollision(7,schuss2_x,schuss2_y,3,bonus_x,bonus_y) = 1   
playerspeed + 1 
PlayMovie(3,0)
bonus_y = -5000
bonus_x = Random(640-20) 
EndIf


If KeyboardPushed(#PB_Key_Left) 
player_x - playerspeed 
 If player_x < 0 
player_x = 0
  EndIf 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Right) 
player_x + playerspeed
 If player_x > 700 
 player_x = 700
  EndIf 
  EndIf 

DisplayTransparentSprite(wetter,0,back_y)
DisplayTransparentSprite(1,player_x,559) 
DisplayTransparentSprite(2,ice_x,ice_y) 
DisplayTransparentSprite(3,bonus_x,bonus_y) 
DisplayTransparentSprite(6,schuss_x,schuss_y) 
DisplayTransparentSprite(7,schuss2_x,schuss2_y) 
EndIf

    FlipBuffers() 

Until KeyboardPushed(#PB_Key_Escape) 
CloseScreen() 
MessageRequester("game by Sven Schober","Punkte: "+Str(punkte)) 
Nur leider zeigt er mir jetzt keinen Schuss an, kann mir jemand helfen?

Gruß Sven
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
Ja!
Beiträge: 271
Registriert: 02.01.2006 16:13
Wohnort: Stuttgart

Re: AddBullet ?

Beitrag von Ja! »

Hi,

so spontan ist mir mal folgende Passage aufgefallen..
Svking hat geschrieben:

Code: Alles auswählen


If schuss_y > 0
schuss_y - 6
schuss2_y -6
Else 
schuss2_y = -1000
schuss_y = -1000
EndIf

If schuss3_y > 0
schuss3_y - 6
schuss4_y -6
Else 
schuss4_y = -1000
schuss3_y = -1000
EndIf



Du fragst ab, ob schussY grösser ist als 0 und
setzt ihn dann um -6 zurück. Und ansonsten wird er auf -1000 gesetzt.

D.h. sobald Dein Schuss den Bildschirm "betritt", wird er sofort wieder um
-6 nach "draussen" gebracht.

So ist er natürlich nie zu sehen.



Gruß
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Hi!
Wenn ich das richtig verstehe, legst du den Typ Bullet an,

Code: Alles auswählen

Procedure AddBullet(Sprite, x, y, SpeedX, SpeedY)
  AddElement(Bullet())           
  Bullet()\x      = x
  Bullet()\y      = y
  Bullet()\Width  = SpriteWidth(Sprite)
  Bullet()\Height = SpriteHeight(Sprite)
  Bullet()\Image  = Sprite
  Bullet()\SpeedX = SpeedX
  Bullet()\SpeedY = SpeedY
EndProcedure 

um dann mit einer "normalen Variable"

Code: Alles auswählen

If schuss_y > 0
schuss_y - 6
schuss2_y -6
Else
schuss2_y = -1000
schuss_y = -1000
EndIf

If schuss3_y > 0
schuss3_y - 6
schuss4_y -6
Else
schuss4_y = -1000
schuss3_y = -1000
EndIf 
einen Schuss zu lenken- wozu dann die Struktur? Oder willst du immer nur eine explizite Anzahl von Schüssen aufm Bildschrim zulassen? Dann wäre die Struktur aber immernoch sinnlos (oder vermische ich da ausversehens 2 verschiedene Sache?)

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag von Svking »

nein ich möchte, dass es möglich ist unendlich schüsse drauf zu haben
die zeilen mit dem AdBullet hab ich aus dem beispiel kopiert.
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Naja, aber überleg mal, die Variable schuss_y z.b. ist doch gar nicht belegt. Add Bullet tut folgendes: Es fügt eine "Kugel" der Liste mit den Kugeln hinzu. Du musst nun alle Kugeln einzeln prüfen, das tust du, indem du diese Liste mit

Code: Alles auswählen

Foreach bullet()
;Hier prüfst du jede Kugel einzeln
Next
durchgehst.
Mit schuss_y meinst du wohl bullet()\y <-- ktueeles Element der liste Bullet, davon der wert "y".
So ich hoffe, du kommst auf den rest selbst :wink:
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
Ja!
Beiträge: 271
Registriert: 02.01.2006 16:13
Wohnort: Stuttgart

Beitrag von Ja! »

Huch wie peinlich, auf die Prozedur habe ich gar nicht geachtet.

Also, Du legst, wie die beiden Anderen schon beschrieben haben,
die x u. y Koordinate mit schuss()\y bzw. schuss()\x fest.
Genau dafür ist ja die ganze Prozedur ja überhaupt da.

Trotzdem gilt zusätzlich das, was ich bereits oben beschrieben habe.



So in etwa müsste es aussehen:

Code: Alles auswählen


AddBullet(6, 10,300,1,0)
AddBullet(7, 10,200,2,1)



ForEach Bullet()
 Bullet()\x + Bullet()\SpeedX
 Bullet()\y + Bullet()\SpeedY

 If Bullet()\x > 800 OR Bullet()\y > 600 OR Bullet()\x < 0 OR Bullet()y < 0
   DeleteElement(Bullet())
 else
  DisplayTransparentSprite(Bullet()\Sprite, Bullet()\x, Bullet()\y) 
 endif

Next


Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@svking

mein rat wäre:

vergiss erstmal dein bisheriges programm.

schau dir Waponez2 an, und verstehe, was dort wirklich getan wird.

modifiziere waponez2 so, dass ein minigame bei rauskommt, was dir mehr zusagt.

aus einem fremden programm eine AddBullet-procedure zu kopieren, und zu hoffen, dass sie in deinem programm funktioniert, ist ungefähr so, wie einen wasserhahn aus der wand zu reissen, ihn in eine lehmhütte in afrika zu bringen, in die wand zu stecken, und zu erwarten, dass wasser raus kommt wenn du ihn aufdrehst....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Ja!
Beiträge: 271
Registriert: 02.01.2006 16:13
Wohnort: Stuttgart

Beitrag von Ja! »

Kaeru Gaman hat geschrieben: aus einem fremden programm eine AddBullet-procedure zu kopieren, und zu hoffen, dass sie in deinem programm funktioniert, ist ungefähr so, wie einen wasserhahn aus der wand zu reissen, ihn in eine lehmhütte in afrika zu bringen, in die wand zu stecken, und zu erwarten, dass wasser raus kommt wenn du ihn aufdrehst....

Genau so habe ich aber auch mit PB angefangen und es hat wunderbar
funktioniert. ;)
Svking
Beiträge: 48
Registriert: 23.09.2005 15:19
Kontaktdaten:

Beitrag von Svking »

Hmm ok ich guck mir dass ganze nochmal genauer an.
Das Problem ist, ich verlier bei sowas immer recht schnell ned Überblick
aber ma schaun wie das wird x)
Das Ende meines Lebens:
If leben = 0
End
Endif
Benutzeravatar
Ja!
Beiträge: 271
Registriert: 02.01.2006 16:13
Wohnort: Stuttgart

Beitrag von Ja! »

@Svking


Ja, das mit dem Überblick ist anfangs so ein Problem.
Das gibt sich mit der Zeit, glaub mir.

Du hast jetzt schon einen recht saubern Schreibstil in Deinen
Programmen. Du könntest damit anfangen, Deine Prozeduren, Strukturen und die ganze Initialistation in eine andere Datei auszulagern.
Die fügst Du dann im Hauptprogramm mit IncludeFile "" ganz am
Anfang ein.
Wenn Du das alles ordentlich machst, kommt der Überblick
mit der Zeit automatisch. :)

Ach ja, ich weiß nicht, ob Dir das schon jemand empfohlen hat, aber Du könntest natürlich auch ein oder 2 Tutorials im Spieleprogrammieren machen. Das hat mir selbst damals sehr geholfen.
Auf der robsite.de z.B. gibts ein paar ganz gute. (Ist auch eins von mir dabei, über 2D Ballerspiele ;) ) .
PureArea.net ist in jedem Falle auch einen Besuch wert.



Gruß
Antworten