explosionsanimation(gelöst)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

MisterKnister

Betreff: explosionsanimation(gelöst)

BeitragSo, Aug 31, 2008 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,

also ich mache gerade eins spiel aber ich weis nicht, wie ich es machen soll, dass eine explosion als animation abgebildet wird, also wie als ein film, das problem ist, dass immer nur ein bild dargestellt wird.
hier der code
Code: [AUSKLAPPEN]

Type shot       
  Field shot_x
  Field shot_y
  Field shot_w
  Field image
  Field reichweite
End Type

If karte = 1 Then Restore gegner1
If karte = 2 Then Restore gegner2
If karte = 3 Then Restore gegner3
If karte = 4 Then Restore gegner4
If karte = 5 Then Restore gegner5



Read anzahl
For i = 1 To anzahl
   g.stehendgegner = New stehendgegner
   Read x, y
   g\x = x * 32
   g\Y = y * 32
   g\lebenspunkte = 30
Next    


Function bodentreffen()
For g.stehendgegner = Each stehendgegner
For seins.schusseins = Each schusseins
If ImagesCollide(seins\image, seins\xschuss, seins\yschuss, frmRakete, turm, g\x, g\y, 0) Then
   DrawImage raketeexplo, seins\xschuss - 16, seins\yschuss - 20, 1
   g\lebenspunkte = g\lebenspunkte - 10
   Delete seins.schusseins
EndIf
Next
Next

Function bodenloeschen()
For g.stehendgegner = Each stehendgegner
   If g\lebenspunkte <=0 Then Delete g.stehendgegner
   DrawImage raketeexplo, seins\xschuss - 16, seins\yschuss - 20, frmExplo
Next
End Function



hoffentlich versteht ihr was ich meine.

danke schonmal im voraus
  • Zuletzt bearbeitet von MisterKnister am Mo, Sep 01, 2008 16:28, insgesamt einmal bearbeitet

sheldon

BeitragSo, Aug 31, 2008 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Da musst du glaube ich mit Frames arbeiten, also ich würde oben zuerst mal deine Schussvariable(n) definieren. Z.B.:
Code: [AUSKLAPPEN]
Dim MeinSchuss.shot
Dim SeinSchuss.shot

Dann musst du dein Raketenexplosionsbild laden, also z.B.:
Code: [AUSKLAPPEN]
raketeexplo = LoadImage("explosion.gif"), Anzahl Frames

(Glaube ich ^^)
Danach eine For-Schleife machen:
Code: [AUSKLAPPEN]
For schleife = 0 to Anzahl Frames
DrawImage raketeexplo, x, y
next

Problem gelöst? Wink
(bin selber Anfänger ^^)
 

MisterKnister

BeitragSo, Aug 31, 2008 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt ein gif bild ist gut aber ich hab die demo kann die sowas laden? wenn ja, wie mache ich ein gif bild?

sheldon

BeitragSo, Aug 31, 2008 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube die Demo kann ausschließlich *.bmp-Bilder laden.
Aber du kannst dir verschiedene Programme zum erstellen einer animierten *.gif-Datei holen. Ich benutze z.B. den Ulead Gif Animator.
 

MisterKnister

BeitragSo, Aug 31, 2008 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
hab es gerade ausprobiert aber gif bilder kann die demo nicht, das problem ist mir ja, dass immer nur ein frame abgebildet ist

The_Nici

BeitragSo, Aug 31, 2008 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst auch ein BMP nehmen. Mit Frames.
Guck LoadAnimImage
 

MisterKnister

BeitragSo, Aug 31, 2008 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weis was loadanimimage ist aber ich hab es bis jetzt nur benutzt um zum beispiel propelloren rotieren zu lassen.

Xeres

Moderator

BeitragSo, Aug 31, 2008 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Dein Type braucht ein Field für den Frame:
Code: [AUSKLAPPEN]

Type Tshot       
  Field x
  Field y
  Field w
  Field frame
  Field reichweite
