Frame-Frage (ich bin ein Noob)-Noch nicht gelöst

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3, 4  Weiter

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

 

petecoolbelab

BeitragMi, März 26, 2008 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du das genauer erklären oder meinen Code korrigieren?

The_Nici

BeitragMi, März 26, 2008 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du deinen Code kommentieren/das Problem beschreiben?

Bild1 ist ein Bild. Du kannst es nicht als Variable für eine For->Next Schleife benutzen. Ich vermute du hast das Prinzip einer solchen Schleife noch nicht begriffen.

For i=1 to 100 zählt die Variable i von eins bis einhundert durch. d.H. i muss ein Integer sein in dem Falle.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, März 26, 2008 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
The_Nici erklärt es ja schon. Bild1 ist bei deinem Beispiel durch Bild1 = LoadAnimImage das Handle von dem aktuell geladenem Bild zugeteilt worden. Dieses Handle spiegelt die Adresse wieder, wo das Bild im Speicher des Rechners landet (ist ja jedesmal wo anders). Das Handle sollte also absolut durch nichts überschrieben werden, ausser man hat es zuvor mit ql:FreeImage wieder freigegeben. Dann erst kann man mit dem Gedanken spielen, das Handle wieder zu verwenden.

Mit deiner For/Next -Schleife tust du aber genau das, du überschreibst einfach das einmalige Handle welches zu deinem Bild im Speicher führt und wunderst dich eventuell später warum DrawImage Bild1,x,y nicht mehr funktioniert. Von daher solltest du für die Schleife einen anderen Variablennamen verwenden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

petecoolbelab

BeitragMi, März 26, 2008 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

For n = 0 To 640 Step 20 Cls


Hab das Bild1 jetzt durch n ersetzt. das ganze sieht jetzt so aus:
Code: [AUSKLAPPEN]

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

Bild1 = LoadAnimImage("C:\Dokumente und Einstellungen\Peter\Eigene Dateien\Eigene Bilder\AL_HEroes2.png", 100, 180, 0, 11) ;animation laden

MaskImage Bild1, 255, 255, 255 ;transparenz

Local frame ;variable deklarieren
Repeat

For n = 0 To 640 Step 20 Cls

If zeit + 120 < MilliSecs() And pause = 0Then
zeit = MilliSecs()
frame = frame + 1
EndIf
If frame =10 Then
frame = 1
EndIf


If KeyHit(25) Then
pause = pause Xor 1;schaltet zwischen 0 und 1
EndIf

If pause = 0 Then
frame = frame

ElseIf pause = 1 Then
frame = frame = 1   
EndIf
Flip

Next
Until KeyHit(25)
WaitKey
End

Funktioniert aber auch noch nicht.
Könnt ihr mir helfen?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, März 26, 2008 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte dir helfen, wenn ich wüsste was du vor hast. Dein Programm ergibt so keinen Sinn und es lässt auch noch keine Rückschlüsse zu diesen zu. Du lädst zwar das Bild, aber verwendest es nirgens. Genauso auch mit der For/Next -Schleife. Nirgend wird n verwendet.

Es sind auch noch ein paar Fehler drin:

Code: [AUSKLAPPEN]
or n = 0 To 640 Step 20 Cls
Das Cls hat da so in der Form nichts zu suchen.

Code: [AUSKLAPPEN]
If KeyHit(25) Then ...
Tastaturabfragen sollten nicht in untergeordneten Schleifen abgefragt werden.

Code: [AUSKLAPPEN]
frame = frame = 1
Kann aus logischer Sicht garnicht richtig sein.

MilliSecs() sollte nach Möglichkeit nicht mehrfach innerhalb einer Schleife abgefragt werden. Wie auch mit anderen Funktionen.

...


Arbeite die Tutorials bei Robsite mal durch, dann sollten die ganzen Grundlagen zumindest verstanden sein.

edit1: Es ist auch von ausserordentlicher Wichtigkeit, dass man gleich zu Beginn mit dem einrücken des Codes anfängt. Ich habe mir dazu dein Code genommen es von IDEal automatisch einrücken lassen und die paar Sachen so korrigiert bzw. kommentiert.

