Probleme mit Mexico Shooter

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Schnäggli92

Betreff: Probleme mit Mexico Shooter

BeitragDo, Feb 07, 2008 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach längerer Pause hab ich wieder angefangen an meinem Mexico Shooter zu Proggen. Jetzt hab ich aber zwei Probleme die ich einfach nicht lösen kann.

1. Ich hab mein Player (mänchen) so Programmiert dass wenn er an die Wand kommt er abprallt. Wenn er jetzt aber seitwärz an die wand läuft dan saust er aus dem Spielfeld.Habt ihr Lösungsforschläge?

2. In meinem Spiel soll es mehrere Levels geben. Ich habe mich aber schon überal nach tutorials oder lösungen umgesehen hab aber noch nichts gefunden. Ich könnte Hilfe gebrauchen. Embarassed

Mein Code:

Code: [AUSKLAPPEN]
AppTitle "mexico_shooter"
Graphics 1280,1024,32,1
SetBuffer BackBuffer()

Global boden = LoadImage ("boden.jpg")
Global lv1 = LoadImage ("lv1m.bmp")
Global speed = 10
Global speed2 =10
Global laser = LoadImage("shot.bmp")
Global teleporter = LoadImage("teleporter.bmp")
Global shot_counter = 0
Global shot_counter2 = 0
Global x= 0
Global y = 0
Global gegnerx = 400
Global gegnery = 300
Global leben1 = 50
Global leben2 = 50
posx#=400
posy#=300
posx2#=600
posy2#=500
winkel=0
Dim ImPlayer(359)
TFormFilter 0
Dim ImPlayer2(359)
TFormFilter 0

;Laden des Spielers
AutoMidHandle True
ImPlayer(0)=LoadImage("b_pistole.bmp")
MaskImage ImPlayer(n),255,0,255
For n=1 To 359
ImPlayer(n)=CopyImage(ImPlayer(0))
MaskImage lv1,255,0,255
MaskImage ImPlayer(n),255,0,255
MaskImage teleporter,255,0,255
RotateImage ImPlayer(n),-n
Next

Type shot ;erstellt den Type "shot"
Field shot_x ;x Koordinate
Field shot_y ;y Koordinate
Field w
End Type


;Laden des Spielers
AutoMidHandle True
ImPlayer2(0)=LoadImage("b_pistole.bmp")
MaskImage ImPlayer2(t),255,0,255
For t=1 To 359
ImPlayer2(t)=CopyImage(ImPlayer2(0))
MaskImage ImPlayer2(t),255,0,255
RotateImage ImPlayer2(t),-t
Next

Type shot2 ;erstellt den Type "shot"
Field shot2_x ;x Koordina
Field shot2_y ;y Koordinate
Field w
End Type
 
Local s.shot2


Color 0,0,0
ClsColor 255,255,255

;Hauptschleife/Mainloop
Repeat
Cls

If KeyDown(75) Then winkel=winkel+10
If KeyDown(77) Then winkel=winkel-10

If KeyDown(72)
posx#=posx#+Cos(winkel) * speed
posy#=posy#-Sin(winkel) * speed
EndIf

If winkel>359 Then winkel=0
If winkel<0 Then winkel=359

If KeyDown(30) Then winkel2=winkel2+10
If KeyDown(32) Then winkel2=winkel2-10

If KeyDown(17)
posx2#=posx2#+Cos(winkel2) * speed2
posy2#=posy2#-Sin(winkel2) * speed2
EndIf

If winkel2>359 Then winkel2=0
If winkel2<0 Then winkel2=359

DrawImage boden,0,0
DrawImage lv1,0,0
DrawImage ImPlayer(winkel),posx#,posy#
DrawImage ImPlayer2(winkel2),posx2#,posy2#
DrawImage teleporter,1155,900

If ImagesCollide(ImPlayer(winkel), posx, posy,frame1, lv1, x, y,frame2 ) Then
speed = speed-4
Else speed = 10
EndIf

If ImagesCollide(ImPlayer2(winkel2), posx2, posy2,frame1, lv1, x, y,frame2 ) Then
speed2 = speed2-4
Else speed2 = 10
EndIf


If KeyDown(208) Then
shot_counter = shot_counter +1
End If

;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
If shot_counter = 2 Then

info.shot = New shot ;hier wird der schuss erstellt
info\shot_x = posx# ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
info\shot_y = posy# ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
info\w = winkel
shot_counter = 0 ; den Zähler auf 0 damit es wieder von vorne losgehen kann
End If

; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

For info.shot = Each shot ; so wird jeder einzelne Schuss angesprochen
info\shot_y = info\shot_y + Cos(info\w+90) * 20
info\shot_x = info\shot_x + Sin(info\w+90) * 20 ; die Schüsse werden um -8 nach oben bewegt
DrawImage laser,info\shot_x,info\shot_y ; jetzt noch jeden schuss malen
Next

For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1, lv1, 0, 0,frame2 ) Then Delete info.shot
Next


If KeyDown(57) Then
shot_counter2 = shot_counter2 +1
End If

;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
If shot_counter2 = 5 Then