End Type


2. Du hast die Frames endweder in einzelnen Bildern, oder hintereinander in einem Bild
2.a - Mehrere Bilder:
Code: [AUSKLAPPEN]
Dim Explo_img(9)
For i = 0 To 9
   Explo_img(i)=LoadImage("explosion"+i+".bmp")
Next

;[...]

For s.Tshot = Each Tshot
   ;[...]
   DrawImage Explo_img(s\frame), s\x, s\y
Next


2.b - Alles in einem Bild
Code: [AUSKLAPPEN]
Global Explo_img = LoadAnimImage("explosion.bmp",32,32,0,10) ;Nicht vergessen an dein Bild anzupassen...

;[...]

For s.Tshot = Each Tshot
   ;[...]
   DrawImage Explo_img, s\x, s\y, s\frame
Next


3. Für Animationen kann man in BB keine Gif-Dateien verwenden.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

MisterKnister

BeitragSo, Aug 31, 2008 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ja laodanimimage hab ich verstanden, das problem ist nur dass immer nur ein frame abgebildet wird, also nicht wie ein film sondern eben nur ein bild

Xeres

Moderator

BeitragSo, Aug 31, 2008 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann brauchst du einen funktionierenden Timer der alle paar hundert Millisekunden einen Frame weiter schaltet, siehe Millisecs.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

sheldon

BeitragSo, Aug 31, 2008 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder du machst es mit
Code: [AUSKLAPPEN]
Delay(100)

oder so...

The_Nici

BeitragSo, Aug 31, 2008 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
sheldon Delay hält das ganze programm an.
 

MisterKnister

BeitragSo, Aug 31, 2008 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
natürlich benutze ich das mit timern mein problem ist, dass wenn ich es mit einem timer mache dann wird das bild abgebildet, wo der timer gerade ist.
mal ein beispiel:

ich setze einen timer, der alle 100 millisekunden die variable frm um 1 vergrößert bis sie größer als 10 ist



dann kontrolliere ich meinen gegner und merke: ups seine lebenspunkte sind <= 0
dann entscheide ich mich eine explosion zu malen und zwar an die position des gegners und der variable frm als framenun ist aber das problem, dass ich das bild nur zu dem frame male, den der timer gerade angibt


jetzt möchte ich aber dass er einen kleinen "film" abspielt, das war meine frage

Xeres

Moderator

BeitragSo, Aug 31, 2008 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest eine Steuervariable im Type verwenden, die umgeschaltet wird, oder die Explosion in einen eigenen Type verwalten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

MisterKnister

BeitragSo, Aug 31, 2008 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit dem eigenen type hab ich verstanden ich werds mal ausprobieren, aber was meinst du mit steuervariable

Xeres

Moderator

BeitragSo, Aug 31, 2008 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Status = 1
Schuss Bewegen zeichen usw, bei Lebenspunkte <= 0 Status auf 2.
Wenn Status = 2
Explosion Zeichnen bis Timer/Frame ausläuft, Status auf 0
Wenn Status = 0
Eintrag löschen

So in der Art. Ein eigener Type macht sich meiner Meinung nach besser.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

MisterKnister

BeitragSo, Aug 31, 2008 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ja funzt danke xeres

nein funzt doch nich,
es gibt einfach keine animation:
Code: [AUSKLAPPEN]

Function bodenloeschen()
For g.stehendgegner = Each stehendgegner
If g\lebenspunkte <=0 Then





If noetig = True
e.explo = New explo
e\image = raketeexplo
e\frm = frame
EndIf


For e.explo = Each explo
DrawImage e\image, g\x, g\y, e\frm
e\frm = e\frm + 1
If e\frm > (9) Then Delete e.explo
Next

Delete g.stehendgegner


EndIf
Next
End Function

aber hierbei schon:
Code: [AUSKLAPPEN]

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


Global rakete = LoadAnimImage("rakete.bmp", 33, 12, 0, 5)
Global raketeexplo = LoadAnimImage("raketeexplo.bmp", 64,64, 0, 10)
Global speed = LoadImage("speed.bmp")
Global haus1 = LoadImage("HausSp1.bmp")
Global hausmitte1 = LoadImage("Hausmitte.bmp")
Global feind = LoadImage("feind.bmp")
fontvariable = LoadFont("Arial")
SetFont fontvariable

Type explo
  Field image
  Field x
  Field y
  Field frm
End Type



Repeat
Cls

If KeyHit(57) Then
e.explo = New explo
e\image = raketeexplo
e\x = 100
e\y = 100
e\frm = 0
EndIf

For e.explo = Each explo
DrawImage e\image, e\x, e\y, e\frm
e\frm = e\frm + 1
If e\frm >9 Then Delete e.explo
Next


Flip
Until KeyHit(1)



weis jemand warum?
 

Speed><Coder

BeitragSo, Aug 31, 2008 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi erstmal!!

Ich hatte gestern das gleiche problem mit animierte Bilder, is aber ganz leicht.

So wie ich dein Problem versteh, willst du, dass wenn dein Soldat (oder ihrgenteiner) "stirbt" (Lebenspunkte <=0), dass dann an der Stelle des getöten Soldaten eine animierte Explosien kommt, richtig? Wenn ja, versuchs mal damit: (Musst halt an deinen Code anpassen)

Den Soldaten kann man mit Pfeiltasten Steuern und nachdem hp <= 0 Kommt die Explosion
Code: [AUSKLAPPEN]

Soldat = loadimage("soldat.bmp")
explo = loadAnimImage("explo.bmp",50,50,0,5)
x = 50
y = 50
Repeat
cls
drawimage Soldat, x,y

If KeyDown(200) Then y = y - 1
If KeyDown(208) Then y = y + 1
If KeyDown(205) Then x = x + 1
If KeyDown(203) Then x = x - 1

If x < -10 Then x = 780
If x > 800 Then x = 5
If y < 0   Then y = 595
If y > 600 Then y = 5

if hp <= 0 then Exit
flip
Forever


if hp <= 0 then

    while not keyhit(1)

    If MilliSecs() > ufotmr + 50 Then
    ufotmr = MilliSecs()
    frmufo = (frmufo + 1) Mod 5
    EndIf
    DrawImage explo,x,y,frmufo
    Wend
EndIf




Müsste eigentlich so gehn, wenn nicht, weiß ich auch nicht weiter^^
World of Warcraft Süchtlinge:
1.Süchtling:"Ey leutz ich heut was von n 'Reallife' gehört."
2.Süchtling:"Was is das???
3.Süchtling:"LINK????"

Xeres

Moderator

BeitragSo, Aug 31, 2008 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
@MisterKnister:
Du musst natürlich alle relevanten Daten übertragen, es bringt nichts die Position aus einem Type zu nehmen und die Frames aus einem anderen. Außerdem brauchst du mindestens eine Variable um die Zeit für den Timer zu speichern, ansonsten blitzen deine Explosionen wegen "e\frm = e\frm + 1" nur kurz auf.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

MisterKnister

BeitragMo, Sep 01, 2008 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
danke xeres ich hab es jetzt so gemacht
Code: [AUSKLAPPEN]


;bilder laden
repeat

bodenpruefen
explomalen

until keyhit(1)

Function bodenloeschen()
For g.stehendgegner = Each stehendgegner
If g\lebenspunkte <= 0 Then

e.explo = New explo
e\image = raketeexplo
e\x = g\x
e\y = g\y
e\frm = 0






Delete g.stehendgegner
EndIf
Next


End Function



Function explomalen()
For e.explo = Each explo
DrawImage e\image, e\x, e\y, e\frm
e\frm = e\frm + 1
If e\frm >9 Then Delete e.explo
Next
End Function


und jetzt kalappt es Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group