rotosprite

Previous topic - Next topic

Naish

Tach auch zusammen, scheiss Wetter draussen... also guter Zeitpunkt sich mit GLbasic vertraut zu machen. Ich habe mal (mit ein wenig hilfe von Schranzor) nen bissal was geschrieben... da ich den Guten nach immer nerven will, nerv ich jetzt euch!

folgendes Problem.

ich möchte gerne, dass bei einem Tastendruck sich ein Sprite dreht, vom Prinzip her habe
ich das mit dem Rotosprite wohl verstanden. Die x und y Koordinaten sind in den variabeln x und y definiert, damit ich das sprite bewegen kann. Jetzt möchte ich gerne, dass sich das Sprite beim druck von z.B knopf (200) um 45° dreht. nur leider zeigt er mir die ganze zeit 2 sprites übereinander an einmal das normale .. und einmal das gedrehte.

vllt wisst ihr ja wo der fehler liegt. Danke!


LOADSPRITE "block.bmp",0
LOADSPRITE "block.bmp",1
BLACKSCREEN

x=300
y=150
s= 0

// Am Anfang Random setzen
roto = 0
bx= RND(400)
by= RND(400)
WHILE TRUE

ROTOSPRITE 0, x, y, roto

PRINT "score: " + s, 100, 100
SPRITE 0, x, y
SPRITE 1, bx, by
IF KEY( 205 ) = 1 THEN x=x + 5
IF KEY( 203 ) = 1 THEN x=x - 5
IF KEY( 200 ) = 1 THEN y=y - 5
roto = 45
IF KEY( 208 ) = 1 THEN y=y + 5
roto = 45

IF SPRCOLL (0, x, y, 1, bx, by)
bx = RND(600)
by = RND(440)
s = s + 10
ENDIF
SHOWSCREEN
WEND
SHOWSCREEN
END

Quentin

ich muss gestehen, ich verstehe nicht ganz, was du hier erreichen willst.

Aber das Programm arbeitet genau so, wie du es programmiert hast. Innerhalb der Schleife stellst du das Sprite 0 erst mal mit ROTOSPRITE in der gewünschten Drehung dar und anschließend mit SPRITE ganz normal an der gleichen Position. Also liegt Sprite 0 tatsächlich zweimal an gleicher Stelle vor, einmal gedreht und einmal normal. ROTOSPRITE dreht nicht nur die Grafik sondern zeigt sie auch gleich an, also denke ich du kannst dir den Befehl SPRITE 0, x, y sparen.

ich weiß nicht, ob es genau das ist, was du haben wolltest, aber folgendes kleine Beispiel kommt dem wohl nahe ... hoffe ich ;)
Statt der Grafik habe ich einfach mal Quadrate gezeichnet. Das, welches du mit den Richtungstasten steuerst, rotiert langsam, das andere steht still. Wenn beide kollidieren, bekommt das stillstehende eine neue Position auf dem Bildschirm und der Highscore wird hochgezählt.

Code (glbasic) Select
FILLRECT 0, 0, 30, 30, RGB(255, 128, 0)
GRABSPRITE 0, 0, 0, 30, 30
FILLRECT 0, 0, 30, 30, RGB(255, 128, 255)
GRABSPRITE 1, 0, 0, 30, 30

x = 300
y = 150
s = 0

// Am Anfang Random setzen
roto = 0
bx= RND(400)
by= RND(400)

WHILE TRUE

  ROTOSPRITE 0, x, y, roto

  PRINT "score: " + s, 100, 100

  SPRITE 1, bx, by
 
  IF KEY( 205 ) = 1 THEN x = x + 5
  IF KEY( 203 ) = 1 THEN x = x - 5
  IF KEY( 200 ) = 1 THEN y = y - 5
  IF KEY( 208 ) = 1 THEN y = y + 5

  INC roto, 5
 
  IF SPRCOLL (0, x, y, 1, bx, by)
    bx = RND(600)
    by = RND(440)
    s = s + 10
  ENDIF
 
  SHOWSCREEN
 
WEND

END

Naish

Erstmal danke für deine Antwort.

Mir ist schon klar, dass das programm so arbeitet wie ich es Programmiert habe...! Aber leider arbeitet es nicht so wie ich es will. Genau da liegt mein Problem. Die Rede war ja auch nicht davon, dass das Programm gar nicht läuft.

Ich habe jetzt mal den SPRITE 0 rausgenommen und du hast recht. jetzt habe ich nur noch 1 Sprite. Ich habe ja roto schon vorab deklariert als "0" also müsste das sprite ja ganz nomal angezeigt werden...? richtig? Nun wird es aber von Anfang an im 45° winkel angezeigt und nicht wie vorher defieniert "0" also normal.

Ich wollte, dass wenn ich eine Taste drücke sich die variabel "roto" verändert und somit das Sprite einen anderen winkel bekommen. wie z.B beim Richtungswechsel eines Players.

deswegen dachte ich mir, dass ich nach jeden If key Befehl die Variabel "roto" veränder.
-> IF KEY( 200 ) = 1 THEN y=y - 5
roto = 45

oder muss da irgendwie ein AND zwischen... (habe ich schon versucht, geht aber nicht)

