2 Probleme mit 360° Space-Shooter

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Nichts95

Betreff: 2 Probleme mit 360° Space-Shooter

BeitragFr, Jun 08, 2007 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, kommen wir gleich zur Sache^^
1. Problem: Ich habe ein Problem mit der Transparenz! Beim "Startbild", wo ich also noch keine Taste gedrückt habe, läuft noch alles ok. Wenn ich allerdings das Raumschiff drehe, geht die Transparenz sofort weg und ich sehe anstatt Transparenz die Transparenz-farbe... Ich habe das MaskImage in die For-Schleife getan, also so:
Code: [AUSKLAPPEN]

For grad = 0 To 359 ;Bilder für Gräde

spielergrafik(grad) = LoadImage("Grafiken\Raumschiffe\speeder.bmp")
RotateImage spielergrafik(grad),grad ;Bild wird gedreht
MaskImage spielergrafik(grad),255,0,255
Next


2. Problem: Das Raumschiff dreht sich viel zu schnell.... Hier das wichtigste:
Code: [AUSKLAPPEN]

...
Global player.spieler=New spieler

player\hochgeschwindigkeit#=4
player\beschleunigung#=0.12
player\wendigkeit#=1
...
Function steuerung()
If KeyDown(203)Then player\grad#=player\grad-player\wendigkeit#
If KeyDown(205)Then player\grad#=player\grad+player\wendigkeit#

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

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

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

 End If
End Function


PS: Wenn ihr eine Lösung für mich habt dann schreibt bitte für welches Problem^^

ChaosCoder

BeitragFr, Jun 08, 2007 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
zu 2.:

mach doch einfach die wendigkeit weniger o_O
Hab nur kurz draufgeguckt wenns falsch is schlag mich^^
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Nichts95

BeitragFr, Jun 08, 2007 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab's mal mit 0.10 versucht, naja, wenn ich richtig gesehen habe war das sogar noch schneller...^^ Naja, er hat mir in einer Funktion, die ich dummerweise nicht gezeigt habe, einen Fehler markiert, nämlich das Drawimage hier:
Code: [AUSKLAPPEN]

