Problem mit Schussfunktion, sogar selbst was überlegt!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

AFRO

Betreff: Problem mit Schussfunktion, sogar selbst was überlegt!

BeitragDi, Aug 08, 2006 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich weiß zu dem Thema gibt es ganz schön viele Threads, aber trotz den vielen die ich durchgelesen habe, komme ich nicht mehr weiter Embarassed

Also, ich hab jetzt eine Schussfunction wie sie eigentlich functionieren müsste geproggt, aber jetzt malt es meinen Schuss nur so lange, wie ich die Leertaste gedrückt halte! Sieht so aus:

Code:

;Graphics...

Global player = LoadImage ("player.bmp")
Global kugel = LoadImage ("Kugel.bmp")

Global player_x = 100
Global player_y = 100

;....

Repeat
Cls

Draw_Player
Draw_Kugel

Flip
Until
KeyHit (1)
End

Function Draw_Player ()
DrawImage Player, player_x, player_y
End Function

Function Draw_Kugel ()
If KeyHit (space) Then
Kugel_X = Player_X
Kugel_Y = Player_Y
DrawImage Kugel, Kugel_X, Kugel_Y
Kugel_X = Kugel_X +4
End Function


Kann mir bitte jemand helfen, probiere schon seit wochen selbst damit klar zu kommen, habe dutzende Tutorials durchgelesen, sowie die Threads in dem Forum und hab die Suchfunktion benutzt! Benutze übrigens Blitz Basic 2D!!!

~Editiert~
Wenn du [ code ] Tags verwendest, solltest du BBCode nicht deaktivieren. MfG D2006

Lunatix

BeitragDi, Aug 08, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
einer der alten fehler : DrawImage wird nur aufgerufen wenn du die Funktion
Draw_Kugel() aufrufst.

Mach noch eine UpDate_Kugel Funktion, und du brauxhst Types.
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...
 

Matthias

Betreff: SIN\COS Ist der schlüssel

BeitragDi, Aug 08, 2006 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Afro Habe deinen Beitrag gelesen und dir in 10min was zusammen geschustert Vieleicht kannst du damit was Anfangen.

Gruß Matthias

BlitzBasic:
Graphics 800,600,32,2

TFormFilter False

Global PlayDre,PlayerX=300,PlayerY=300
Global Player=CreateImage(30,30)
Global KugelX#,KugelY#
ClsColor 0,200,0

SetBuffer ImageBuffer(Player):Color 200,0,0:Rect 0,0,30,30
Color 255,100,0:Rect 0,0,30,30,0:Line 15,15,15,30
MidHandle Player



Global Kugel=CreateImage(3,30)
SetBuffer ImageBuffer(Kugel):Color 255,255,255:Rect 0,0,3,30
MidHandle Kugel

SetBuffer BackBuffer()

Repeat:
If KeyDown(203)=1 Then PlayDre=PlayDre-5
If KeyDown(205)=1 Then PlayDre=PlayDre+5

PlayDre=PlayDre Mod 360
Cls
Select KeyHit(57):Case 1:KugKX#=Cos(180-PlayDre):KugKY#=Sin(180-PlayDre)
KuUp=CopyImage(Kugel):RotateImage KuUp,PlayDre:KugSch=300
KugelX#=PlayerX:KugelY=PlayerY

End Select

Select KugSch:Case 0:Case 1:FreeImage KuUp:Default
KugelX=KugelX-KugKY#:KugelY=KugelY-KugKX#
DrawImage KuUp,KugelX#,KugelY#:KugSch=KugSch-1

End Select



UpdatePlayer
Flip

Until KeyDown(1)=1
End


Function UpdatePlayer()
Img=CopyImage(Player):RotateImage Img,PlayDre
DrawImage Img,PlayerX,PlayerY:FreeImage Img
End Function

Smokie

BeitragDi, Aug 08, 2006 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ma ne Frage kennst du dich mit Types aus?? Die sind für Schüsse ideal:

Code:

Graphics 640,480,16,3
SetBuffer BackBuffer()

Type Schuss
 
    Field x,y

End Type

Repeat

Cls

Oval MouseX(),MouseY(),10,10,0


If MouseHit(1) Then

    s.schuss = New schuss
    s\x = MouseX()
    s\y = MouseY()

EndIf

For s.schuss= Each schuss

    Oval s\x,s\y,5,5,1
    s\y=s\y  - 3
    If s\y < 1 Then Delete s



Next
       


Flip
Until KeyHit(1)
End



Wenn du dich mit Types einigermaßen auskennst soltle das kein Problem für dich sein. Ansonsten kannst du ja nochma fragen

grüße
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer.
Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört
Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet

garret

BeitragDi, Aug 08, 2006 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Smokie hat Folgendes geschrieben:

Ma ne Frage
... an meine drei Vorredner: Habt ihr euch seine Frage mal genau angeguckt?

Mathias hat Folgendes geschrieben:

und dir in 10min was zusammen geschustert


Rolling Eyes

-----

Das war sein Problem:
AFRO hat Folgendes geschrieben:

aber jetzt malt es meinen Schuss nur so lange, wie ich die Leertaste gedrückt halte!


Der Fehler liegt hier:

Code:

If KeyHit (space) Then
Kugel_X = Player_X
Kugel_Y = Player_Y
DrawImage Kugel, Kugel_X, Kugel_Y
Kugel_X = Kugel_X +4
EndIf



DrawImage ist innerhalb der Bedingung KeyHit(space), wird also nur ausgeführt, wenn du Space drückst. Nimm den Zeichenbefehl aus der Bedingung und lass ihn nach der If KeyHit()-Bedingung ausführen. Bei Tastendruck soll lediglich ein neuer Schuss erstellt werden. Smokie hatte dir ja einen Beispielcode gegeben. Types sind dafür ideal (und sag jetzt nicht: "Die sind zu kompliziert" Wink)
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
 

AFRO

BeitragMi, Aug 09, 2006 9:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Thx, das is alles schon ganz gut, nur bei Matthias blick ich noch nicht so ganz durch... is ja egal! die anderen Beispiele sind top!

@ Garret:
Types sind mir zu kompliziert
Scherz! langsam komm ich sogar schon mit denen klar, wollte ihnen aber noch ein wenig ausweichen!
Ich schau mir jetz mal die Beispiele genauer an und die Posts und dann berichte ich noch mal! Laughing

Pingu_Killer

BeitragDo, Aug 10, 2006 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,
also ich bin noch ein totaler noob und verstehe noch nicht viel vin types.
Smokie:

Ich verstehe diesen teil des codes noch nicht ganz:
Zitat:
If MouseHit(1) Then

s.schuss = New schuss
s\x = MouseX()
s\y = MouseY()

EndIf

For s.schuss= Each schuss

Oval s\x,s\y,5,5,1
s\y=s\y - 3
If s\y < 1 Then Delete s



Next


Also, Ich weis natürlich, das mit einem druck auf die Maustaste, "s.schus" zu dem feld "schuss" zugewiesen wird.
Aber s/x und s/y verstehe ich nicht. Was bewirkt dies? Ich dachte ja zuerst das diese Variablen aussehen können wie man will. Doch als ich ueberall s/x durch s_x getauscht hatte veränderte sich das programm. wsas bewirkt das "geteilt"-zeichen?
Ich wäre dir auch dankbar wenn du die zwei zeilen über "If s\y < 1 Then Delete s" noch einmal.

Smokie

BeitragDo, Aug 10, 2006 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay.

ein Type ist eine Sammlung von Variablen unter einem Sammel Begriff. Das ist zwar net ganz richtig aber man kann sich so mehr drunter vorstellen. Im Beispiel wird das so deklariert:
Code:

