ImagesCollide Problem
Übersicht

flexer94Betreff: ImagesCollide Problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi ich bins schon wieder ![]() Habe diesmal ein Problem mit dem Befehl "ImagesCollide"... Ich bekomme jedesmal die Fehlermeldung "Object does not Exist"... Ich habs schon damit probiert vor "If ImagesCollide" nochmal ne Bedinung zu setzen, welche Vorraussetzt, dass das eine Bild schon gezeichnet wurde, aber es geht immernoch nicht. Am besten schaut ihr euch den Source an: Code: [AUSKLAPPEN] Global setscreen = 2 .menu Graphics 1024,768,32,2 SetBuffer BackBuffer() AutoMidHandle(True) newgame = LoadImage("gfx\menu\newgame.png") ;MidHandle newgame options = LoadImage("gfx\menu\options.png") ;MidHandle options ende = LoadImage("gfx\menu\end.png") ;MidHandle ende pointer = LoadImage("gfx\menu\pointer.png") ;MidHandle pointer resolution = LoadImage("gfx\menu\resolution.png") ;MidHandle resolution fullscreen = LoadImage("gfx\menu\fullscreen.png") back = LoadImage("gfx\menu\back.png") title = LoadImage("gfx\menu\title.png") backsound = LoadSound("audio\freestyler.mp3") gameback = LoadSound("audio\gameback.wav") click = LoadSound("audio\click.wav") HidePointer ;________SOME GLOBALS :D Global game_x = 1024 Global game_y = 768 Global player_x = game_x / 2 Global player_y = game_y / 1.1 Global slide_x = 100 plus = 1 ;________MAIN MENU!!!!!!!!!! SoundVolume(backsound,0.15) channel = PlaySound(backsound) While 1 .jumpmenu mhit = MouseHit(1) If plus = 1 Then slide_x = slide_x + 1 If minus = 1 Then slide_x = slide_x - 1 m_X = MouseX() m_Y = MouseY() Cls DrawImage title,512,70 DrawImage newgame,500,200 DrawImage options,500,270 DrawImage ende,505,340 DrawImage pointer,m_X,m_Y Text slide_x,500,"Du steuerst mit den Pfeiltasten, feuern tust du auf LEER und die Waffe wechselst du mit ALT" If slide_x >= 290 Then minus = 1 : plus = 0 ElseIf slide_x <= 0 plus = 1 : minus = 0 EndIf If ImagesCollide(pointer,m_X,m_Y - 30,0,ende,500,340,0) = 1 And mhit = 1 Then PlaySound(click) : Delay(100) End ;START____________OPTIONS If ImagesCollide(pointer,m_X,m_Y - 30,0,options,500,270,0) = 1 And mhit = 1 Then PlaySound(click) While 1 m_Xres = MouseX() m_Yres = MouseY() mhit = MouseHit(1) Cls DrawImage resolution,400,200 DrawImage fullscreen,400,270 DrawImage back,400,340 DrawImage Pointer,MouseX(),MouseY() Text 470,196,game_x + " x " + game_y If ImagesCollide(back,430,365,0,Pointer,MouseX(),MouseY(),0) And mhit = 1 Then PlaySound(click) : Delay(100) Goto jumpmenu If ImagesCollide(resolution,430,225,0,Pointer,MouseX(),MouseY(),0) And mhit = 1 Then PlaySound(click) : Gosub auflSET If ImagesCollide(fullscreen,400,295,0,Pointer,MouseX(),MouseY(),0) And mhit = 1 Then PlaySound(click) If setscreen = 1 Then setscreen = 2 ElseIf setscreen = 2 Then setscreen = 1 EndIf EndIf If setscreen = 1 Then Text 470,267,"Ja (" + setscreen + ")" If setscreen = 2 Then Text 470,267,"Nein (" + setscreen + ")" Flip Wend EndIf ;END_____________OPTIONS If ImagesCollide(newgame,500,200,0,Pointer,MouseX(),MouseY(),0) And mhit = 1 Then PlaySound(click) : Exit Flip Wend EndGraphics ;___________END MENU!!!!!!!!!! :!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;BLITZFORUM AB HIER WICHTIG!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;___________TYPES_____IMPORTANT!!! Type feind Field f_alive Field f_x Field f_y Field f_typ End Type Type schuss Field s_x Field s_y End Type ;END______TYPES!!!!impSECTION Global shot_count = 0 Global p_weapon = 1 Global count_en = 0 Global show = 1 ;_______MAIN LOOP!!!! Graphics game_x,game_y,32,setscreen SetBuffer BackBuffer() player = LoadImage("gfx\player.png") rocket = LoadImage("gfx\rocket.png") background = LoadImage("gfx\background.png") enemy = LoadImage("gfx\enemy.png") bullet_n = LoadImage("gfx\fire.png") player_w1 = LoadSound("audio\player_w1.wav") SoundVolume(gameback,1) timer = CreateTimer(30) For pitch = 1000 To 2000 Step 20 Delay 50 ChannelPitch channel,pitch Next StopChannel channel LoopSound(gameback) gamechannel = PlaySound(gameback) While (1) WaitTimer(timer) Cls DrawImage background,game_x / 2,game_y / 2 DrawImage player,player_x,player_y If KeyDown(200) Then player_y = player_y - 10 : DrawImage rocket,player_x,player_y + 90 If KeyDown(208) Then player_y = player_y + 10 If KeyDown(205) Then player_x = player_x + 10 If KeyDown(203) Then player_x = player_x - 10 ;PLAYER IN THE FIELD?? If player_x <= 35 Then player_x = 35 If player_x >= game_x - 35 Then player_x = game_x - 35 If player_y <= 50 Then player_y = 60 If player_y >= game_y - 150 Then player_y = game_y - 150 If KeyHit(1) StopChannel (gamechannel) : Goto endgame If KeyHit(56) Then p_weapon = p_weapon + 1 If p_weapon = 5 Then p_weapon = 1 EndIf ;WEAPON SELECTION!!!!!! Select p_weapon Case 1 If KeyHit(57) Then PlaySound(player_w1) shot_count = shot_count + 1 EndIf If shot_count = 1 Then info.schuss = New schuss info\s_x = player_x info\s_y = player_y - 50 shot_count = 0 EndIf For info.schuss = Each schuss info\s_y = info\s_y - 20 DrawImage(bullet_n,info\s_x,info\s_y) Next Case 2 End Select ;END WEAPON SELECTION!!!!!!!!!! count_en = count_en + 1 If count_en >= 60 Then count_en = 0 If count_en = Rand(0,60) Then noob.feind = New feind noob\f_x = Rand(20,game_x - 20) noob\f_y = -50 EndIf For noob.feind = Each feind noob\f_y = noob\f_y + 3 DrawImage(enemy,noob\f_x,noob\f_y) ;AB HIER MARKIERT DER DEBUGGER______________________________________________________ If ImagesCollide(bullet_n,info\s_x,info\s_y,0,enemy,noob\f_x,noob\f_y,0) Then ;HIER IST DAS PROBLEM "Object does not Exist" ;BIS HIER__________________________________________________________________________ Next Flip Wend .endgame EndGraphics plus = 1 Goto menu ;_______BUILD - FUNCS AND SUBS .auflSET Select game_x Case 640 game_x = 800 game_y = 600 Case 800 game_x = 1024 game_y = 768 Case 1024 game_x = 1280 game_y = 1024 Case 1280 game_x = 1440 game_y = 900 Case 1440 game_x = 1680 game_y = 1050 Case 1680 game_x = 640 game_y = 480 End Select |
||
![]() |
Tennisball |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Würde ich kein ImagesCollide benutzen, wegen MAV auf diversen Grafikkarten...
2. Würde ich sagen, dass dein Problem ist, dass du nirgends sowas geschrieben hast wie Code: [AUSKLAPPEN] info = First schuss
So weiß der Compiler ja gar nicht, welches Objekt er jetzt behandeln soll. |
||
![]() |
Pummelie |
![]() Antworten mit Zitat ![]() |
---|---|---|
ohne mir dieses codegemenge jetz mal anzusehen, kann man sgen das der befehl nicht auf allen grafikkarten funktioniert
Statt dem befehl kannst du dir abfragen bauen. Edit: Verdammt 2er |
||
- Zuletzt bearbeitet von Pummelie am Di, Nov 24, 2009 19:32, insgesamt 3-mal bearbeitet
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Pummelie: Der Fehler "Object does not exist" hat allerdings nichts mit dem ImagesCollide-Fehler zu tun... | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja also der Code is schon ne ziemlich Zumutung mit den Gotos, ohne Einrückungen, etc.
Aber ich habs gefunden, du hast in "Weapon Selection" so eine Schleife drin: Code: [AUSKLAPPEN] For info.schuss = Each schuss
info\s_y = info\s_y - 20 DrawImage(bullet_n,info\s_x,info\s_y) Next Nach Ablauf dieser Schleife ist info=null Und dann, dort wo der Fehler auftaucht willst du info verwenden. info verweist aber auf keinen gültigen Type-Eintrag. EDIT @Pummelie: OMG was is das? Wozu For-Schleifen wenn es > und < gibt? |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lies mal hier nach.
Imagescollide ist nicht gut. https://www.blitzforum.de/foru...gescollide Da gibts nen Code von BigBug. Den verwende ich auch. Geht super... |
||
GazerStar - the beginning
http://gazerstar.lexigame.de/ Wizard (Worktitel) http://wizard.lexigame.de |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde fast sagen, dass der Fehler hier liegt:
Code: [AUSKLAPPEN] For noob.feind = Each feind
noob\f_y = noob\f_y + 3 DrawImage(enemy,noob\f_x,noob\f_y) ;AB HIER MARKIERT DER DEBUGGER______________________________________________________ If ImagesCollide(bullet_n,info\s_x,info\s_y,0,enemy,noob\f_x,noob\f_y,0) Then ;HIER IST DAS PROBLEM "Object does not Exist" ;BIS HIER__________________________________________________________________________ Next So wie ich das gesehen habe, hast du für die Schüsse auch Types. Also musst du zwei For schleifen miteinander verschachteln, nämlich die für die Gegner und die für deine Schüsse. In etwa so: Code: [AUSKLAPPEN] For info.Schuss = each Schuss ;Oder wie auch immer dein Type heißt
For noob.feind = Each feind ...code.... next next Lg, M0rgenstern |
||
flexer94 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok es geht mit der letzten Methode ![]() Danke an alle die mir helfen wollten! Sorry wegen dem langen Code, aber ich kannte die Ursache des Problems nicht und wusste nicht was ihr zur Behebung braucht ![]() Gruß flexer |
||
flexer94 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ähm....
die Sache hat nur einen Haken, und zwar kann man nur schießen, wenn ein Feind spawnd, je mehr Feinde spawnen, desto schneller fliegen die Schüsse... Code: [AUSKLAPPEN] For noob.feind = Each feind
For info.schuss = Each schuss info\s_y = info\s_y - info\s_speed DrawImage(bullet_n,info\s_x,info\s_y) If ImagesCollide(bullet_n,info\s_x,info\s_y,0,enemy,noob\f_x,noob\f_y,0) Then noob\f_alive = 0: Delete info.schuss Next noob\f_y = noob\f_y + 3 If noob\f_alive <> 0 Then DrawImage(enemy,noob\f_x,noob\f_y) If noob\f_y > game_y - 300 Then Delete noob.feind Next Gruß flexer |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
flexer94 hat Folgendes geschrieben: Ähm....
die Sache hat nur einen Haken, und zwar kann man nur schießen, wenn ein Feind spawnd, je mehr Feinde spawnen, desto schneller fliegen die Schüsse... Code: [AUSKLAPPEN] For noob.feind = Each feind
For info.schuss = Each schuss info\s_y = info\s_y - info\s_speed DrawImage(bullet_n,info\s_x,info\s_y) If ImagesCollide(bullet_n,info\s_x,info\s_y,0,enemy,noob\f_x,noob\f_y,0) Then noob\f_alive = 0: Delete info.schuss Next noob\f_y = noob\f_y + 3 If noob\f_alive <> 0 Then DrawImage(enemy,noob\f_x,noob\f_y) If noob\f_y > game_y - 300 Then Delete noob.feind Next Gruß flexer Ja, das was du beschrieben hast passiert wenn man den OCde so schreibt wie dus da getan hast. Natürlich muss er extra for Schleifen machen um die SChüsse und auch die Gegner zu updaten. Das man das nicht in die for Schleifen für Kollisionsabfragen packen sollte müsste logisch sein. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Könntet ihr es bitte unterlassen den Post eures direkten Vorgängers zu zitieren?
Das ist vollkommen sinnfrei. Danke. |
||
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 |
flexer94 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok...ich hab noch nicht so recht verstanden wie ichs machen soll, wär jemand bitte so freundlich und würds mir erklären warum das so ist? | ||
Gast |
![]() Antworten mit Zitat |
|
---|---|---|
Hm, okay. Folgendes...
Nehmen wir an du hast 2 Schleifen Code: [AUSKLAPPEN] ;Pseudocode
For info.schuss = Each schuss ; Das hier wird für jeden Schuss einmal aufgeführt ; Hier bewest du Next For noob.gegner = each gegner ; Das hier wird für jeden Gegner einmal ausgeführt ; Wasauchimmer du hier machen willst Next Nehmen wir mal an du machst es so: Code: [AUSKLAPPEN] For noob.gegner = Each Gener
For info.schuss = each schuss ; Das hier wird für jeden schuss so oft ausgeführt, wie es gegner gibt. ; Die Obere For-Schleife (noob.Gegner) wird durchlaufen, und bei JEDEM durchlauf EINES gegners ; wird jeder schuss nochmal geupdatet. So fligt er z.B. 4px * 10 gegner = 40 px weit Next Next Soweit verstanden? Du führst jeden schuss bei jedem gegner aus, wodurch sie die Schussgeschwindigkeit mit der Anzah der gegner multipliziert... |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ flitztuete95:
Und was soll das ganze? Dann werden die SChüsse mit steigender Gegneranzahl schneller... Korrigiert mich, wenn ich was falsch verstanden habe, aber ich glaube er wollte die Schüsse mit den Gegnern auf Kollision prüfen. Das machst du so: Zuerst machst du für jeden Schuss einen neuen Type eintrag Code: [AUSKLAPPEN] ...Abfrage ob die Taste zum schießen gedrückt wird...
wenn ja, dann: Schuss.TSchuss = new TSchuss Schuss\SX = irgendwas Schuss\Sy... und so weiter. Das gleiche für jeden Gegner wenn einer erstellt wird. Dann machst du EINE for schleife für die Gegner, in der du sie updatest: Code: [AUSKLAPPEN] For Gegner.TGegner = each TGegner
Gegner\GX = Gegner\GX + Gegner\GSpeed ;Oder wie auch immer du die Bewegung darstellst ;Und natürlich zeichnen: drawimage Gegner\GImage, Gegner\GX, Gegner\GY next Das gleiche für die Schüsse: Code: [AUSKLAPPEN] For Schuss.TSChuss = each TSchuss
Schuss\SX = Schuss\SX + SChuss\SSpeed ;Oder wie auch immer du hier die Bewegung darstellst ;Und auch hier zeichnen: drawimage Schuss\SImage, Schuss\SX, Schuss\SY next und DANN machst du zwei ineinander verschachtelte for - SChleifen: Code: [AUSKLAPPEN] For Schuss.TSChuss = each TSChuss
for Gegner.TGegner = each TGegner if Imagescollide(Gegner\GImage, Gegner\GX, Gegner\GY, 0, Schuss\SImage, SChuss\SX, Schuss\SY, 0) then ... tue irgendwas. next next Natürlich musst du die ganzen Variablennamen für dein Programm anpassen. Lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group