s.shot2 = New shot2 ;hier wird der schuss erstellt
s\shot2_x = posx2# ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
s\shot2_y = posy2# ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
s\w = winkel2
shot_counter2 = 0 ; den Zähler auf 0 damit es wieder von vorne losgehen kann
End If

; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

For s.shot2 = Each shot2 ; so wird jeder einzelne Schuss angesprochen
s\shot2_y = s\shot2_y + Cos(s\w+90) * 20
s\shot2_x = s\shot2_x + Sin(s\w+90) * 20 ; die Schüsse werden um -8 nach oben bewegt
DrawImage laser,s\shot2_x,s\shot2_y ; jetzt noch jeden schuss malen
Next

For s.shot2 = Each shot2
If ImagesCollide(laser,s\shot2_x,s\shot2_y,frame1, lv1, 0, 0,frame2 ) Then Delete s.shot2
Next

For s.shot2 = Each shot2
If ImagesCollide(laser,s\shot2_x,s\shot2_y,frame1,ImPlayer(winkel),posx#,posy#,frame2 ) Then leben1 = leben1-1
Next

For s.shot2 = Each shot2
If ImagesCollide(laser,s\shot2_x,s\shot2_y,frame1,ImPlayer(winkel),posx#,posy#,frame2 ) Then Delete s.shot2
Next

If leben1 = 0 Then posx = 450 posy = 60 leben1 = 50



For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1,ImPlayer2(winkel),posx2#,posy2#,frame2 ) Then leben2 = leben2-1
Next

For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1,ImPlayer2(winkel),posx2#,posy2#,frame2 ) Then Delete info.shot
Next

If leben2 = 0 Then posx2 = 350 posy2 = 60 leben2 = 50

If ImagesCollide(ImPlayer(winkel), posx, posy,frame1, teleporter,1155,900,frame2 ) Then
posx = 50
posy = 50
EndIf

If ImagesCollide(ImPlayer2(winkel), posx2, posy2,frame1, teleporter,1155,900,frame2 ) Then
posx2 = 50
posy2 = 50
EndIf




Locate 450,30
Print leben1

Locate 550,30
Print leben2

Delay 20
Flip
Until KeyHit(1)
End


Wer dir Bilder braucht:
http://rapidshare.de/files/385...r.rar.html

Ich danke für eure Hilfe.

ShadowJumper

BeitragDo, Feb 07, 2008 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
auf deine Frage kann ich dir zwar keine Antwort geben (hab mir den Code noch nicht angesehen), aber dafür gebe ich dir einen Tipp:
durch das zurückschleudern kann es passieren, dass die Figur in einer Wand landet und wenn das passiert kann es auch passieren, dass er aus dem Spielfeld rausfliegt
Grund: du überprüfst eine Kollision erst, nachdem du die Figur bewegt hast und schleuderst sie dann zurück
mögliche Lösung: du überprüfst erst, ob die Figur nach der Bewegung kollidieren würde und bewegst die Figur, wenn sie dies nicht tut (so musst du sie nicht zurück schleudern)
andere mögliche Lösung: du lässt die überprüfung nach der Bewegung, aber du prüfst, wie weit die Figur zurück geschleudert werden kann (am besten mit dem größten Wert beginnen)

ozzi789

BeitragSa, Feb 09, 2008 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If ImagesCollide(ImPlayer(winkel), posx, posy,frame1, lv1, x, y,frame2 ) Then
speed = -1
Else speed = 10
EndIf

If ImagesCollide(ImPlayer2(winkel2), posx2, posy2,frame1, lv1, x, y,frame2 ) Then
speed2 = -1
Else speed2 = 10
EndIf


So gehts , wen es auch eine nicht sehr elegante version is.

Es gäbe da auch eine 2te möglichkeit, nähmlich :

Wenn es eine Kollision gibt soll der Speed 0 betragen (so bleibt er stehn steck jedoch in der Wand fest)
Darum muss es heisn :

Wenn Kolision then Speed = 0
und die Pos soll um 1/-1 versetz werden, jedoch das alleine geht nicht du musst es aus dem winkel ableiten (so dass er die Position des Spieler weg von der Wand "stossen" soll ...

Ich code mal rum und zeig dia was daraus gewroden is Smile

Edit :

Code: [AUSKLAPPEN]


If  ImagesCollide (auto(winkel),x,y,0,wall1,1,1,0) And y>y1
y=y+3.5
p1=p1-1

EndIf


If  ImagesCollide  (auto(winkel),x,y,0,wall1,1,1,0) And  x>x1
x=x+3.5
p1=p1-1

EndIf


If  ImagesCollide (auto(winkel),x,y,0,wall1,1,1,0) And y<y1
y=y+3.5
p1=p1-1

EndIf


If  ImagesCollide  (auto(winkel),x,y,0,wall1,1,1,0) And  x<x1
x=x+3.5
p1=p1-1

EndIf


So hab ich es bei mia gelöst ^^
Das p1 kanste weglassn (das warn die Leben)
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Schnäggli92

BeitragSa, Feb 09, 2008 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ok ich danke euch das mit der wand hab ich jetzt gelöst aber das mit den lvs bring ich nich hin. hehe

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group