Code: [AUSKLAPPEN]
Graphics 640, 480, 16, 3
SetBuffer BackBuffer()

Local Bild1 = LoadAnimImage("C:\Dokumente und Einstellungen\Peter\Eigene Dateien\Eigene Bilder\AL_HEroes2.png", 100, 180, 0, 11) ;animation laden

MaskImage Bild1, 255, 255, 255 ;transparenz

Local frame,zeit,pause,ms,n ;variablen deklarieren



Repeat
   
   Cls
   
   ms=MilliSecs()
   
   For n = 0 To 640 Step 20
      
      If zeit + 120 < ms And pause = 0 Then
         zeit = ms
         frame = frame + 1
         If frame = 10 Then frame = 1
      EndIf
      
      If KeyHit(25) Then pause = pause Xor 1 ;schaltet zwischen 0 und 1
      
      If pause = 0 Then
         frame = frame ;Ergibt so keinen Sinn
      ElseIf pause = 1 Then
         frame = frame = 1 ;Zuweisung mit anschliessender Zuweisung???
      EndIf
      
   Next
   
   Flip
   
Until KeyHit(25)
WaitKey
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

The_Nici

BeitragDo, März 27, 2008 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke diese For->Next Schleife ist ein Noob-Versuch um die Framezahl zu regulieren. :/
 

petecoolbelab

BeitragDo, März 27, 2008 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
Ich könnte dir helfen, wenn ich wüsste was du vor hast. Dein Programm ergibt so keinen Sinn und es lässt auch noch keine Rückschlüsse zu diesen zu. Du lädst zwar das Bild, aber verwendest es nirgens. Genauso auch mit der For/Next -Schleife. Nirgend wird n verwendet.

Es sind auch noch ein paar Fehler drin:

Code: [AUSKLAPPEN]
or n = 0 To 640 Step 20 Cls
Das Cls hat da so in der Form nichts zu suchen.

Code: [AUSKLAPPEN]
If KeyHit(25) Then ...
Tastaturabfragen sollten nicht in untergeordneten Schleifen abgefragt werden.

Code: [AUSKLAPPEN]
frame = frame = 1
Kann aus logischer Sicht garnicht richtig sein.

MilliSecs() sollte nach Möglichkeit nicht mehrfach innerhalb einer Schleife abgefragt werden. Wie auch mit anderen Funktionen.

...


Arbeite die Tutorials bei Robsite mal durch, dann sollten die ganzen Grundlagen zumindest verstanden sein.

edit1: Es ist auch von ausserordentlicher Wichtigkeit, dass man gleich zu Beginn mit dem einrücken des Codes anfängt. Ich habe mir dazu dein Code genommen es von IDEal automatisch einrücken lassen und die paar Sachen so korrigiert bzw. kommentiert.

Code: [AUSKLAPPEN]
Graphics 640, 480, 16, 3
SetBuffer BackBuffer()

Local Bild1 = LoadAnimImage("C:\Dokumente und Einstellungen\Peter\Eigene Dateien\Eigene Bilder\AL_HEroes2.png", 100, 180, 0, 11) ;animation laden

MaskImage Bild1, 255, 255, 255 ;transparenz

Local frame,zeit,pause,ms,n ;variablen deklarieren



Repeat
   
   Cls
   
   ms=MilliSecs()
   
   For n = 0 To 640 Step 20
      
      If zeit + 120 < ms And pause = 0 Then
         zeit = ms
         frame = frame + 1
         If frame = 10 Then frame = 1
      EndIf
      
      If KeyHit(25) Then pause = pause Xor 1 ;schaltet zwischen 0 und 1
      
      If pause = 0 Then
         frame = frame ;Ergibt so keinen Sinn
      ElseIf pause = 1 Then
         frame = frame = 1 ;Zuweisung mit anschliessender Zuweisung???
      EndIf
      
   Next
   
   Flip
   
Until KeyHit(25)
WaitKey
End


