Vom Spaceshooter zum Autorennspiel - Problem^^

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Nichts95

Betreff: Vom Spaceshooter zum Autorennspiel - Problem^^

BeitragSo, Mai 13, 2007 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich habe mir mal das Space-Tut (Teil 1) von Schattendieb durchgelesen und wollte mal anhand dieses Tutorials ein Autorennspiel zusammenbasteln. Doch irgendwie habe ich ein Problem: Blitz Basic schreibt mir "Illegal memory adress". Hier mal der Code:

Code: [AUSKLAPPEN]

Graphics 800,600,16,1
SetBuffer BackBuffer
TFormFilter 1
AutoMidHandle 1
SeedRnd MilliSecs()

Dim sp_grafik(360)

For gr=0 To 359
sp_grafik(gr) = LoadImage("grafiken\Auto.bmp")
RotateImage sp_grafik(gr),gr
Cls
DrawBlock sp_grafik(gr),400,300
Flip
Next
Type player
Field x#,y#,grad#
Field spx#,spy#,maxspeed#,wendigkeit#,beschleunigung#
End Type
Global spieler.player=New player
spieler\maxspeed#=9
spieler\beschleunigung#=0.06
spieler\wendigkeit#=2

Origin 400,300

While Not KeyHit(1)
steuerung()
spieler_versetzten()
spieler_malen()
Flip
Wend
End
Function steuerung()
If KeyDown(203)Then spieler\grad#=spieler\grad-spieler\wendigkeit#
If KeyDown(205)Then spieler\grad#=spieler\grad+spieler\wendigkeit#

If spieler\grad#>=360 Then spieler\grad#=spieler\grad# Mod 360
If spieler\grad#<0 Then spieler\grad#=360+spieler\grad#



If KeyDown(200) Then
If spieler\spx#<Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#+Abs(Cos(spieler\grad#)*spieler\beschleunigung#)
If spieler\spx#>Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#-Abs(Cos(spieler\grad#)*spieler\beschleunigung#)

If spieler\spy#<Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#+Abs(Sin(spieler\grad#)*spieler\beschleunigung#)
If spieler\spy#>Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#-Abs(Sin(spieler\grad#)*spieler\beschleunigung#)


End If
End Function

Function spieler_versetzten()
spieler\x#=spieler\x#+spieler\spx#
spieler\y#=spieler\y#+spieler\spy#
End Function