(edit: neee =) ich wollte, quasi eine playersteuerung machen.. ich merke aber gerade, dass das ganze nicht so aufgeht wie ich es gedacht hatte.)

Naish

is aber nen geiler effekt so.. sieht nen bissal nach ufosternenschlacht aus! =)

Quentin

achso, sorry, hatte ich wohl etwas mißverstanden

Also beim IF-Befehl gibt es zwei Varianten.

Entweder nach dem IF folgt nur ein einziger Befehl, dann kannst du es so schreiben:

Code (glbasic) Select
IF KEY(200) = 1 THEN y = y - 5Wenn jedoch mehrere Befehle von dieser Bedingung abhängig sind so musst du das in ein IF ... ENDIF einschließen
Für dein Beispiel also z.B. so
Code (glbasic) Select
IF KEY(200) = 1
  y = y - 5
  roto = roto + 45
ENDIF
In diesem Fall muss man auch das THEN weglassen, weil das signalisiert, daß nur ein Befehl folgt.

Also so wie du es gezeigt hast, wurde roto bei jedem Durchlauf immer wieder auf 45 gesetzt, unabhängig davon, ob du eine der Richtungstasten gedrückt hast oder nicht

Naish

ah cool danke!

BumbleBee

Hi
Du kannst das auch in eine Zeile schreiben.Dann aber ohne THEN aber mit Semikolon

IF KEY(200) = 1;y = y - 1;roto = roto + 45;ENDIF

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Naish

Super vielen Dank. Ich habe mich jetzt aber erstmal für ein rorierendes Dreieck entschieden.
Allerdings türmen sich jetzt wieder neue Pobleme auf:

Und zwar habe ich jetzt ein rechtecht das immer von rechts nach Links durchläuft allerdings soll die y koordinate random sein. Ich dachte mir, dass ich einfach eine variable mir RND(500) mache und die für den X wert eintrage, jedoch Zappelt das Rechteck nun wild umhher, und wechselt andauernt die Y koordinate. oder es bleibt einfach trotzdem auf der y koordinate.

Was ich also gerne möchte, is dass das Rechteck einmal von rechts nach links durchläuft und dann random an einer anderen Stelle.

Ich hoffe ihr könnt mir da (mal wieder) helfen und mir sagen, was ich falsch mache =)

danke schonmal =)

Hier der Code:
Code (glbasic) Select
//Objekte
FILLRECT 0, 0, 10, 10, RGB(255, 128, 0)
GRABSPRITE 0, 0, 0, 10, 10
FILLRECT 0, 0, 10, 10, RGB(255, 128, 255)
GRABSPRITE 1, 0, 0, 10, 10
FILLRECT 0, 0, 10, 10, RGB(255, 0, 0)
GRABSPRITE 2, 0, 0, 10, 10

// Koordinaten und Objektvariabeln
x = 300
y = 150
s = 0
bomb_x = 400
bomb_y = 400


// Am Anfang Random setzen
roto = 0
bx= RND(400)
by= RND(400)
bomb_y = RND(500)



WHILE TRUE

  ROTOSPRITE 0, x, y, roto

  PRINT "score: " + s, 100, 100

  SPRITE 1, bx, by


//Steuerung
  IF KEY( 205 ) = 1 THEN x = x + 3
  IF KEY( 203 ) = 1 THEN x = x - 3
  IF KEY( 200 ) = 1 THEN y = y - 3
  IF KEY( 208 ) = 1 THEN y = y + 3

// Leveleigenschaften
IF x < -40
x = 640
y = y
ENDIF

IF x > 640
x = -5
y = y
ENDIF

IF y < -10
x = x
y = 500
ENDIF

IF y > 500
x = x
y = -5
ENDIF


  INC roto, 5
//Kollision
  IF SPRCOLL (0, x, y, 1, bx, by)
    bx = RND(600)
    by = RND(440)
    s = s + 10
  ENDIF
// Bombe
bomb_x = bomb_x - 5
IF bomb_x < -64 THEN bomb_x = 640
ROTOSPRITE 2, bomb_x, bomb_y, bomb_x*3




  SHOWSCREEN

WEND

END

Schranz0r

JOW, Naish alter kollege, pass auf:

Code (glbasic) Select
IF Rechteck_x > 640
    Rechteck_x = -10
    Rechteck_y = RND(470) // WEIL RECHTECK GLAUB 10 PIXEL BREIT IST BEI DIR =)
ENDIF
Solltest du nun selber auf deinen Code übersetzen können :D
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Hey, ihr seid ja super. Da hab' ich ja beld keine Arbeit mehr :D

Quentin

fein fein, dann hast du sicherlich mehr Zeit für die Wunschliste ;) ;)

Naish

ah, super vielen dank. Habe es eben mal getestet, klappt noch nicht ganz.. habwe jetzt auch wenig zeit.. geht gleich los auf Hurricane festival -> Trinken, sonne und musik =)

Ich finds klasse hier so viele hilfsbereite Leute zu treffen. (werde euch sicher noch öfter nerven)

also bis Monag! =)

Schranz0r

Jow bis dann :D
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard