Image erstellen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Mathe

Betreff: Image erstellen

BeitragFr, Feb 13, 2009 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

wie erstelle ich in BlitzMax ein Bild?

das geht doch so aber was ist da falsch?
Code: [AUSKLAPPEN]

Global image = CreateImage(25, 25)
SetColor 51, 204, 102
DrawRect 0, 0, 25, 25
Flip


mfg.
 

#Reaper

Newsposter

BeitragFr, Feb 13, 2009 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm... kommt drauf an, was du nun bewerkstelligen willst.
Also CreateImage() benutzt du schon richtig. Wenn du aber erwartest, dass es auch gezeichnet wird, musst du schon DrawImage() benutzen.

Wenn du in das Bild zeichnen willst... In der BM-Doc gibts dazu unter CreateImage() ein kleines Beispiel:
Code: [AUSKLAPPEN]
' creates a 256x1 image with a black to blue color gradient

Const ALPHABITS=$ff000000

Graphics 640,480,32

image=CreateImage(256,1)
map=LockImage(image)
For i=0 To 255
   WritePixel(map,i,0,ALPHABITS|i)
Next
UnlockImage(image)

DrawImageRect image,0,0,640,480
DrawText "Blue Color Gradient",0,0

Flip

WaitKey


Genauer kann ich dir nun leider auch nicht sagen. Benutze es kaum. Kannst dir auch mal Pixmaps anschauen.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Xeres

Moderator

BeitragFr, Feb 13, 2009 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man die Pixel nicht einzeln herumschupsen möchte sondern mit den anderen Draw-Befehlen, zeichnet man das auf den Backbuffer und grabt das dann.
Code: [AUSKLAPPEN]
SuperStrict
rem
      Test um ein Bild zur Laufzeit zu erstellen...
endrem

Graphics(800, 600, 0, 60)
SetBlend(ALPHABLEND)
AutoMidHandle(True)

Local Bild:TImage = CreateImage(64, 64)
Cls
SetColor(255, 0, 0)
DrawOval(16, 16, 32, 32)
SetColor(255, 255, 255)
DrawLine(0, 0, 0, 63)
DrawLine(0, 63, 63, 63)
DrawLine(63, 63, 63, 0)
DrawLine(63, 0, 0, 0)
GrabImage(Bild, 0, 0)
rem
      Breite und Höhe des erstellten Bildes werden ab der Position von
      Grabimage vom Backbuffer eingelesen.
endrem
DrawText("Bild erstellt, bitte Taste drücken!", 300, 300)
Flip
WaitKey()

'* Testschleife:
Local w:Int, a:Float

Repeat
   
   '*** Testrechteck ob Alpha tatsächlich da ist, oder nur schwarz:
   SetRotation(0) ;SetAlpha(1)
   DrawRect(400, 300, 50, 50)

   '*** Das Gegrabte Bild:
   w = (w + 1) Mod 360 ; SetRotation(w)
   a = (a + 0.005) Mod 1 ; SetAlpha(a)
   DrawImage(Bild, 400, 300)
   
   Flip
   Cls
Until KeyHit(KEY_ESCAPE) Or AppTerminate()
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Mathe

BeitragFr, Feb 13, 2009 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
eigentlich hab ich vor 2 Tage angefangen mit BlitzMax zu lernen leider versteh ich das noch gar nicht...
Es soll ein Ball erstellt werden der sich dann Bewegen soll aber ich versteh das noch nicht ganz so mit den Schleifen der Debugger mecket immer bei der Schleife:
Code: [AUSKLAPPEN]
For i = 1 to 20
    ....
next

eine Fehlermeldung "Identifier "i" not found"

und ich versteh auch nicht warum das image:Timage heißen muss?

Code: [AUSKLAPPEN]
'This BMX file was edited with BLIde ( http://www.blide.org )
Graphics 640, 480, 0
Type Ball
   Field X:Int, Y:Int
   Field alpha:Int
End Type

Global image:Timage = CreateImage(25, 25)
SetColor 51, 204, 102
drawRect 0, 0, 25, 25
Flip