Function spieler_malen()
DrawImage sp_grafik(Int(spieler\grad#)),0,0
End Function

Was hab ich falsch gemacht?^^
PS: Ich habe schon versucht eine E-mal zu schreiben (was irgendwie nicht klappte) und habe im Forum nach dem Thema des Tutorials gesucht!

Tankbuster

BeitragSo, Mai 13, 2007 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Bist du sicher, das das Bild existiert ??
Zitat:
sp_grafik(gr) = LoadImage("grafiken\Auto.bmp")
Twitter
Download Jewel Snake!
Windows|Android
 

Nichts95

BeitragSo, Mai 13, 2007 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja^^ Das einzige was mir jetzt eventuell noch in den Kopf kommen würde wäre das ich momentan ja noch die BB2D Demo noch verwende... Aber die unterstützt BMP ja doch!

Tankbuster

BeitragSo, Mai 13, 2007 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber vielleicht hast du das Bild nicht unter .bmp gespeichert! Rolling Eyes
Twitter
Download Jewel Snake!
Windows|Android
 

Nichts95

BeitragSo, Mai 13, 2007 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, ist unter BMP gespeichert...

BladeRunner

Moderator

BeitragSo, Mai 13, 2007 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


Bitte schalte mal den Debugger ein und schau was dann für ein Fehler gezeigt wird.
Um zu testen ob das Bild geladen wurde kannst du die Bildvariable mit print ausgeben lassen - es sollte eine Zahl ungleich 0 da stehen.
Wenn dies nicht der Fall ist wurde das Bild nicht geladen.

EDIT: Debugger gibt bei mir ein Buffer does not exist aus - Du hast die Klammern hinter Backbuffer vergessen. Da das eine Funktion ist die was zurückgibt sind die Klammern zwingend verbindlich.
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
 

Nichts95

BeitragSo, Mai 13, 2007 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, danke, funktioniert alles Very Happy

BladeRunner

Moderator

BeitragSo, Mai 13, 2007 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Drum Merke: Der Debugger ist dein Freund. Lass ihn solang Du noch am Schrauben bist an.
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
 

Nichts95

BeitragSo, Mai 13, 2007 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
So, jetzt habe ich ein neues Problem: Das Auto will nicht nach vorne fahren^^ Nur umdrehen kann es sich. Hier mein aktueller Quellcode der noch woanders geändert wurde:
Code: [AUSKLAPPEN]

Graphics 800,600,16,1
SetBuffer BackBuffer()
TFormFilter 1
AutoMidHandle 1
SeedRnd MilliSecs()

test=LoadImage("grafiken\auto.bmp")
;hintergrund1=LoadImage("grafiken\boden.bmp")
Dim sp_grafik(360)
For gr=0 To 359
 sp_grafik(gr)=LoadImage("grafiken\auto.bmp")
 RotateImage sp_grafik(gr),gr

 
 Cls

 ;TileBlock hintergrund1, 0, 0
 DrawImage sp_grafik(gr),400,300
 DrawImage test,299,359


 Flip
Next

Type player
 Field x#,y#,grad#
 Field spx#,spy#,maxspeed#,wendigkeit#,beschleunigung#
End Type

Global spieler.player=New player
spieler\maxspeed#=5
spieler\beschleunigung#=0.05
spieler\wendigkeit#=2

Origin 400,300

While Not KeyHit(1)
 steuerung()
 spieler_versetzten()
 spieler_malen()
 Flip
Wend
End

Function steuerung()
 If KeyDown(203)Then spieler\grad#=spieler\grad-spieler\wendigkeit#
 If KeyDown(205)Then spieler\grad#=spieler\grad+spieler\wendigkeit#

If spieler\grad#>=360 Then spieler\grad#=spieler\grad# Mod 360
If spieler\grad#<0 Then spieler\grad#=360+spieler\grad#


 If KeyDown(200) Then
  If spieler\spx#<Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#+Abs(Cos(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spx#>Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#-Abs(Cos(spieler\grad#)*spieler\beschleunigung#)

  If spieler\spy#<Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#+Abs(Sin(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spy#>Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#-Abs(Sin(spieler\grad#)*spieler\beschleunigung#)



 End If
End Function

Function spieler_versetzten()
 spieler\x#=spieler\x#+spieler\spx#
 spieler\y#=spieler\y#+spieler\spy#

End Function

Function spieler_malen()
 DrawImage sp_grafik(Int(spieler\grad#)),0,0

End Function

Noobody

BeitragSo, Mai 13, 2007 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch was anderes:
Zitat:
If spieler\grad#>=360 Then spieler\grad#=spieler\grad# Mod 360


Das If kannste weglassen, denn wenn spieler\grad# nicht grösser als 360 ist, dann kommt garantiert wieder das gleiche spieler\grad# raus.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Nichts95

BeitragMo, Mai 14, 2007 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, jetzt verstehe ich^^ Der Hintergrund muss sich ja bewegen Razz
Aber trotzdem klappt das irgendwie nicht! (Code wurde natürlich geändert^^)
Code: [AUSKLAPPEN]

Graphics 800,600,16,1
SetBuffer BackBuffer()
TFormFilter 1
AutoMidHandle 1
SeedRnd MilliSecs()
;hintergrund 1 x + y position
hin1y# = 0
hin1x# = 0
;----------
test=LoadImage("grafiken\auto.bmp")
hintergrund1=LoadImage("grafiken\boden.bmp")
Dim sp_grafik(360)
For gr=0 To 359
 sp_grafik(gr)=LoadImage("grafiken\auto.bmp")
 RotateImage sp_grafik(gr),gr

 
 Cls

 TileBlock hintergrund1, hin1y# , hin1x#
 DrawImage sp_grafik(gr),400,300
 DrawImage test,299,359


 Flip
Next

Type player
 Field x#,y#,grad#
 Field spx#,spy#,maxspeed#,wendigkeit#,beschleunigung#
End Type

Global spieler.player=New player
spieler\maxspeed#=5
spieler\beschleunigung#=0.05
spieler\wendigkeit#=2

Origin 400,300

While Not KeyHit(1)
 steuerung()
 spieler_versetzten()
 spieler_malen()
 Flip
Wend
End

Function steuerung()
 If KeyDown(203)Then spieler\grad#=spieler\grad-spieler\wendigkeit#
 If KeyDown(205)Then spieler\grad#=spieler\grad+spieler\wendigkeit#

If spieler\grad#>=360 Then spieler\grad#=spieler\grad# Mod 360
If spieler\grad#<0 Then spieler\grad#=360+spieler\grad#


 If KeyDown(200) Then
  If spieler\spx#<Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#+Abs(Cos(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spx#>Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#-Abs(Cos(spieler\grad#)*spieler\beschleunigung#)

  If spieler\spy#<Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#+Abs(Sin(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spy#>Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#-Abs(Sin(spieler\grad#)*spieler\beschleunigung#)



 End If
If KeyDown(203)Then
hin1x# = - spieler\beschleunigung#
EndIf
If KeyDown(205)Then
hin1y# = + spieler\beschleunigung#
EndIf
If KeyDown(200)Then
hin1y# = - spieler\beschleunigung#
hin1x# = - spieler\beschleunigung#
EndIf
End Function

Function spieler_versetzten()
 spieler\x#=spieler\x#+spieler\spx#
 spieler\y#=spieler\y#+spieler\spy#
End Function

Function spieler_malen()
 DrawImage sp_grafik(Int(spieler\grad#)),0,0

End Function
 

Nichts95

BeitragDo, Mai 17, 2007 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Da das Thema schon etwas weiter nach hinten gerutscht ist und warscheinlich keiner mir helfen kann habe ich es einfach nochmal anhand einen BB-Buches probiert^^ Doch wenn ich die Taste drücke, (Linke Pfeiltaste) die den Hintergrund verschieben soll, dann endet das Programm (wieder) mit einem "illegal memory adress"-Fehler^^ Hier der Code:
Code: [AUSKLAPPEN]

Graphics 800,600,16,1
SetBuffer BackBuffer()
TFormFilter 1
AutoMidHandle 1
SeedRnd MilliSecs()

test=LoadImage("grafiken\auto.bmp")
hintergrund1=LoadImage("grafiken\boden.bmp")
Dim sp_grafik(360)
For gr=0 To 359
 sp_grafik(gr)=LoadImage("grafiken\auto.bmp")
 RotateImage sp_grafik(gr),gr

 
 Cls

 TileBlock hintergrund1, 0 , I
 DrawImage sp_grafik(gr),400,300
 DrawImage test,299,359


 Flip
Next

Type player
 Field x#,y#,grad#
 Field spx#,spy#,maxspeed#,wendigkeit#,beschleunigung#
End Type

Global spieler.player=New player
spieler\maxspeed#=5
spieler\beschleunigung#=0.05
spieler\wendigkeit#=2

Origin 400,300

While Not KeyHit(1)
 steuerung()
 spieler_versetzten()
 spieler_malen()
 Flip
Wend
End

Function steuerung()
 If KeyDown(203)Then
 spieler\grad#=spieler\grad-spieler\wendigkeit#
 Repeat
 I = I+1
 If I = 200 Then I=0
 TileBlock hintergrund1 ,0,I
 Until KeyHit(1)
 EndIf
 If KeyDown(205)Then spieler\grad#=spieler\grad+spieler\wendigkeit#

If spieler\grad#>=360 Then spieler\grad#=spieler\grad# Mod 360
If spieler\grad#<0 Then spieler\grad#=360+spieler\grad#


 If KeyDown(200) Then
  If spieler\spx#<Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#+Abs(Cos(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spx#>Cos(spieler\grad#)*spieler\maxspeed# Then spieler\spx#=spieler\spx#-Abs(Cos(spieler\grad#)*spieler\beschleunigung#)

  If spieler\spy#<Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#+Abs(Sin(spieler\grad#)*spieler\beschleunigung#)
  If spieler\spy#>Sin(spieler\grad#)*spieler\maxspeed# Then spieler\spy#=spieler\spy#-Abs(Sin(spieler\grad#)*spieler\beschleunigung#)



 End If
If KeyDown(203)Then
hin1x# = - spieler\beschleunigung#
EndIf
If KeyDown(205)Then
hin1y# = + spieler\beschleunigung#
EndIf
If KeyDown(200)Then
hin1y# = - spieler\beschleunigung#
hin1x# = - spieler\beschleunigung#
EndIf
End Function

Function spieler_versetzten()
 spieler\x#=spieler\x#+spieler\spx#
 spieler\y#=spieler\y#+spieler\spy#
End Function

Function spieler_malen()
 DrawImage sp_grafik(Int(spieler\grad#)),0,0

End Function

Tankbuster

BeitragDo, Mai 17, 2007 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
If KeyDown(203)Then
spieler\grad#=spieler\grad-spieler\wendigkeit#

Du hast da immer das For spieler.spieler=each spieler vergessen Wink
Und du hast garkeinen Type mit dem Namen spieler, oder bin ich blind
Twitter
Download Jewel Snake!
Windows|Android
 

Nichts95

BeitragDo, Mai 17, 2007 10:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

For spieler.spieler=each spieler
If KeyDown(203)Then
spieler\grad#=spieler\grad-spieler\wendigkeit#

Meinst du das so? Oder so:
Zitat:


If KeyDown(203)Then
For spieler.spieler=each spieler
spieler\grad#=spieler\grad-spieler\wendigkeit#

Tankbuster

BeitragDo, Mai 17, 2007 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das untere Mein ich,... aber du musst noch den Type Spieler erstellen!
(und ein next nicht vergessen)
Wenn dir das alles nichts sagt, dann musst du wohl mal in der OnlineHilfe nach Types suchen =)
Twitter
Download Jewel Snake!
Windows|Android

Seoman

BeitragDo, Mai 17, 2007 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach, herrlich, die Anglizismen^^ Entweder du willst Deutsch sprechen, oder Englisch. Type player erstellen und dann spieler abfragen geht nicht Wink

Also for spieler.player...

Ist aber ja auch gemein, wenn Tankbuster das da so reinschreibt und man ihm vertraut und nicht so gerne selber nachdenkt Razz

Allerdings ist das wenn ich das richtig sehe nicht das Problem, weil du nur einen Typeeintrag hast und deshalb nicht die Schleifen durchgehen musst... Ist also nicht die Loesung, zugegebenermassen bin ich aber alles andere als gut im Debuggen^^

Was sagt dir also dein Debugger als genaue Nachricht und Fehlerzeile?
In Australien...

Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig Wink
 

Nichts95

BeitragDo, Mai 17, 2007 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Debugger? Keine Ahnung wie dieses Ding funktioniert^^ Hab mal soein "View Log"-Dialog oder was das sein soll geöffnet und das Spiel neu gestartet aber half nichts - alles war schwarz. (Nicht mal ein Grafikfehler^^ - also das Dialogfenster war schwarz^^) Naja, wenn er mir die Meldung mit dem Illegal memory adress zeigt markiert er mir leider keine Zeile... Zum Debugger noch: Das könnte nicht daran liegen, das ich die Demo verwende und diese so eingeschränkt ist das ich den Debugger nicht verwenden kann?^^

Tankbuster

BeitragDo, Mai 17, 2007 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
UUps!!
Sorry, aber ich hab anstatt
Zitat:
Global spieler.player=New player

folgendes gelesen
Zitat:
Global spieler.spieler=New spieler

dann würde da natürlich das
Type spieler fehlen Embarassed
Twitter
Download Jewel Snake!
Windows|Android
 

Nichts95

BeitragSa, Mai 19, 2007 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube ich bin weiter gekommen^^ Ich habe jetzt geschafft das der Hintergrund sich bei Druck der "Obenpfeiltaste" sich der Hintergrund um 4 Pixel veschiebt. Doch das kann ich pro Programmstart nur einmal machen Rolling Eyes
Hier die Function, die dafür zuständig ist...
Code: [AUSKLAPPEN]

Global yh#
Global xh#
Function hintergrund1()
TileBlock hintergrund1, yh, xh
If KeyDown (200) Then
Repeat
yh#= - 4
Until Not KeyDown (200)
EndIf
End Function

Tankbuster

BeitragSa, Mai 19, 2007 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach doch einfach
Zitat:
If KeyDown (200) Then yh#= yh- 4
Twitter
Download Jewel Snake!
Windows|Android

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group