Variable type mismatch

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Lord AdZ

Betreff: Variable type mismatch

BeitragDi, Dez 25, 2007 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
momentan versuche ich, einen Space-Shooter Klon zu entwickeln. Das Ganze ist als Lernprojekt gedacht Very Happy
Bis jetzt komme ich auch schon halbwegs gut voran, nur die Schuss-funktion will nicht funktionieren.
Dazu habe ich es mit einem Type und einer For/next Schleife versucht, aber wenn ich starte kommt der Error "Variable type mismatch". Was bedeutet das bzw wie kann ich ihn beheben?
Ich habe auch schon dieses Tutorial gelesen, aber den Teil über Types nicht kapiert.

Code: [AUSKLAPPEN]
; Auflösung 800X600
Const b = 800
Const h = 600



; Steuerung
Const leer   = 57
Const rechts = 205
Const links  = 203
Const esc    = 1



; Grafiken

Global spieler1
Global spieler2
Global kugel
Global hintergrund
Global kugelgegner

; Rest

Global xsp1 = b/2
Global ysp1 = h - 10
Global xkugel#
Global ykugel#
Global geschwindigkeit=5
Global beweglichkeit
Global Schuss



;--- Types

Type s
 Field x
 Field y
End Type


ClsColor 255,0,0


;--- Hauptschleife

Graphics b,h,32,1


SetBuffer BackBuffer()

Grafikenladen()



Repeat

DrawImage hintergrund,0,0

beweglichkeit=geschwindigkeit

DrawImage spieler1,xsp1,ysp1
DrawImage spieler2,b/2, 10



; Steuerung
If KeyDown(links) Then xsp1=xsp1-beweglichkeit
If KeyDown(rechts) Then xsp1=xsp1+beweglichkeit

; Schuss
If KeyHit(leer)
  Schuss.s = New s
  Schuss.s\x = xsp1
  Schuss.s\y = ysp1
EndIf

For Schuss = Each Schuss
  Schuss\y = Schuss\y-3
  DrawImage kugel, Schuss\x, Schuss\y
  If Schuss\y < 1 Then Delete Schuss
Next




Flip
Until KeyHit(esc)
End

Dottakopf

BeitragDi, Dez 25, 2007 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub der fehler liegt hier.

Code: [AUSKLAPPEN]

; Schuss
If KeyHit(leer)
  Schuss.s = New s
  Schuss.s\x = xsp1
  Schuss.s\y = ysp1
EndIf


das .s muss weg wenn du die eigenschaften(felder) des types ansprichst.
so müsste es stimmen
Code: [AUSKLAPPEN]

; Schuss
If KeyHit(leer)
  Schuss.s = New s
  Schuss\x = xsp1
  Schuss\y = ysp1
EndIf


~Edit~
zu "Variable type mismatch". Nunja ich weis es nicht 100%ig aber ich würde behaupten, dass er damit meint, das eine variable in einem type nicht passt, bzw. so nicht "behandelt" werden darf.

Guck mal hier da gibt es auch einige type tuts von usern in diesem forum. Unteranderem auch eines indem es nur um die schussfunktion mit types geht.
https://www.blitzforum.de/forum/viewforum.php?f=6

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Lord AdZ

BeitragDi, Dez 25, 2007 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
leider ist der Fehler immer noch da und Blitz meint, das er sich in dieser Zeile befindet:
Code: [AUSKLAPPEN]
; Schuss
If KeyHit(leer)
  Schuss.s = New s ; <----- hier
  Schuss\x = xsp1
  Schuss\y = ysp1
EndIf

Dottakopf

BeitragDi, Dez 25, 2007 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm also diese zeile ist richtig.. nimm mal das "global schuss" weg
Anmerkung: Types sind immer Global

wenn das immer noch nicht geht, dan vergleich das mal mit dem hier

Code: [AUSKLAPPEN]

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


Global counter

Type shot
   Field sx
   Field sy
End Type





Repeat
Cls

   do_laser()


Flip
Until KeyHit(1)




Function do_laser()

;erstellen
If KeyDown(57) Then
     counter = counter +1
     If counter >= 10 Then
         counter = 0
 
      info.shot = New shot
         info\sx = 400
         info\sy = 600
    End If
End If    

   
;updaten
  For info.shot = Each shot
     info\sy = info\sy - 3
   
   
     Rect info\sx,info\sy,10,10,1
   
  Next
 
      



End Function




Sry aber ich bin schneller, wenn ich des hier neu schreib, als dass ich mich durch deinen code kämpf Laughing

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Silver_Knee

BeitragDi, Dez 25, 2007 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz allgemein zur meldung: "Variable type mismatch" das kommt immer dann zu stande wenn man irgendwo Vorher die variable als etwas anderes dargestellt hat.

Bei dir Macht genau das das "Global Schuss", denn da hinter schuss nix steht und das das erste vorkommen von Schuss ist, nimmt BB an du machst n integer. Später in deinem Programm sagst du aber dann Schuss.s = New s du definierst hier schuss also als träger von dem Type s. Blitz steht nun vor diesen 2 Aussagen die sich widersprechen -> ERROR

Lösung:
Global Schuss.s

damit definiest du schon am anfang Schuss als Träger von s. Im späteren verlauf dafst du nun .s weglassen.

Lord AdZ

BeitragDi, Dez 25, 2007 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Dottakopf hat Folgendes geschrieben:


Sry aber ich bin schneller, wenn ich des hier neu schreib, als dass ich mich durch deinen code kämpf Laughing

mfg Dottakopf


ist ja auch besser so, da man sonst zu copy'n'paste neigen würde Wink
Dank deiner Hilfe geht es jetzt auch bis auf das löschen des Schusses.


der Code (hab ihn an deinen Lösungsvorschlag angepasst) :

Code: [AUSKLAPPEN]

; Auflösung 800X600
Const b = 800
Const h = 600



; Steuerung
Const leer   = 57
Const rechts = 205
Const links  = 203
Const esc    = 1



; Grafiken

Global spieler1
Global spieler2
Global kugel
Global hintergrund
Global kugelgegner

; Rest

Global xsp1 = b/2
Global ysp1 = h - 10
Global xkugel#
Global ykugel#
Global geschwindigkeit=5
Global beweglichkeit



;--- Types

Type shot
 Field sx
 Field sy
End Type


ClsColor 255,0,0


;--- Hauptschleife

Graphics b,h,32,1


SetBuffer BackBuffer()

Grafikenladen()



Repeat
Cls

Schuss()

DrawImage hintergrund,0,0

beweglichkeit=geschwindigkeit

DrawImage spieler1,xsp1,ysp1
DrawImage spieler2,b/2, 10



; Steuerung
If KeyDown(links) Then xsp1=xsp1-beweglichkeit
If KeyDown(rechts) Then xsp1=xsp1+beweglichkeit

; Schuss
For info.shot = Each shot
  info\sy = info\sy - 10
  DrawImage kugel, info\sx, info\sy
  If sy < 1 Then delete shot     ; <----------------------------------------------- hier liegt der Fehler "Can't delete a non-NewType"
Next




Flip
Until KeyHit(esc)
End


[...]

Function Schuss()

 If KeyHit(leer)

   info.shot = New shot
   info\sx = xsp1
   info\sy = ysp1
 EndIf

End Function



@ Silver Knee: Danke für die Erklärung



EDIT: Hab das Problem gefunden, mit Code: [AUSKLAPPEN]
If info\sy < 1 Then Delete info.shot
gehts

nochmal allen danke Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group