2D - Schusstutorial

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Dottakopf

Betreff: 2D - Schusstutorial

BeitragDi, Feb 20, 2007 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi !

Da des öffteren Fragen über Schussfuktionen im Beginners corner auftreten. Hab ich es mal gewagt ein Tutorial NUR über die Schussfunktion zu schreiben. Da weiter unten einige hässliche Zeilenumbrüche drinnen sind, saugt es euch einfach in euer bb(da ist alles normal).

Sollte des Tut totaler Schrott sein, entschuldige ich mich gleich und bin auch ned traurig drüber wenns getrasht wird Cool
Also viel Spaß und erfolg mit meinem 2D schuss- tut !!

Code: [AUSKLAPPEN]

;2D - Schusstutorial

;Kurze Übersicht:
;Zu erst definieren wir eingie Variablen. Danach erstellen wir einen Type in dem wir unseren Schuss speichern.
;In der Hauptschleife werden mittels Funktionen die Spielerbewegungen, Tastenabfragen und schließlich auch unser
;Schuss berechnet. Das ganze versuche euch anhand dieses Tutorial bestmöglich und auch gut verständlich zu
;erläutern.

;---------------------------------------------------------------------------------------------
;was ich Vorraussetzte

;das ihr wisst wie :
; - wie bilder geladen und angezeigt werden
; - wie "Functionen" funktionieren
; - das man zumindest inetwa verstanden hat wie "Types" funktionieren und wie man sie benützt
; - und etwas Zeit

;Was wird benötigt?

;2 Bitmaps (könnt ihr schnell in Paint zusammenbasteln)
; - ein kleines Raumschiff (alles was später nicht zu sehen sein soll hellrosa einfärben) größe ca. 82 x 40 Pixel
; - ein "laserschuss" (einfach bei menü/bild/attribute 5 auf 5 eingeben und alles gelb färben)

;Das Raumschiff  als "hero.bmp" bennen !
;Den Laserschuss als "shot.bmp" bennen !

;*****************************************************************************************************
;*****************************************************************************************************



;Ok wenn ihr das alles habt wenden wir uns den ersten Schritten unseres tutorials zu:
;grafikmodus (ich denkmal des kennt noch jeder ^^)
Graphics 800,600,16,2
SetBuffer BackBuffer()

timer=createtimer(60)

;laden wir nun die grafiken(global da wir sie in einer Funktion verwenden wollen)
Global Hero  = LoadImage("hero.bmp")
Global laser = LoadImage("shot.bmp")
 
  MaskImage hero,255,0,255  ; so wird des Rosa zeug im Hero bild "unsichtbar" gemacht

;Jezt kurz mal das Progi im gleichen ort wo auch die bilder sich befinden abspeichern. Da er sonst die bilder nicht findet.
;ok jetzt einige Variablen die wir brauchen (und diese als Global da wir sie später in einer funktion verwenden wollen)
Global hero_x = 350, hero_y = 500, shot_counter = 0     ; der "shot_counter" dient als timer / Spich die Feuerrate


;Gut. Nun kommt ein Type für den Schuss. In diesem müssen wir die X und Y Koordinate unterbringen. Also :

Type shot          ;erstellt den Type "shot"
 Field shot_x      ;x Koordinate
 Field shot_y      ;y Koordinate
End Type

;Ok jetzt haben wir alles festgelegt was wir für unser "game" brauchen. Ab in die Hauptschleife:

;---------------------------------------------------------------------------
Repeat
Cls             

;so und ich benutze Funktionen (die nach der Schleife bearbeitet werden / das ist viel viel übersichtlicher :)
 moveHero()
 createLaser()

waittimer(timer)
Flip 0
Until KeyHit(1)   ;ende bei ESC-druck
;----------------------------------------------------------------------------

;die funktion in der der Spieler / hero bewegt und gezeichnet wird

Function moveHero()
 
 ;mit Pfeiltasten rechts(203)  und links(205)  Bewegen
   If KeyDown(203) Then hero_x = hero_x - 3
   If KeyDown(205) Then hero_x = hero_x +3

 ;rauf und runter

  If KeyDown(200) Then hero_Y = hero_y -3
  If KeyDown(208) Then hero_y = hero_y +3


 ;so und noch den Spieler malen
 DrawImage hero, hero_x, hero_y

End Function

;------------------------------------------------------------------------------------

;Gut jetzt kommt das Herzstück des tutorials. In der folgenden funktion wird erst ein zähler erhöht und sollte dieser 5 erreichen, wird
;ein neuer Schuss erstellt, welcher sich dan nach oben bewegt. Abschließend wird der zähler wieder auf 0 gesetzt und es geht
;von vorne los. --> ein kreislauf

;wir leiten wieder eine Funktion ein

Function createlaser()

;bei Tastendruck (leer) erhöt sich der Zähler
   If KeyDown(57) Then
        shot_counter = shot_counter +1
   End If

 ;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
    If shot_counter = 5 Then
     
       info.shot = New shot           ;hier wird der schuss erstellt
         info\shot_x = hero_x  +40     ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +40 rüber gelegt
         info\shot_y = hero_y         ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
   
        shot_counter = 0              ; den Zähler auf 0 damit es wieder von vorne losgehen kann
     End If


; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

 For info.shot = Each shot                              ; so wird jeder einzelne Schuss angesprochen
     info\shot_y = info\shot_y -8                       ; die Schüsse werden um -8 nach oben bewegt
     DrawImage laser,info\shot_x,info\shot_y            ; jetzt noch jeden schuss malen
  Next

End Function
;----------------------------------------------------------------------------------------------
Rechtschreibfehler gelten der allgemeinen Belustigung!
  • Zuletzt bearbeitet von Dottakopf am Do, Dez 17, 2009 17:52, insgesamt 5-mal bearbeitet

[Ko5MoS]

BeitragMo, Nov 12, 2007 3:05
Antworten mit Zitat
Benutzer-Profile anzeigen
sollte man nicht die schüsse irgendwann nicht auch wieder löschen?? oder ist das egal?? nur mal so ne nooby frage nebenher... erbitte um antwort Smile

zb so:
Code: [AUSKLAPPEN]

for info.shot=each shot
...
if info\shot_y < 0 then delete info.shot
next
...
Ich tippe schneller als ich denken kann und wenn ich auf ENTER drücke ist alles wieder weg ...

mas93

BeitragMo, Nov 12, 2007 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, sollte man, auch wenn es bei diesem Beispiel sicher nichts ausmachen würde sie ni cht zu löschen.
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Dottakopf

BeitragMo, Nov 19, 2007 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo das löschen hätt ich vielleicht noch dazu schreiben müssen. Mein fehler.

das löschen muss in den "type abfragen" immer als letztes ausgeführt werden.
Code: [AUSKLAPPEN]


for info.shot = each shot

  anweisung 1
  anweisung 2

  if shot_y <0 then delete info.shot



Solle diese reihenfolge nicht eingehalten werden, wird bb diese fehlermeldung herausgeben : "Objekt does not exitst"

mfg Dottakopf
 

Kaddy

BeitragSo, Jun 21, 2009 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
manchmal ist es unvermeindlich das , dass löschen nicht am ende der for each schleife durchgeführt werden kann. Dann einfach ein exit nach den löschen setzen.

Nur so als kleiner tipp von meiner Seite^^

@tut

Nett gemacht, einfach zu verstehen aber man sollte doch schon ein verständniss haben wie tuts funzen.
Bei nen kleinen minigame von mir hing ich kurtzfrüstig an den problem wie ich die schüße erstellen sollte.
Aber nach keinen 10 minuten hatte ich ansatzweise die idee und nach 30 min war sie vollständig umgesetzt.

Ich will damit sagen das man auf solch eine function auch selber kommen könnte wenn man weiß wie man mit Types umgehen sollte.

Aber trotzdem nett Wink

MFG Kaddy
Bin Aktuell auf der Suche nach einen Programmierer Team, ob Hobby Team oder Firma ist egal. Einfach eine PM an mich schreiben.
Bezahlung verlange ich NATÜRLICH keine Wink

Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht SmileSmile

ozzi789

BeitragMo, Jun 22, 2009 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Anstatt mit exit kann man auch einach eine variable setzten falls etwas gelöscht wurde..
Pseudo code
Code: [AUSKLAPPEN]
del=0
if blubber=1
Delete s.schuss
del=1
endif

if del=0
if blubber=3 and s\x then blubber=4
endif


ist aber geschmackssache
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Kaddy

BeitragMo, Jun 22, 2009 10:10
Antworten mit Zitat
Benutzer-Profile anzeigen
interessante alternative Wink

darauf bin ich jetz nicht so schnell gekommen ^^
Bin Aktuell auf der Suche nach einen Programmierer Team, ob Hobby Team oder Firma ist egal. Einfach eine PM an mich schreiben.
Bezahlung verlange ich NATÜRLICH keine Wink

Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht SmileSmile
 

speer

BeitragSa, Dez 05, 2009 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
sorry wenn ich alte Beiträge aufwärme. Den Code von Dottakopf hab ich testweise mal versucht, funktioniert auch soweit. Beim ausführen des Codes ist mir ein Problem aufgefallen. Wenn die Leertaste gedrückt bleibt, geht der Schuss geradeaus und verschwindet nach oben. Bewegt man während der zeit aber das Hero Objekt, verstümmelt der Schuss.
Ist das nun ein Darstellungsproblem?

Tankbuster

BeitragSa, Dez 05, 2009 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Der Code ist komisch eingerückt
2. In der Funktion "createLaser()" wird der Laser auch geupdatet. Ich würde die Funktion umbenennen oder eine zweite Funktion namens "UpdateLaser()" verwenden.
3. Wäre schön wenn die Bilder schon mit dabei wären, oder eben im Programm mit Natives gearbeitet wird. Es nervt wirklich, extra 2 Bilder zu erstellen.
4. In jedes tut gehört ein Timer und Flip 0, damit es schon von Anfang an richtig gemacht wird.

So, das war erstmal meine Kritik Twisted Evil
Twitter
Download Jewel Snake!
Windows|Android

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group