type schuss ;Schuss ist der Sammelbegriff

   field x
   field y       ; Das sind die Variablen die unter diesem Begriff gespeichert werden

end type




UNd so kann man ganz oft den gleichen Haufen von Variablen anllegen

s.schuss = new schuss ; s ist sozusagen der Name für den schuss und new schuss bedeutete ganz einfach, dass ein neuer Schuss angelegt wird.

das Zeichen"\ "ist kein kein geteilt Zeichen "/" sondern und es bedeutet, dass von dem Schuss s auf die Variable die dahinter steht zugegriffen werden soll.

Code:
s\x = 400


for s.schuss = each schuss ;Diese schleife durchläuft jeden Schuss s ist selbe wie oben, aber man kann auch n nehmen. Es muss nicht das gleiche sein wie oben und es hat auch nix mit dem Typenamen zu tun.

So kann man jeden schuss durchlaufen.

Edit.: delete s bedeutet nur, dass der schuss s gelöscht wird

______
Das ist jetzt net alles richtig, aber man soll es ja verstehen.
Types sind wie dimfelder nur, sind Type langsamer aber sie sind dynamisch, d.h. wenn mehr Platz benötigt wird erweitert sich der type.

Ich hoffe du hast es jetzt verstanden.

Grüße[/b]
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer.
Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört
Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet

Pingu_Killer

BeitragDo, Aug 10, 2006 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank
hat mir sehr geholfen Smile

EDIT: Es hat dann doch nicht geklappt. Es gab ein weiteres problem mit den "If" bedingungen in "MoveEnemy()" und "DrawEnemy". Habe sie erst einmal rausgenommen. Klappt jetzt. Smile
 

AFRO

BeitragFr, Aug 18, 2006 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, types kann ich scho machen, hab auch das tutorial gelesen, in dem es mit personen und so erklärt wird...
BSP:
Type Ich
Field Alter
Field Größe
Field Gewicht
Field Länge Wink
End Type

Aber trotz den tollen threads und bsps die hier schon abgegeben wurden kapier ich das ganz noch nicht so ganz. Hab auch schon wieder viel ausprobiert, kommt aber immer noch nichts raus! Sad

@ Garret
Ich glaub mit dir bin ich auf dem richtigen weg, weiß aber nicht wie das gemeint ist das DrawImage aus der if-bedingung nehmen? hab ich schon ausprobiert, dass ichs nach dem Endif setze, da kommt aber dann gleich ganix mehr raus!!! bin so verzweifelt.......

garret

BeitragSa, Aug 19, 2006 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Ablaufschema für den Einsatz von Types in deinem Spiel sieht grob so aus:

Code:

Kugel_Bild = LoadImage("kugel.png")

Type kugel
  Field x,y
End Type


Damit wird ein Bild (Kugel_Bild) für deine Schüsse geladen. Außerdem wird jetzt eine Schablone für Schüsse erstellt. Man kann sich Types gut als Sandkastenform vorstellen. Du hast momentan nur eine leere Schablone, kannst damit aber beliebig viele Abzüge, in diesem Falle Sandhäufchen erstellen, die alle gleich aussehen.

Mit
Code:

k.kugel = New kugel


erstellst du einen neuen Sandhaufen, der die Eigenschaften x und y hat.

Die Zeilen
Code:

k\x = 10
k\y = 20


weisen deiner neuen Kugel / Sandhaufen bzw. ihren Eigenschaften Werte zu. Die x- und die y-Koordinate deiner neu erstellten Kugel sind also 10 und 20.

---

Wie jetzt aber die Kugeln bewegen und zeichnen?

Zunächst wird auf Druck der Leertaste (Scancode 57) ein neuer Schuss (k.kugel) erstellt:

Code:

If KeyHit(57)
  k.kugel = New kugel
    k\x = 10
    k\y = PlayerY
EndIf