Dein Code klappt auch nicht.
Ich will, dass der Held von links nach rechts läuft.

Help Me, Please

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, März 27, 2008 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal ein Beispiel wie es gemacht wird das sich die Figur bewegt, habe es extra einfach gehalten
Code: [AUSKLAPPEN]
Graphics 640 , 480 , 16 , 3
SetBuffer BackBuffer ()
Bild1 = LoadAnimImage ("C:\Dokumente und Einstellungen\Peter\Eigene Dateien\Eigene Bilder\AL_HEroes2.png", 100 , 180 , 0, 11) ;animation laden
MaskImage Bild1, 255 , 255 , 255 ;transparenz
Local frame ;variable deklarieren
Repeat
    Cls
    ;Frame weiterschalten nur wenn keine Pause
    If zeit + 120 < MilliSecs () And pause = 0 Then
        zeit = MilliSecs ()
        frame = frame + 1
        If frame > 10 Then frame = 0
    EndIf
    ;
    ;Bild malen
    DrawImage Bild1 ,Xpos, 200 , frame
    ;
    ;Pause ON/OFF
    If KeyHit (25) Then pause = pause Xor 1;schaltet zwischen 0 und 1
    ;
    If Pause = 0 Then xpos = xpos + 2
    ; Figur wieder nach links setzten
    If xpos > 480 Then xpos = 0
    Flip
Until KeyHit (1); wenn ESC dann beenden
WaitKey
End

Schau dir den Code genau an damit du ihn auch verstehst sonst wird das nix
[BB2D | BB3D | BB+]
 

petecoolbelab

BeitragDo, März 27, 2008 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab hier ein kleines Video gemacht:

http://petevideo.blogspot.com

Man sieht hier, dass nicht nur eine Figur durchs Bild geht und der Frame leicht nach hinten geht bzw. nicht mitkommt.
Wie kann ich das verhindern?

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, März 27, 2008 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Wenn das Bild nicht korrekt angezeigt wird also halb halb hast du beim laden des Bildes was falsch gemacht
evt ist es nicht 100,180,0,11
sondern
90 ,180,0,12
Schau die mal die Original Datei an , zähl die einzelnen Bilder und die grösse der ganzen bitmap damit du genau sagen kannst wie gross ein Frame ist

Code: [AUSKLAPPEN]
AL_HEroes2.png", 100 , 180 , 0, 11


2. wenn er den "Moonwalk" macht dann musst du die Geschwindigkeit ändern
Posx = posx +3
oder aber den timer abändern also 150 anstatt 120milli
[BB2D | BB3D | BB+]

The_Nici

BeitragDo, März 27, 2008 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Framebreite und Frameanzahl dem Bild anpassen, z.b.
 

petecoolbelab

BeitragDo, März 27, 2008 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, hat geholfen.

Aber eine Frage hätte ich noch nämlich zu diesem Link:

http://www.robsite.de/bbkurs2/09kollision.htm

Rob schreibt hier:

If ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2) Then Print "Pixelgenaue Kollision!!! (!)"

Bei X1, und y1 was soll ich dort hinschreiben?

Caesium

BeitragDo, März 27, 2008 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
die position der bilder.

beispiel:

Code: [AUSKLAPPEN]
DrawImage bild1, 300, 300


position ist also 300, 300.

gruß,
caesium
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist da schon schwieriger. Smile

BladeRunner

Moderator

BeitragDo, März 27, 2008 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute mal dass in dem Beispielcode dort x1 und y1 als variablen benutzt wurden und daher schon die Position der Spielfigur enthielten.
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
 

petecoolbelab

BeitragFr, März 28, 2008 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab das jetzt probiert. Sieht jetzt so aus:


Code: [AUSKLAPPEN]

If ImagesCollide(Bild1, Miene1) Then
Print("Sorry. Du hast verloren!")



Jetzt bekomme ich "Not enough Parameters" angezeigt.
Wie kann ich das ändern?

Sereyanne

BeitragFr, März 28, 2008 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja du hast wohl zuwenig Merkmale angegeben.
Guck dir den Tut-Code doch mal an:
Code: [AUSKLAPPEN]
If ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2) Then Print "Pixelgenaue Kollision!!! (!)"

Da sind in der Klammer 8 Parameter angegeben. Du aber fütterst BB nur mit 2. Da weiß es doch gar nicht was es machen soll! Das musst du ihm schon genauer angeben.

Caesium

BeitragFr, März 28, 2008 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
ImagesCollide(bild1, x1, y1, frame1, bild2, x2, y2, frame2)


du musst die positionen angeben, habe ich doch eben schon gesagt. x1/y1 = position des ersten bildes, x2/y2 = die des zweiten bildes. außerdem musst du das aktuelle frame angeben (was hier '0' wäre)...
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist da schon schwieriger. Smile

The_Nici

BeitragFr, März 28, 2008 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
x=X Koordinate->In Variable speichern!
y=Y-Koordinate->In Variable speichern!

Und bitte, such dir ein neues Hobby oder lies dir die Posts doppelt durch.
 

petecoolbelab

BeitragFr, März 28, 2008 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi habe folgendes Problem:

Ich habe diesen Code. Immer wenn ich ihn ausführe steht:" divide by zero" oder so.
Bin mir ziemlich sicher , dass es was was mit dem Bild2 zu tun hat.

Hier der code:
Code: [AUSKLAPPEN]

Graphics 640 , 480 , 16 , 3
SetBuffer BackBuffer ()
Bild1 = LoadAnimImage ("AL_HEroes2.png", 87 , 180 , 0, 11) ;animation laden
MaskImage Bild1, 255, 255 , 255 ;transparenz
Local frame ;variable deklarieren
Bild2 = LoadAnimImage ("AL_HEroes2_spiegel.png", xpos, 180, 0, 11)
Local frame2
Miene1 = LoadImage("Miene1.png")
MaskImage Miene1, 255, 255, 255
Abfont = LoadFont("Arial Black")   

Repeat
       Cls
       ;Frame weiterschalten nur wenn keine Pause
             
   
      If zeit + 100 < MilliSecs () And pause = 1 Then
           zeit = MilliSecs ()
           frame = frame + 1
           If frame = 11 Then frame = 0
       EndIf
       

      
      If zeit + 100 < MilliSecs () And pause = 0 Then
       DrawImage Bild1 ,Xpos, 310 , frame ;Bild malen
       EndIf
       
      
      ;Miene
      DrawImage Miene1, 400, 440
      ;
       ;Pause ON/OFF
       If KeyDown (205) Then pause = 1
       If KeyDown (203) Then pause = 2
       If Not KeyDown (205) Then pause = 0
      If Pause = 1 Then xpos = xpos + 2
         If Pause = 0 Then
         xpos = xpos
         If Pause = 2 Then
         DrawImage Bild2, Xpos, 310, frame
          MaskImage Bild2, 255, 255, 255
         ypos = ypos - 2 ; Figur wieder nach links setzten
         EndIf
       If xpos > 480 Then
      xpos = 0
      EndIf

      
         
          

       
      If ImagesCollide(Bild1, Xpos, 310, frame, Miene1, 400, 440, 0) Then
      Cls
      SetFont Abfont
      Print("Sorry. Du hast verloren!")
      WaitKey
      End
      EndIf
      
      
      

       Flip
   
      
   Until KeyHit (1); wenn ESC dann beenden
   WaitKey
  End



Ich hoffe ihr könnt mir helfen.

BladeRunner

Moderator

BeitragFr, März 28, 2008 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Divide by zero heisst "Teile durch null." Und das ist mathematisch nicht definiert.
Es bedeutet dass du irgendwo versuchst durch null zu teilen. Der Debugger wird dir zeigen wo.
Da in dem Code den Du hier postest allerdings keine Division vorkommt muss der Fehler wohl woanders liegen (sprich du hast wohl nicht allen Code gepostet).
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

Gehe zu Seite Zurück  1, 2, 3, 4  Weiter

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group