For i = 1 To 20
   ba.Ball = New Ball
   ba.X = Rand(50, 590)
   ba.Y = Rand(50, 430)
   ba.alpha = Rand(0, 360)
Next

Repeat
   Cls
   UpdateBall()
   Flip
Until KeyHit(key_Esc) End

Function UpdateBall()
For ba.Ball = EachIn Ball
   ba.x = ba.x + 25 * Cos(ba.alpha)
   ba.y = ba.y + 25 * Sin(ba.alpha)
   DrawImage(image, ba.X, ba.Y)
Next
End Function


hoff ich konnte mich verständlich ausdrücken...

mfg.

Xeres

Moderator

BeitragFr, Feb 13, 2009 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Superstrict erfordert, dass man alle Variablen deklariert und dabei einen Typ angibt.
Z.B.
Code: [AUSKLAPPEN]
For Local i:Int = 1 to 20
[...]
next

Ein Bild ist vom Typ Timage... Nicht wie bei Blitzbasic ein Int.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

#Reaper

Newsposter

BeitragFr, Feb 13, 2009 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du SuperStrict verwendest (was zu empfehlen ist), musst du jede Variable mit einem angegeben Typen deklarieren, also erstellen.

Die Schleife müsste also z.B. so aussehen:
Code: [AUSKLAPPEN]
For Local i:Int = 1 to 20
    ...
Next

Dann wird eine Variable "i" vom Typ Int(eger) erstellt.

Das Selbe gilt also auch bei anderen Variablen-Typen. Wenn du also ein Image benutzten willst (egal ob geladen oder direkt erstellt), musst die Variable dazu - also in deinem Fall "image" - dem Typen TImage entsprechen.
Das Ganze hat mit Objekt orientierem Programmieren (kurz: OOP) zu tun. Ich weiß nicht, in wie weit du eventuell damit in anderen Sprachen zu tun hast/hattest? Ist nämlich ein großes und etwas komplizierteres Thema. Gibt dazu auch einige Tutorials.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

Mathe

BeitragFr, Feb 13, 2009 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
okey aber ich bekomme es trotzdem nicht hin... dass ich die Types richtig deklariere..
mfg.

Xeres

Moderator

BeitragFr, Feb 13, 2009 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Du tust in deinem Code auch so, als wäre die BMax Syntax die gleiche wie die von BB...
So wärs schon mal besser:
Code: [AUSKLAPPEN]
SuperStrict

Graphics 640, 480, 0
Type TBall
   Field X:Int, Y:Int
   Field Alpha:Int
   
   Global list:TList = CreateList()
   
   Method New()
      Self.list.AddLast(Self)
   End Method
End Type

Global image:Timage = CreateImage(25, 25)
SetColor 51, 204, 102
drawRect 0, 0, 25, 25
Flip

For Local i:Int = 1 To 20
   Local ba:Ball = New Ball
   ba.X = Rand(50, 590)
   ba.Y = Rand(50, 430)
   ba.alpha = Rand(0, 360)
Next

Repeat
   Cls
   UpdateBall()
   Flip
Until KeyHit(key_Esc) End

Function UpdateBall()
For Local ba:Ball = EachIn TBall.list
   ba.x = ba.x + 25 * Cos(ba.alpha)
   ba.y = ba.y + 25 * Sin(ba.alpha)
   DrawImage(image, ba.X, ba.Y)
Next
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Mathe

BeitragFr, Feb 13, 2009 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
es kommt immer eine Fehlermeldung: "Identifier "Ball" not found" aber warum?

BladeRunner

Moderator

BeitragFr, Feb 13, 2009 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du dir die Zeile anguckst welche der Debugger markiert wirst Du feststellen dass da ein :Ball deklariert wird. Der Type heisst aber TBall. Darum ist superstrict auch so gut, es hilft dir falsch benannte Vars (zB durch Vertipper) zu finden.
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
 

Mathe

