[2D] Schüsse erstellen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ToeB

Betreff: [2D] Schüsse erstellen

BeitragMo, Feb 19, 2007 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
So, da viele immer wieder fragen, wie in 2D Schüsse erstellt werden, hab ich mir überlegt, ein Tutorial darüber zu schreiben.

Also ich ziehe es immer vor, 2D shüsse mit "Types" zu machen, mann kann das auch anders ( glaub ich Confused !?), wäre dann aber komplizierter. Also hier ist ein Grundwissen über Types wichtig.

1.: Arrow Type Ertellen :

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Type schuss
Field x_Pos
Field y_Pos
Field winkel#
End Type

Global s.schuss

Global x = GraphicsWidth()/2
Global y = GraphicsHeight()/2



So das hätten wir...

2.: Arrow Jetzt kommt noch die schleife ,der Spieler, nehmen wir ein Oval und die Tasten abfrage für den Spieler :


Code: [AUSKLAPPEN]

Repeat
mx = MouseX()
my = MouseY()
If KeyDown(200) Then y = y - 5
If KeyDown(208) Then y = y + 5
If KeyDown(203) Then x = x - 5
If KeyDown(205) Then x = x + 5
Color 255,255,255
Oval x-10,y-10,20,20,0
Flip
Cls
Until KeyHit(1)
End


so, nun der ganze code bisher :

Code: [AUSKLAPPEN]

Graphics 800,600,16,2
SetBuffer BackBuffer()

Type schuss
Field x_Pos
Field y_Pos
Field winkel#
End Type

Global s.schuss

Global x = GraphicsWidth()/2
Global y = GraphicsHeight()/2

Repeat
mx = MouseX()
my = MouseY()
If KeyDown(200) Then y = y - 5
If KeyDown(208) Then y = y + 5
If KeyDown(203) Then x = x - 5
If KeyDown(205) Then x = x + 5
Color 255,255,255
Oval x-10,y-10,20,20,0
Flip
Cls
Until KeyHit(1)
End



3.: Arrow Nun soll man ja sehen, wohin man schiest, also machen wir mal ein "Gewehr" in die schleife:
Code: [AUSKLAPPEN]
w# = ATan2(mx-x,my-y)
Line x,y,x+Sin(w#)*50,y+Cos(w#)*50


4.: Arrow und jetzt die Maus-Tasten-abfrage zum schießen :

Code: [AUSKLAPPEN]

If MouseHit(1) Then
s = New schuss
s\x_Pos = x
s\y_Pos = y
s\winkel# = w#
EndIf


5.: Arrow Jetzt muss nur noch der schuss zu sehen sein,machen wir das in einer For...=Each... .....Next schleife :
Code: [AUSKLAPPEN]

For s = Each schuss
Color 255,0,0
Line s\x_Pos,s\y_Pos,s\x_Pos+Sin(s\winkel#)*10,s\y_Pos+Cos(s\winkel#)*10
s\x_Pos = s\x_Pos + Sin(s\winkel#) * 20
s\y_Pos = s\y_Pos + Cos(s\winkel#) * 20
Color 255,255,255
Next



So ! Jetzt ist es fertig !

Noch mal der Zusammengefasste Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Type schuss
Field x_Pos
Field y_Pos
Field winkel#
End Type

Global s.schuss

Global x = GraphicsWidth()/2
Global y = GraphicsHeight()/2

Repeat
mx = MouseX()
my = MouseY()
If KeyDown(200) Then y = y - 5
If KeyDown(208) Then y = y + 5
If KeyDown(203) Then x = x - 5
If KeyDown(205) Then x = x + 5
Color 255,255,255
Oval x-10,y-10,20,20,0
w# = ATan2(mx-x,my-y)
Line x,y,x+Sin(w#)*50,y+Cos(w#)*50
If MouseHit(1) Then
s = New schuss
s\x_Pos = x
s\y_Pos = y
s\winkel# = w#
EndIf
For s = Each schuss
Color 255,0,0
Line s\x_Pos,s\y_Pos,s\x_Pos+Sin(s\winkel#)*10,s\y_Pos+Cos(s\winkel#)*10
s\x_Pos = s\x_Pos + Sin(s\winkel#) * 20
s\y_Pos = s\y_Pos + Cos(s\winkel#) * 20
Color 255,255,255
Next
Flip
Cls
Until KeyHit(1)
End



Bei frage könnt ihr mich gern ansprechen Very Happy !
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

BladeRunner

Moderator

BeitragMo, Feb 19, 2007 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein wirkliches Tutorial, denn Du klatschst Code hin ohne ihn zu erklären.
Zudem definierst Du in deinem Code Globalen obwohl es nicht nötig wäre, hast keinerlei Kollisionserkennung drin noch sonst eine wirkliche Funktionalität.
Daher werde ich den Thread nach Beginners Corner verschieben.

Nix für ungut, aber ein gewisser Qualitätsstandard sollte in FAQs und im Codearchiv gelten.

Überarbeite das deutlich und man kann über ein einstellen reden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Dottakopf

BeitragMo, Feb 19, 2007 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Ich hab das hier mal so verfolgt. Und als ich das so durchgelsen hab, musste ich mich zurückerinnern wie es bei mir war, als ich die schussfunktion meistern/erlernen wollte. Da hatte ich auch so ein tut wo n paar Anmerkungen mehr nicht schlecht gewesen wären... (auserdem war da noch so anderer schnik schnak mit drinne). Um auf den Punkt zu kommen ich hatte auf einmal dringenst das bedürfniss meiner kreativität fr in Form eines Tutorials freien lauf zu lassen. Surprised

Nachdem ich aber nicht unnötig die FAQs und das Codearchiv zu Trashen wollte, dachte ich mir ich füg des erstmal hier rein, um eure Meinung darüber zu hören. (Für die Zeilenumbrüche kann ich nix. In bb schauts normal aus)

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

; - 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
SetBuffer BackBuffer()

;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()

Flip
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  +5     ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 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
;----------------------------------------------------------------------------------------------



Ich hoffe, dass es brauchbar ist. Wenn nicht auch kein Problem Cool

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group