Function spieler_malen()
 DrawImage spielergrafik(Int(player\grad#)),0,0
End Function

Er hat mir geschrieben "This image does not exist" - was ich allerdings nicht verstehe wieso er mir das schreibt, denn am Anfang wenn ich keine Taste berühre zeigt er ja das Raumschiff an... Ich vermute mal das wird was mit der For-schleife zutun haben...
 

bruce85

BeitragFr, Jun 08, 2007 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze TFormFilter 0 dann sollte es Transparentz sein.
Einfach über der For Next Schleife hinschreiben.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

Nichts95

BeitragFr, Jun 08, 2007 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, klappt jezt mit der Transparenz... Fehlt jetzt nur noch die Lösung wegen diesem schnellem Drehen^^

ChaosCoder

BeitragSa, Jun 09, 2007 2:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Nichts95 hat Folgendes geschrieben:
Hab's mal mit 0.10 versucht, naja, wenn ich richtig gesehen habe war das sogar noch schneller...^^


Das glaube ich allerdings nicht, dann würde es daran liegen, dass du keinen fps begrenzer drin hast oder frameabhängig programmiert hast, denn du rechnest ja grad-wendigkeit bzw +wendigkeit wenn die taste heruntergedrückt ist (keydown) und wenn die wendigkeit kleiner wird so wird er auch pro frame weniger gedreht.

Nichts95 hat Folgendes geschrieben:
Naja, er hat mir in einer Funktion, die ich dummerweise nicht gezeigt habe, einen Fehler markiert, nämlich das Drawimage hier:
Code: [AUSKLAPPEN]

Function spieler_malen()
 DrawImage spielergrafik(Int(player\grad#)),0,0
End Function

Er hat mir geschrieben "This image does not exist" - was ich allerdings nicht verstehe wieso er mir das schreibt, denn am Anfang wenn ich keine Taste berühre zeigt er ja das Raumschiff an... Ich vermute mal das wird was mit der For-schleife zutun haben...


Lass dir dochma ausgeben welchen Wert player\grad# bzw Int(player\grad#) hat, damit könntest du dem fehler auf die schliche kommen. Der Int muss ja zwischen 0 und 359 liegen, denn nur für die wurde das Bild gedreht und geladen.

EDIT: Mir ist grad noch aufgefallen, dass du das array spielergrafik nicht global gemacht hast, woraufhin in der function das array leer ist. meiner meinung nach müsste dann zwar ein array out of bounds kommen, aber vllt irre ich mich.

MfG
Chaos
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Nichts95

BeitragSa, Jun 09, 2007 7:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, also als ich ihn ausgegeben habe konnte ich feststellen das das er dann bei (warscheinlich Rolling Eyes ) 359 auf 0 nicht springen konnte...^(Übrigens bekam ich auch Komma-zahlen, aber das Int müsste die doch runden - oder?) Dann schrieb er mir auch dieses "Image does not exist". Zu diesem Frame-bergrenzer: Soetwas habe ich nicht eingebaut; gibt's vielleicht irgendwo ein Tut dafür oder so?^^

ChaosCoder

BeitragSa, Jun 09, 2007 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also einen Framebegrenzer kriegst du mit CreateTimer und WaitTimer hin.
Schau dir einfach mal die Befehle an. Ich empfehle dir das aber nicht so zu machen, da wenn der Rechner dann eh schon weniger fps schafft als der maximalwert alles zu langsam läuft => problem bei älteren Rechnern

Deshalb solltest du frameunabhängig programmieren, so läufts auf jedem PC gleich schnell, Tut gibts hier:

https://www.blitzforum.de/foru...abh%E4ngig

Und naja ein Int "rundet" nicht, er schneidet halt alles was hinterm komma is ab. und nich wie wir aufrunden oder abrunden. Welchen Index hatte den das array spielergrafik, als er "Image does not exist" geschrieben hat? 360?

MfG
Chaos
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Nichts95

BeitragSa, Jun 09, 2007 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, hat geklappt mit dem Frame-zähler, bewegt sich nicht mehr schnell Cool Naja, das mit dem Image does not exist passiert immer beim Übergang von Grad 359 auf 0 bzw. bei Grad 0 auf 359... Dummerweise habe ich erst jetzt bemerkt das ich keine Absicherung gemacht habe das man niht über 359 Grad das Raumschiff bewegen kann Rolling Eyes Als ich sie hinzugefügt habe, hat das nichts genützt. ALso, das sieht jetzt so aus^^
Code: [AUSKLAPPEN]

For grad = 0 To 359 ;Bilder für Gräde

If grad = 360 Then grad = 0
If grad = -1 Then grad = 359

spielergrafik(grad) = LoadImage("Grafiken\Raumschiffe\speeder.bmp")
RotateImage spielergrafik(grad),grad ;Bild wird gedreht
MaskImage spielergrafik(grad),255,0,255


Next

Tankbuster

BeitragSa, Jun 09, 2007 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
For grad = 0 To 359 ;Bilder für Gräde

If grad = 360 Then grad = 0
If grad = -1 Then grad = 359

spielergrafik(grad) = LoadImage("Grafiken\Raumschiffe\speeder.bmp")
RotateImage spielergrafik(grad),grad ;Bild wird gedreht
MaskImage spielergrafik(grad),255,0,255

Next

Dass kann auch so garnicht gehen, da "grad" nur Zahlen von 0 bis 359 sein kann! Also NIE 360 oder -1 Wink
Twitter
Download Jewel Snake!
Windows|Android
 

Nichts95

BeitragSa, Jun 09, 2007 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, nur wenn ich 360 durch 359 und -1 durch 0 erstze hilft mir das erst recht nicht, denn dann bekomme ich das Programm nicht gestartet und er schreibt mir gleich "Image does not exist"...

ChaosCoder

BeitragSa, Jun 09, 2007 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass die beiden hinzugefügten If Bedingungen mit 360 und -1 erstmal ganz weg und ersetz die folgende Funktion:

Code: [AUSKLAPPEN]
Function spieler_malen()
 DrawImage spielergrafik(Int(player\grad#)),0,0
End Function


durch

Code: [AUSKLAPPEN]
Function spieler_malen()
 while player\grad>359
  player\grad=player\grad mod 360
 wend
 while player\grad<0
  player\grad=player\grad+360
 wend
 DrawImage spielergrafik(Int(player\grad#)),0,0
End Function
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Nichts95

BeitragSa, Jun 09, 2007 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm... Dann kann ich bis zum Moment drehen wo Image does not exist kommt und dann bleibt's hängen!

ChaosCoder

BeitragSa, Jun 09, 2007 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Schmeiß den Debug an und guck welchen index das array spielergrafik hat. Müsste links irgendwo stehen was die variable player\grad# aktuell fürn Wert hat.

Oder präsentiere mehr code, weil im angegeben code liegts nich (soweit ich gucken kann).
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Nichts95

BeitragSa, Jun 09, 2007 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, hier mal den aktuellen Code:
Code: [AUSKLAPPEN]

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

Dim spielergrafik(360)

For grad = 0 To 359 ;Bilder für Gräde



spielergrafik(grad) = LoadImage("Grafiken\Raumschiffe\speeder.bmp")
RotateImage spielergrafik(grad),grad ;Bild wird gedreht
MaskImage spielergrafik(grad),255,0,255


Next



Type Spieler ;Daten über Spieler...
Field x#
Field y#
Field grad#
Field spx#,spy#
Field beschleunigung#,geschwindigkeit#,hochgeschwindigkeit#,wendigkeit# ;Hochgeschwindigkeit = Höstgeschwindigkeit
End Type


Global player.spieler=New spieler

player\hochgeschwindigkeit#=4
player\beschleunigung#=0.12
player\wendigkeit#=0.10

Origin 400,300 ;Mittelpunkt erstellen

Repeat ;Hauptschleife - Anfang
startzeit = MilliSecs()

steuerung()
versetzung()
spieler_malen()


Flip 0
schleifenzeit = MilliSecs() - startzeit
Until KeyDown(1) ;Hauptschleife - Ende (Bei ESC-Druck)


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

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

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

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

 End If
End Function


Function versetzung()
 player\x#=player\x#+player\spx#
 player\y#=player\y#+player\spy#
End Function

Function spieler_malen()
Cls
 While player\grad>359
  player\grad=player\grad Mod 360
 Wend
 While player\grad<0
  player\grad=player\grad+360
 Wend
 DrawImage spielergrafik(Int(player\grad#)),0,0
End Function
[/code]

ChaosCoder

BeitragSa, Jun 09, 2007 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function spieler_malen()
Cls
 While player\grad=>360
  player\grad=player\grad Mod 360
 Wend
 While player\grad<0
  player\grad=player\grad+360
 Wend
 DrawImage spielergrafik(Floor(player\grad)),0,0
End Function


Soooo, so sollte es laufen! War n Kleiner Denkfehler.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

Nichts95

BeitragSa, Jun 09, 2007 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, funktioniert jetzt! Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group