BeitragFr, Feb 13, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ah okey danke... ich glaub ich lese lieber noch ein bischen mehr über BM...
 

Mathe

BeitragSo, Feb 15, 2009 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
so ich will jetzt keinen neuen Threat aufmachen deshalb schreibs ich hier noch mal rein!

Ich erstelle mit...

Code: [AUSKLAPPEN]
Global Ball%[5,1]
eine Array...

jetzt will ich sie füllen mit:

Code: [AUSKLAPPEN]
For Local a% = 1 To 5
   For Local b% = 0 To 1
      Ball[a,b] = Rand(250,350) 'X-Koordinaten & Y-Koordinaten erstellen
   Next
Next


und hier kommt dann immer eine Fehlermeldung "Unhandled Exception: Attempt to index array element boyond array length", aber ich versteh die Fehlermeldung nicht ganz dass soll doch heißen dass a% über die Arraygröße hinausgeht oder?

Code: [AUSKLAPPEN]
Strict
Graphics 800,600,0

Global Ball%[5,1]

For Local a% = 1 To 5
   For Local b% = 0 To 1
      Ball[a,b] = Rand(250,350) 'X-Koordinaten & Y-Koordinaten erstellen
   Next
Next
Global image:Timage = CreateImage(25,25)
SetColor 244,83,139
DrawOval 0,0,25,25
Flip
'----Main----
Repeat
   Cls
   UpdateBall()
   Flip
Until KeyHit(Key_Escape) End

'----Function----
Function UpdateBall()
For Local i% = 0 To 5
   DrawImage(image,Ball[i,0],Ball[i,1])
Next
EndFunction

Der Eisvogel

BeitragSo, Feb 15, 2009 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
b% auch.

BlitzMax fängt bei 0 an zu zählen.

Also musst du dein Array [5,2] groß machen und 0 To 4 schreiben. Das 0 To 1 haste richtig gemacht, aber das Array war zu klein. Wink
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragSo, Feb 15, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das 0 To 1 ist auch falsch, 0 To 0 wäre richtig gewesen, oder 0 Until 1.
 

Mathe

BeitragSo, Feb 15, 2009 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm okey aber jetzt hab ich noch ein Problem mir zeigt es meine Bälle nicht an warum?

Was ist der unterschied zwischen Strict und SuperStrict?

Der Eisvogel

BeitragSo, Feb 15, 2009 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil in dein Bild nix gezeichnet wurde.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Suco-X

Betreff: .....

BeitragSo, Feb 15, 2009 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Global image:Timage = CreateImage(25,25)
SetColor 244,83,139
DrawOval 0,0,25,25
GrabImage image,0,0 'TADAAAAAAA
SetColor 255,255,255
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

Mathe

BeitragSo, Feb 15, 2009 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
danke aber warum muss ich das Bild kopieren das versteh ich jetzt nicht ganz?

mfg.

Xeres

Moderator

BeitragSo, Feb 15, 2009 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Man hat in BMax keinen Imagebuffer, also zeichnet man in den Backbuffer und kopiert den Inhalt von dort in das Bild.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Mathe

BeitragSo, Feb 15, 2009 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
aso danke...

Edit:
Hallo ich hab noch eine Frage?

warum muss man wenn man ein Typefeld abfragen will schreiben:
was macht das CreateList() und warum brauch ich dazu eine Method? (Hab vor 4 Tagen mit BM angefangen)

Code: [AUSKLAPPEN]
Type gfx
   Field x% , y%
   Global list:TList = CreateList()
   Method New()
        Self.list.AddLast(Self)
      End Method
EndType


und warum muss ich dann das Typefeld z.b in einer Function so abfragen? Was macht da das gfx.list?

Code: [AUSKLAPPEN]
Function DrawGFX()
For Local b:gfx = EachIn gfx.list
   DrawImage (image , b.x , b.y)
Next
EndFunction


Würde mich freuen wenn mir das jemand mal ganz kurz und einfach erklären könnte ich lese auch schon brav Tuts!

Schon mal danke!

mfg.
Matthias

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group