type kollision

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Tarnum

Betreff: type kollision

BeitragFr, Mai 14, 2004 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte ma mit types was ausprobieren und in mein spiel einbauen.. aber dann kommt da das blöde problem..

Code: [AUSKLAPPEN]
 For vogel.flieger = Each flieger
  If ImagesCollide (kugel,kugel_x,kugel_y,0,vogel, vogel\posx,vogel\posy,vogel\frame) Then
    Delete vogel
  EndIf
Next


und wenn ich das mache kommt immer der fehler : illegal type conversation...
Kann mir wer sagen warum das kommt, und wie man sonst ne type-kollision machen kann anderen images?

Holzchopf

Meisterpacker

BeitragFr, Mai 14, 2004 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Probiers mal mit Code: [AUSKLAPPEN]
Delete vogel.flieger
Die Variable 'vogel', die du bei ImagesCollide verwendest solltest du auch umbenennen.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Tarnum

BeitragFr, Mai 14, 2004 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit delete geht auch nich anders... und wenn ich z.b. schreibe :

Code: [AUSKLAPPEN]

kkk = kkk + 1
  kollisions_vogel(kkk) = vogel.flieger


dann kommt der gleiche fehler mit illegal type conversation
 

OJay

BeitragFr, Mai 14, 2004 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
an dem obigen beispiel scheint alles ok...zeig mehr code (vor allem die deklaration des types!)
 

OJay

BeitragFr, Mai 14, 2004 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Tarnum hat Folgendes geschrieben:
das mit delete geht auch nich anders... und wenn ich z.b. schreibe :

Code: [AUSKLAPPEN]

kkk = kkk + 1
  kollisions_vogel(kkk) = vogel.flieger


dann kommt der gleiche fehler mit illegal type conversation


das ist ja auch nicht richtig. eine zuweisung kannst du nur mit einem attribut des types machen, nicht mit der objektvariable...

so währe es richtig zum beispiel:
Code: [AUSKLAPPEN]

kkk = kkk + 1
  kollisions_vogel(kkk) = vogel\kollision
 

Tarnum

BeitragFr, Mai 14, 2004 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
da alles was wichtig sein könnte für den code

Code: [AUSKLAPPEN]

Type flieger
  Field posx
  Field posy
  Field frame
  Field speed 
  Field richtung
End Type

;erstellen der vögel per zufall
zufalls = Rnd (1,200)
If zufalls = 100 Then
  vogel.flieger = New flieger
  vogel\posx = 0
  vogel\posy = Rnd (1,380)
  vogel\frame = 0
  vogel\speed = Rnd (1,20) / 10
  zufalls = 0
EndIf

;mit bewegung versehen
For vogel.flieger = Each flieger
  vogel\posx = vogel\posx + vogel\speed
Next
End Function


For vogel.flieger = Each flieger
  If ImagesCollide (kugel, kugel_x ,kugel_y,0, vogel,vogel\posx,vogel\posy,vogel\frame) Then
    Delete vogel.flieger
  EndIf
Next

Michi1988

BeitragFr, Mai 14, 2004 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst als Imagename eine andere Variable als Vogel nehmen, weil das schon dein speicher ist.

mach z.B. Img_Vogel=loadimage("")

und dann

if imagescollide(Kugel,Kugel_x,Kugel_y,0,Img_Vogel,Vogel\posx,vogel\posy,vogel\frame) then delete vogel



Müsste klappen.
 

Tarnum

BeitragFr, Mai 14, 2004 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
oh man bin ich blöd Wink .. hab ich garnich gemerkt vor lauter befehlen und type testing (heut erst damit angefangen) ... danke, jetzt funktioniertes!!!
 

Tarnum

BeitragDo, Mai 27, 2004 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetzt hab ich das nächste problem.. das obere hat sich ja jetzt erledigt.. und zwar : wie krieg ich 2 types zum kollidieren? mit verschachtelten for each schleifen geht das irgendwie nich... code brauch ich glaubich nich..
hierbei kommt illegal type conversation, liegt nich am type definieren oder so, sondern konkret an dieser zeile...
Code: [AUSKLAPPEN]
For alien.gegner = Each gegner
      For schuss.schusstype = Each schusstype
         If ImagesCollide (schuss,schuss\x,schuss\y,0,alien\image, alien\x,alien\y,alien\frame) Then
            boom.explosion = New explosion
            boom\x = alien\x 
            boom\y = alien\y
          EndIf
      Next
   Next
 

Dreamora

BeitragDo, Mai 27, 2004 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
an welcher stelle ist der fehler konkret?

Weil so gibts verschiedene Möglichkeiten:

-In deinem Programm gibt es bereits etwas das alien oder schuss heisst und nen anderen type hat
-eine der fields gibts net


aber wenn ich ehrlich bin glaub ich einfach dass du schusselig bist Razz