k\y = PlayerY bewirkt, dass die Kugel die gleiche Y-Koordinate wie der Spieler erhält. Ich gehe hierbei davon aus, dass es sich um einen Spaceshooter handelt, bei dem man von links nach rechts fliegt.

In jedem Durchlauf der Spiel-Hauptschleife (meist die Repeat-Until KeyHit(1)- oder While Not KeyHit(1)-Wend-Schleife) soll jetzt noch die Position der Schüsse verändert werden:

Code:

For k.kugel = Each kugel
  k\x = k\x +1
  DrawImage Kugel_Bild, k\x, k\y
Next


Außerdem wird für jede Kugel das Kugel_Bild gezeichnet.

Code:

For k.kugel = Each kugel

arbeitet folgendermaßen: Da alle neu erstellten Schüsse (also die Sandhaufen) untereinander gleich sind, muss man eine Beispielvariable angeben, die zeigt, wie mit allen anderen Sandhaufen verfahren werden soll, hier also k.kugel. Für g.kugel oder h.kugel wird das gleiche gemacht wie für k.kugel, ihre x-Variable wird um eins erhöht (k\x = k\x +1).
Next schließt die For-Schleife ab.

---

Wird ein Sandhaufen nun nicht mehr benötigt, kann er problemlos wieder gelöscht werden. Ich gehe hier wie gesagt von einem Spaceshooter aus. Das bedeutet: Verlässt die Kugel den Bildschirm (oder trifft sie einen Gegner), wird sie gelöscht. Dazu erweitern wir die obere For-Schleife:

Code:

For k.kugel = Each kugel
  k\x = k\x +1
  DrawImage Kugel_Bild, k\x, k\y
  If k\x>640 Delete k.kugel
Next


Es ist wichtig, den Delete-Befehl immer ans Ende einer For-Each-Schleife zu setzen, da sonst eventuell eine Abfrage auf einen nicht mehr vorhandenen Sandhaufen entstehen könnte, was zu einer Fehlermeldung ("Object doesnt exist") führt.

---

Der gesamte Code sieht also grob so aus:

Code:

Graphics 640,480 : SetBuffer Backbuffer()
Kugel_Bild = LoadImage("kugel.png")

Type kugel
  Field x,y
End Type

PlayerY = 100

Repeat:Cls

If KeyHit(57)
  k.kugel = New kugel
    k\x = 10
    k\y = PlayerY
EndIf

For k.kugel = Each kugel
  k\x = k\x +1
  DrawImage Kugel_Bild, k\x, k\y
  If k\x>640 Delete k.kugel
Next

Flip:Until KeyHit(1):End


Der Code benötigt allerdings noch eine Bremse, sprich einen Timer.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Schranz0r

BeitragSa, Aug 19, 2006 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Shocked

Das artet ja noch in ein Tutorial aus Very Happy

Types sind ein komplexes Thema, aber da gibt es doch schon gute Tutorials hier im Forum

einfach mal die eingestaubte *pust* "Suchfunktion" verwenden Wink
 

AFRO

BeitragSo, Aug 27, 2006 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Alter THX garret! Glaub jetz hab ichs kapiert, muss aber jetz erst mal eine woche ohne meiner dicken Berta (so nenn ich meinen pc liebevoll Laughing ) rumbringen, Urlaub... aber da kann ich ja auch was anderes machen, mädchen, mädchen mädchen, ihr wisst schon was ich meine! Also ich schreib dann mal zurück, obs diesmal endlich geklappt hat!!!!! hab aber schon n gutes gefühl... Very Happy
 

AFRO

Betreff: THX

BeitragMo, Sep 18, 2006 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry dass ich so lange nicht gepostet hab, aber ich war ja im urlaub! Embarassed ENDLICH FUNKTIONIERTS!!! DANKE AN EUCH ALLE WART ECHT EINE GROßE HILFE!!!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group