ImagesCollide Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

flexer94

Betreff: ImagesCollide Problem

BeitragDi, Nov 24, 2009 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ich bins schon wieder Very Happy

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

BeitragDi, Nov 24, 2009 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 24, 2009 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 24, 2009 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Nov 24, 2009 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 24, 2009 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 25, 2009 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 25, 2009 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok es geht mit der letzten Methode Very Happy
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 Very Happy

Gruß

flexer
 

flexer94

BeitragMi, Nov 25, 2009 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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

BeitragMi, Nov 25, 2009 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMi, Nov 25, 2009 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 25, 2009 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 25, 2009 21:37
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

BeitragMi, Nov 25, 2009 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group