sollte sicher imagescollide(schuss\image, .... heissen net? Smile
 

Tarnum

BeitragDo, Mai 27, 2004 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
ups ich glaub du hast recht Laughing ... bin noch neu beim typen und komm da irgendwie öfters ma durcheinander... danke !
 

Tarnum

BeitragDo, Mai 27, 2004 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
bin jetzt wieder um einiges weiter und das nächste problem, aber diesmal hab ich echt keine ahnung wodran es liegen könnte...
da sagt er mir memory acess violation.. aber nur wenn ich zu schnell die gegner abschiesse...

Code: [AUSKLAPPEN]

For alien.gegner = Each gegner
      For schuss.schusstype = Each schusstype
         If ImagesCollide (shoot,schuss\x,schuss\y,0,alien\image, alien\x,alien\y,alien\frame) Then
            Delete schuss.schusstype
            chan1 = PlaySound (bling)
            alien\leben = alien\leben - 10
            If alien\leben < 0 Then
               boom.explosion = New explosion
               boom\x = alien\x 
               boom\y = alien\y
               chan3 = PlaySound (puff)
               Delete alien
            EndIf
          EndIf
      Next
   Next
[/quote]
 

Tarnum

BeitragDo, Mai 27, 2004 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaub ich poste mal den ganzen code damit ihr damit was anfangen könnt :

Code: [AUSKLAPPEN]

AppTitle "megashuuuter"

Graphics 1024,768,32,1
SetBuffer BackBuffer ()


Global selber = LoadAnimImage ("grafiken\raumschiff.png",35 ,50 ,0,3)
 MaskImage selber , 255,0,255
Global shoot = LoadImage ("grafiken\plasma.bmp")
 MaskImage shoot , 255,255,255
Global h_ground = LoadImage ("grafiken\orionnebel.jpg")
Global orion = CopyImage ( h_ground)
ResizeImage orion , 1024,768
Global explo = LoadAnimImage ("grafiken\explosion1.png",60,60,0,11)
 MaskImage explo,0,0,0
Global feind1 = LoadAnimImage ("grafiken\gegner2.png",50,40,0,6)
 MaskImage feind1 , 0,0,0
Global feind2 = LoadAnimImage ("grafiken\gegner4.png",46,60,0,6)
 MaskImage feind2 ,0,0,0
Global feind3 = LoadAnimImage ("grafiken\gegner1.png",45,61,0,6)
 MaskImage feind3 ,0,0,0



;SOUNDS LADEN
Global las = LoadSound ("sounds\laser_sh.wav")
Global music = LoadSound ("sounds\lied1.mp3")
Global puff = LoadSound ("sound\die.wav")
Global bling = LoadSound ("sounds\gut.wav")


Type boot
 Field x
 Field y
 Field leben
 Field frame
 Field staerke
End Type
schiff.boot = New boot

schiff\x = 495
schiff\y = 688
schiff\staerke = 10

Type schusstype
 Field x
 Field y
 Field art
End Type


Type gegner
 Field x
 Field y
 Field speed
 Field frame
 Field image
 Field leben
End Type

Type explosion
 Field x
 Field y
 Field zaehler
 Field frame
End Type


;LEVEL 1


Dim i(10)

For i(2) = 1 To 3
  For i(1) = 1 To 7
    alien.gegner = New gegner
    alien\speed = -2
    alien\x = 10 + i(1) * 110
    alien\y = 10 + i(2) * 90
    If i(2) = 1 Then
       alien\image = feind1
       alien\leben = 20
    EndIf

    If i(2) = 2 Then 
       alien\image = feind2
       alien\leben = 30
    EndIf
 
    If i(2) = 3 Then
       alien\image = feind3
       alien\leben = 40
    EndIf
  Next
Next








PlayMusic ("sounds\lied1.mp3")
Repeat

   

   TASTENABFRAGE

   ;KOLLISIONS ABFRAGEN
   ;-------------------
   
   ;schüsse + gegner
   For alien.gegner = Each gegner
      For schuss.schusstype = Each schusstype
         If ImagesCollide (shoot,schuss\x,schuss\y,0,alien\image, alien\x,alien\y,alien\frame) Then
            Delete schuss.schusstype
            chan1 = PlaySound (bling)
            alien\leben = alien\leben - 10
            If alien\leben < 0 Then
               boom.explosion = New explosion
               boom\x = alien\x 
               boom\y = alien\y
               chan3 = PlaySound (puff)
               Delete alien
            EndIf
          EndIf
      Next
   Next
 


   malframe = malframe + 1
   If malframe = 7 Then
      For alien.gegner = Each gegner
         If alien\frame = 5 Then alien\frame = 0
         alien\frame = alien\frame + 1
      Next
      malframe = 0
   EndIf   
 
   EXPLOSIONSBERECHNUNG

   MALEN


Flip
Cls
Until KeyHit(1)


;_-_________________________________________________________________________________

;-----------------------------------------------------------------------------------

;-----------------------------------------------------------------------------------

;-----------------------------------------------------------------------------------

;-----------------------------------------------------------------------------------

;FUNKTION TASTEN
Function tastenabfrage ()
  For schiff.boot = Each boot
    If KeyDown (205) And schiff\x < 980 Then
       schiff\x = schiff\x + 3
       schiff\frame = 2
    EndIf
    If KeyDown (203) And schiff\x > 0 Then
       schiff\x = schiff\x - 3
       schiff\frame = 1     
    EndIf           
    If KeyDown (208) And schiff\y < 688 Then
       schiff\y = schiff\y + 3
    EndIf
    If KeyDown (200) And schiff\y > 400 Then
       schiff\y = schiff\y - 3
    EndIf

    If KeyHit (57) Then
       chan1 = PlaySound (las)
       schuss.schusstype = New schusstype 
       schuss\x = schiff\x +5
       schuss\y = schiff\y
       schuss.schusstype = New schusstype
       schuss\x = schiff\x + 25
       schuss\y = schiff\y
    EndIf   
  Next
End Function

;FUNKTION EXPLOSIONSBERECHNEN
Function explosionsberechnung()

  For boom.explosion = Each explosion
    boom\zaehler = boom\zaehler + 1
    If boom\zaehler = 7 Then
       boom\frame = boom\frame + 1
       boom\zaehler = 0
    EndIf
   
    If boom\frame = 10 Then Delete boom.explosion
  Next





End Function

;FUNKTION MALEN
Function malen ()
  ;DrawBlock orion,1,1


  For schuss.schusstype = Each schusstype
     schuss\y = schuss\y - 7
     If schuss\y < 800 Then
         DrawImage shoot, schuss\x , schuss\y
       Else
         Delete schuss.schusstype
     EndIf
  Next


  For alien.gegner = Each gegner
     alien\x = alien\x + alien\speed
     If alien\x < -300 Then alien\x  = 1024
     DrawImage alien\image, alien\x , alien\y , alien\frame
  Next

  For boom.explosion = Each explosion
     DrawImage explo, boom\x , boom\y, boom\frame
     If boom\frame = 10 Then
        Delete boom.explosion
     EndIf
  Next


  For schiff.boot = Each boot
  DrawImage selber, schiff\x, schiff\y , schiff\frame
  schiff\frame = 0
  Next

End Function
 

Dreamora

BeitragDo, Mai 27, 2004 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hätte da ne bitte: Blitz verfügt über die geniale Fähigkeit einen Debugger zu haben. Wenn man den benutzt, sagt er einem meistens wo der Memory Access V entsteht und man kommt selbst dahinter.
Versuchs bitte erst damit.

*es gibt einige sonderausnahmen, da kratzt blitz mit dem debugger und gewissen fehlern gleich total ab, sind aber spezielle sonderfälle*

Markus2

BeitragDo, Mai 27, 2004 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@Tarnum
RE:memory acess violation
Haste mal den DebugModus eingeschaltet ?

Delete schuss.schusstype
müßte so sein
Delete schuss

Bei Alien haste das richtig gemacht !?

Wenn man alle auf einmal entfernen will so
Delete Each schusstype

Am besten gewöhnste dir an Types so zu benennen
das am Ende noch Type dran hängt wie bei SchussType
z.B. Alien.GegnerType
Boom.ExplosionType
BootType
...
 

Tarnum

BeitragDo, Mai 27, 2004 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry dreamora, da hab ich nichmehr dran gedacht, abers problem ist jetzt gelöst... der fehler war, dass der alien schon gelöscht wurde, aber man noch in der schleife war, wo die kollision zwischen jedem einzelnen schuss und dem alien geprüft wurde, der allerdings gelöscht wurde gerade... habs jetzt n bisschen geändert und funktioniert endlich Smile

danke euch allen, jetzt wo das grundprogrmam steht, hoffe ich nichtmehr so oft hier fragen stellen zu müssen Wink

Markus2

BeitragDo, Mai 27, 2004 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@Tarnum
Gelöschte Types in einer For Each Schleife
kannste auf =NULL bzw. <>NULL prüfen ...

Ist evtl. ganz nützlich wenn man sich zu einem Alien gerade Infos
anzeigen lassen will .

War so gemeint :
Code: [AUSKLAPPEN]

Type GegnerType
 Field x
End Type
Global Alien.GegnerType =New GegnerType
Alien\X=100
Global XAlien.GegnerType
XAlien.GegnerType=First GegnerType
While Not KeyHit(1)
 Cls
 ;töten ... mit delete
 If XAlien<>Null Then
  Text 10,10,"X:"+XAlien\X
 EndIf
Wend
End

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group