2D - Schusstutorial
Übersicht

![]() |
DottakopfBetreff: 2D - Schusstutorial |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht ![]() ![]() |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
interessante alternative ![]() 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 ![]() Es gibt 10 arten von Menschen, die einen verstehen das Binärsystem , die anderen nicht ![]() ![]() |
speer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group