Joe's mini Game. Die erste

@Rainer: Recht hast Du :stuck_out_tongue:

Es hat soweit Funktioniert. Muss aber aus Zeitgründen diese Baustelle mal 1-4 tage ruhen lassen :stuck_out_tongue: melde mich wieder.
Bis hier aber DANKE.

Nabend,
ich abe nun folgenden COde. leider schaffe ich es nicht Shape1 auf dem Picture1 sichbar zu machen. und ich würde gern genau in der Mitte des Bildschirms mit getpixel die Farbe vom Picture1 einelsen.
mfg joe

Option Explicit
Public cx As Long
Public cy As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
Me.Width = Screen.Width
Me.Height = Screen.Height
Me.Left = 1
Me.Top = 1

Shape1.Top = Screen.Height / 2
Shape1.Left = Screen.Width / 2
End Sub

Private Sub Timer1\_Timer()
Dim i As Integer
For i = 0 To 255
cy = Screen.Width / 2
cx = Screen.Height / 2


Me.Caption = GetPixel(Picture1.hdc, cx, cy)
If GetAsyncKeyState(37) Then 'Bild nach rechts
 Picture1.Left = Picture1.Left + 1
End If
If GetAsyncKeyState(38) Then 'Bild nach unten
 Picture1.Top = Picture1.Top + 1
End If
If GetAsyncKeyState(39) Then 'Bild nach links
 Picture1.Left = Picture1.Left - 1
End If
If GetAsyncKeyState(40) Then 'Bild nach Oben
 Picture1.Top = Picture1.Top - 1
End If
 Next

End Sub

Hi Joe,

ich abe nun folgenden COde. leider schaffe ich es nicht Shape1
auf dem Picture1 sichbar zu machen.

Das geht IMO nur, wenn Du das Shape in das Picture einbaust. Wenn Du das Picture dann verschiebst, verschiebst Du das Shape mit. Wenn das nicht das ist, was Du willst, darfst Du kein Shape oder Image nehmen.

und ich würde gern genau
in der Mitte des Bildschirms mit getpixel die Farbe vom
Picture1 einelsen.

Wirklich in der Mitte des Bildschirms? Du liest z.Z. in der Mitte des Picture-Steuerelemensts, wenn der Code richtig ist.

Option Explicit
Public cx As Long
Public cy As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
Me.ScaleMode = 3
Picture1.ScaleMode = 3
Me.Width = Screen.Width
Me.Height = Screen.Height
Me.Left = 1
Me.Top = 1
Picture1.Left = Me.ScaleWidth / 4
Picture1.Top = Me.ScaleHeight / 4
Picture1.Width = Me.ScaleWidth / 2
Picture1.Height = Me.ScaleHeight / 2

Shape1.Top = Picture1.ScaleHeight / 2
Shape1.Left = Picture1.ScaleWidth / 2
End Sub

Private Sub Timer1\_Timer()
Dim i As Integer
For i = 0 To 255
cy = Picture1.Width / 2
cx = Picture1.Height / 2


Me.Caption = GetPixel(Picture1.hdc, cx, cy)
If GetAsyncKeyState(37) Then 'Bild nach rechts
 Picture1.Left = Picture1.Left + 1
 DoEvents
End If
If GetAsyncKeyState(38) Then 'Bild nach unten
 Picture1.Top = Picture1.Top + 1
 DoEvents
End If
If GetAsyncKeyState(39) Then 'Bild nach links
 Picture1.Left = Picture1.Left - 1
 DoEvents
End If
If GetAsyncKeyState(40) Then 'Bild nach Oben
 Picture1.Top = Picture1.Top - 1
 DoEvents
End If
 Next

End Sub

Du könntest auch in der Mitte der Form lesen, bekommst dann aber -1, wenn der Punkt vom Picture verdeckt wird.

Den Pixel auf dem Bildschirm, unabhängig davon, zu welchem Fenster er gehört, sollte man wohl auch lesen können, aber da weiß ich im Moment nicht genau wie. Warum willst Du das überhaupt? Das hat doch nicht etwa mit Deinem Spiel zu tun und Du verkoplizierst das Ganze heftig, weil Du mit der einfachen Variante nicht zurecht kommst? Nicht daß Du nach der Konstruktionsanleitung für einen Schweißroboter fragst und am Ende stellt sich heraus, daß Du nur einen Dosenöffner brauchst. :smile:

Gruß, Rainer

baue ich keinen Dosenöffner ?
Es geht immer noch über die Kollisonsprüfung. Da mein Shape „Auto“ in der Mitte des BIldschirms ist wollte ich immer wenn unter dem Shape eine Schwarze linie auftaucht ein event auslösen. Ich dachte das wäre so am einfachsten. Die Kollisionsprüfung mit steuerelemten wird wohl auch noch einfließen, doch fand ich bis jetzt getpixel , einfacher :confused:

mfg joe

Hi Joe,

baue ich keinen Dosenöffner ?

doch. :smile:

Es geht immer noch über die Kollisonsprüfung. Da mein Shape
„Auto“ in der Mitte des BIldschirms ist wollte ich immer wenn
unter dem Shape eine Schwarze linie auftaucht ein event
auslösen. Ich dachte das wäre so am einfachsten. Die
Kollisionsprüfung mit steuerelemten wird wohl auch noch
einfließen, doch fand ich bis jetzt getpixel , einfacher :confused:

das habe ich nämlich geahnt. Bei dem Speed, den Du brauchst, ist GetPixel schon mit Kanonen auf Spatzen geschossen.

Picture1.Point(Shape1.Left -1,Shape1.Top -1)

Damit liest Du die Farbe des Punktes, der gerade nicht mehr verdeckt ist. Den verdeckten Punkt mußt Du nicht mehr lesen.

Gruß, Rainer

Immer wenn ich glaube wieder ein Teil von VB verstanden zu haben kommt die nächste Hürde :stuck_out_tongue:
ein Pixel über shape1 und eins nach links ist Picture1.Point.
muss es aber nicht heissen ?
Picture1.Point = (Shape1.Left -1,Shape1.Top -1)
oder
DIm test As Long
test = Picture1.Point = (Shape1.Left -1,Shape1.Top -1)

und ich habe das Problem das mein Shape immer von dem Picture verdeckt wird obwohl ich Picture Send to back 1000x geklickt habe ?

hilfeee

Option Explicit
Public cx As Long
Public cy As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
Me.Width = Screen.Width
Me.Height = Screen.Height
Me.Left = 1
Me.Top = 1

Shape1.Top = Screen.Height / 2
Shape1.Left = Screen.Width / 2
End Sub

Private Sub Timer1\_Timer()
Dim i As Integer
For i = 0 To 255
cy = Screen.Width / 2
cx = Screen.Height / 2


Me.Caption = GetPixel(Picture1.hdc, cx, cy)
If GetAsyncKeyState(37) Then 'Bild nach rechts
 Picture1.Left = Picture1.Left + 1
End If
If GetAsyncKeyState(38) Then 'Bild nach unten
 Picture1.Top = Picture1.Top + 1
End If
If GetAsyncKeyState(39) Then 'Bild nach links
 Picture1.Left = Picture1.Left - 1
End If
If GetAsyncKeyState(40) Then 'Bild nach Oben
 Picture1.Top = Picture1.Top - 1
End If
 Next

End Sub

Hi Joe,

Picture1.Point = (Shape1.Left -1,Shape1.Top -1)
oder
DIm test As Long
test = Picture1.Point = (Shape1.Left -1,Shape1.Top -1)

nein! Den Punkt habe ich willkürlich festgelegt, ich habe nur dafür gesorgt, daß er nicht unter dem Shape liegt, sonst bekommst Du kein Ergebnis.

F = Picture1.Point(x,y)
Macht exakt das Selbe, wie

F = GetPixel(Picture1.hdc,x,y)
nur eben ohne API, ohne Deklaration, einfach eine VB-Funktion für den selben Zweck, aber geringfügig langsamer. Wenn es nicht auf Geschwindigkeit ankommt, wie bei Dir, ist das einfach bequemer.

und ich habe das Problem das mein Shape immer von dem Picture
verdeckt wird obwohl ich Picture Send to back 1000x geklickt
habe ?

Du kannst ruhig weiter probieren, es wird nicht gehen.

Du hast zwei Möglichkeiten.
1.) Lege das Shape in das Picture.
2.) Nimm statt Shape etwas mit einem eigenen Handle.

Alles was ein Handle hat stellt praktisch ein eigenes Fenster Child-Fenster in der Form dar. Für die ‚Geschwister‘ kannst Du zOrder festlegen. Du kannst Parent aber nicht vor Child stellen. Dein Shape hat aber kein eigenes Handle, bleibt immer Teil der Grafik der Form, das bekommst Du nicht vor das Picture. Du kannst nur schon im Editor das Shape in das Pictuer legen, dann ist es Teil von Picture und kann nicht neben dem Picture angezeigt werden.

Wenn Du Dein Auto mal auf dem Picture und mal daneben anzeigen willst, mußt Du etwas mit einem Handle verwenden, es geht nicht anders.

Wenn Du für das Auto dann noch Bereiche transparent machen willst, es nicht rechteckig sein soll (sonst könntest Du ja einfach ein weiteres Picture nehmen) geht das nur mit TransParPic! :smile: Genau dafür wurde das programmiert, es gibt keine andere Lösung.

Gruß, Rainer

Hallo Joe

Option Explicit
Public cx As Long
Public cy As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As
Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
Me.Width = Screen.Width
Me.Height = Screen.Height
Me.Left = 1
Me.Top = 1
Shape1.Top = Screen.Height / 2
Shape1.Left = Screen.Width / 2
End Sub

Private Sub Timer1\_Timer()
Dim i As Integer
For i = 0 To 255
cy = Screen.Width / 2
cx = Screen.Height / 2


Me.Caption = GetPixel(Picture1.hdc, cx, cy)
If GetAsyncKeyState(37) Then 'Bild nach rechts
 Picture1.Left = Picture1.Left + 1
End If
If GetAsyncKeyState(38) Then 'Bild nach unten
 Picture1.Top = Picture1.Top + 1
End If
If GetAsyncKeyState(39) Then 'Bild nach links
 Picture1.Left = Picture1.Left - 1
End If
If GetAsyncKeyState(40) Then 'Bild nach Oben
 Picture1.Top = Picture1.Top - 1
End If
 Next

End Sub

das ist Dein Code!
Entweder ich habe nun eine Denkschwaeche oder du machst hier einen gravierenden Fehler :s
Schau dir mal die Sub vom Timer an!
Dort legst du die Variablen cx und cy fest!(Warum eigentlich jedesmal neu, wenn er eh immer den gleichen Wert hat!) Diese ist immer gleich! Egal wo sich das Bild befindet, was du ja verschiebst.
Ein Auto wie in deinen Falle hat mehr wie eine Kante und du kannst ja beim Rueckwaerts fahren irgendwo gegen stossen oder beim ausbrechen, sowie beim Vorwaertsfahren. Ergo solltest du jeden Punkt abfragen!
Sicher koenntest du nun argumentieren das du die kante des Objectes abfragst, wo die möglichkeit besteht das dagegen gefahren werden kann!
Hmm, Richtig. Aber auch dieses Object hat mehr wie nur 1 Kante!

Was ist wenn dein Picture1 kleiner ist als Screnn.width / 2 ?

Ich mag dir auch nicht zu nahe treten wollen und finde es toll, das du dich an so etwas grosses / schweres wagst. Dennoch muss ich dir leider sagen, das der Weg den du gewaehlt hast, grundlegend der falsche ist :frowning:

Frueher oder später wirst du damit maechtig auf die Gusche fallen :frowning:
Auch hast du dir etwas sehr kompliziertes vorgenommen, was manch einen zum verzweifeln bringen wird :frowning:

Meinst du nicht das du dir erst einmal der Grundlagen im klaren sein solltest? Also wie man Vererbt / Collection erstellt, Klassen handelt und wie man mit API’s arbeitet?

Auch sollte man in einen Falle wie bei dir einen PAP erstellen und diesen dann abarbeiten. Aber anhand deiner Postings erkennt man das du diesen nicht hast :s

Glaub mir mal. Entweder du bekommst es hin und es ist sehr störanfaellig und arg Resourcen fressend oder du wirfst frueher oder später das handtuch hin :frowning:

Ich spreche da aus eigener Erfahrung und meine es net böse. Im Gegenteil. Ich mag dich nur vor einer Enttaeuschung schuetzen!

Aber wenn du dennoch das realisieren willst. Hmm dann mache dich mal ueber DirectX schlau, denn darueber schreibt man meist Spiele!

Auch solltest du bedenken, das wenn du mit einen Auto faehrst, in der Kurve Fliehkraefte wirken, die einem dazu bewegen das das Auto ausbricht oder die Kurve nicht mehr bekommt!( Man kann mit 200 keine Rechtskurve fahren die 90° ist :wink:
Auch ist der kuerzeste Weg nicht immer der schnellste!
Was ist wenn du später mal dein Project erweitern willst? Auch das solltest du bedenken das mehr wie nur 1 Auto fahren kann, und das es mehr wie nur 1 Object geben kann ( Haeuser / Baeume etc.). Und ergo auch das sie unterschiedliche Eigenschaften haben ( z.Bsp. Marke, Farbe, Leistung und und und)

MfG Alex

so aus Shape1 wurde picture2.
Wenn ich es auf Picture1 lege bewegt es sich mit.
wenn ich aber sage
picture2.left = Screen.Width / 2
picture2.top= Screen.Height / 2
ist es weg …

ich sehe schon … erstma nen buch kaufen :stuck_out_tongue:

Hi Joe,

so aus Shape1 wurde picture2.
Wenn ich es auf Picture1 lege bewegt es sich mit.

Dann lege es doch neben Picture1. :smile: Das kannst du in den Vordergrund holen und hast, was Du wolltest.

wenn ich aber sage
picture2.left = Screen.Width / 2
picture2.top= Screen.Height / 2
ist es weg …

Ja. Es liegt ja in Picture1, die Position bezieht sich auf die Kanten von Picture1.

ich sehe schon … erstma nen buch kaufen :stuck_out_tongue:

Nein, da kenne ich kein passendes. Entweder erklärt Dir das Buch, was Du schon weißt, oder Du verstehst nichts. :frowning: Am besten ist es, Beispiele zu analysieren.

Mal 'ne Frage am Rande, wozu ist Picture1 eigentlich gut?

Gruß, Rainer

Hi Anno,
danke für Deine Antwort. Du hast sicherlich in 70% deiner Aussagen recht und das das Projekt eine Nr zu groß für mich ist, habe ich auch schon gemerkt. Trotzdem werde ich von Zeit zu zeit versuchen es weiter zu entwickeln.

Ich habe mich über DirectX Informiert und es für mich als Noob als zu komplex abgestempelt.

Ich Will doch „nur“ eine Grafik in der Mitte meines Bildschirms über ein Gelbes Image/Picture fahren lassen. Immer wenn eine Schwarze Linie kommt soll das Fahrzeug um ein Pixel in die gegenüberliegende richtig gesetzt werden.
Das Picture bewege ich mit den Cursor tasten gegen die Pfeilrichtung so das es aussieht als würde die Grafik in der Mitte in die Richtung fahren … Mehr will ich erstmal nicht …

Ich habe es mit einem Shape auf einem Image geschafft bzw konnte ich als Kollision nur die aussenkanten angeben, da dass mir Koordinaten noch „leicht war“ DAs gab mir hoffnung. Nun habe ich aber gemerkt das wenn ich nun Häuser in der grafik mit Koordinaten angeben möchte ich mir das nen „wolf“ schreibe darum nun GetPixel und Kolisionen mit steuerelementen … und davon habe ich keine Ahnung.

Vielen Dank, mfg jonny

Hallo Joe

Entweder ich habe nun eine Denkschwaeche oder du machst hier
einen gravierenden Fehler :s
Schau dir mal die Sub vom Timer an!
Dort legst du die Variablen cx und cy fest!(Warum eigentlich
jedesmal neu, wenn er eh immer den gleichen Wert hat!) Diese
ist immer gleich! Egal wo sich das Bild befindet, was du ja
verschiebst.
Ein Auto wie in deinen Falle hat mehr wie eine Kante und du
kannst ja beim Rueckwaerts fahren irgendwo gegen stossen oder
beim ausbrechen, sowie beim Vorwaertsfahren. Ergo solltest du
jeden Punkt abfragen!
Sicher koenntest du nun argumentieren das du die kante des
Objectes abfragst, wo die möglichkeit besteht das dagegen
gefahren werden kann!
Hmm, Richtig. Aber auch dieses Object hat mehr wie nur 1
Kante!

Was ist wenn dein Picture1 kleiner ist als Screnn.width / 2 ?

Ist es mir geht es erstmal darum das GetPixel überhaupt vom mittelpunkt des Bildschirms die Farbe vom picture anzeigt.

Ich mag dir auch nicht zu nahe treten wollen und finde es
toll, das du dich an so etwas grosses / schweres wagst.
Dennoch muss ich dir leider sagen, das der Weg den du gewaehlt
hast, grundlegend der falsche ist :frowning:

Frueher oder später wirst du damit maechtig auf die Gusche
fallen :frowning:
Auch hast du dir etwas sehr kompliziertes vorgenommen, was
manch einen zum verzweifeln bringen wird :frowning:

Meinst du nicht das du dir erst einmal der Grundlagen im
klaren sein solltest? Also wie man Vererbt / Collection
erstellt, Klassen handelt und wie man mit API’s arbeitet?

Auch sollte man in einen Falle wie bei dir einen PAP erstellen
und diesen dann abarbeiten. Aber anhand deiner Postings
erkennt man das du diesen nicht hast :s

Glaub mir mal. Entweder du bekommst es hin und es ist sehr
störanfaellig und arg Resourcen fressend oder du wirfst
frueher oder später das handtuch hin :frowning:

Ich spreche da aus eigener Erfahrung und meine es net böse. Im
Gegenteil. Ich mag dich nur vor einer Enttaeuschung schuetzen!

Aber wenn du dennoch das realisieren willst. Hmm dann mache
dich mal ueber DirectX schlau, denn darueber schreibt man
meist Spiele!

geht für mich einen schritt zu weit.

Auch solltest du bedenken, das wenn du mit einen Auto faehrst,
in der Kurve Fliehkraefte wirken, die einem dazu bewegen das
das Auto ausbricht oder die Kurve nicht mehr bekommt!( Man
kann mit 200 keine Rechtskurve fahren die 90° ist :wink:
Auch ist der kuerzeste Weg nicht immer der schnellste!
Was ist wenn du später mal dein Project erweitern willst? Auch
das solltest du bedenken das mehr wie nur 1 Auto fahren kann,
und das es mehr wie nur 1 Object geben kann ( Haeuser / Baeume
etc.). Und ergo auch das sie unterschiedliche Eigenschaften
haben ( z.Bsp. Marke, Farbe, Leistung und und und)

Auf dem Planeten wo mein Auto fährt gibt es das alles nicht :stuck_out_tongue:

MfG Alex

Vielen Dank

Picture1 ist ein Gelber Hintergrund mit ein paar Schwarzen Lininen.
Immer wenn Picture 2 über eine Schwarze Linie fährt möchte ich ein event auslösen.

Hi Joe,

Picture1 ist ein Gelber Hintergrund mit ein paar Schwarzen
Lininen.

Also praktisch Straßen. OK.

Immer wenn Picture 2 über eine Schwarze Linie fährt möchte ich
ein event auslösen.

Ein Event … Hast Du’s 'ne Nummer kleiner? Reicht es denn nicht, wenn dann eine Prozedur oder Funktion abgearbeitet wird? Wenn Du mit Klassenmodulen arbeiten willst und Events feuern, steige ich aus, das beherrsche ich nicht gut genug. :frowning:

Gruß, Rainer

ups. mit event meinte ich eine MSGbox oder eine einfache neue Positionierung :stuck_out_tongue_winking_eye:

Hi Joe,

es gibt noch andere Möglichkeiten für die Kollisionserkennung, die einfach und verständlich sind und bei denen Du Dir keinen Wolf tippst, weil Du unabhängig von der Zahl der Objekte nur einen kurze Funktion für die Kollisionserkennung brauchst.

Nimm mal nur eine Form, wirf ein paar Buttons und ein Picture darauf. Lass dabei links aber Platz, da wird Text angezeigt.

Dann kopier den Code rein, starten und Command1 anklicken.

Alles klar? :smile:

Option Explicit

Private Sub Command1\_Click()
 Dim Ctrl As Control
 For Each Ctrl In Me.Controls
 If Left(Ctrl.Name, 7) = "Command" Then
 Me.Print Ctrl.Name + Str(Ctrl.Top)
 End If
 Next
End Sub

Gruß, Rainer

Hi Joe,

ups. mit event meinte ich eine MSGbox oder eine einfache neue
Positionierung :stuck_out_tongue_winking_eye:

uffff. Na dann ist’s ja gut. :smile:

Läuft’s nun? Oder soll ich Dir das Beispiel schnell schreiben? Ich denke, ich weiß inzwischen, was Du im Moment möchtest, das wird recht kurz. Du hast nur ein Verständnisproblem, worauf sich die Koordinaten beziehen.

Gruß, Rainer

Ein Beispiel wäre ein TRAUM !!
Ich dachte es gibt nur Kordinaten = Pixel also x,Y 1024 x 786 oder 1280 x 1024 … moep falsch :stuck_out_tongue:

Ich habe im Netz nur beispiele gefunden die für mich nicht mehr nachvollziehbar sind.

mfg jonny

Hi Joe,

sieh mal in Dein Postfach.

Für die Allgemeinheit:

Auf der Form liegt Picture1, daneben Picture2 und Timer1

Code:

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" \_
 (ByVal vKey As Long) As Integer

Dim cx As Single
Dim cy As Single

Private Sub Form\_Load()
 Me.Show
 Picture1.ScaleMode = 3
 Me.ScaleMode = 3
 cx = Me.ScaleWidth / 2
 cy = Me.ScaleHeight / 2
 Picture2.Top = cy
 Picture2.Left = cx
 Picture1.Line (0, Picture1.ScaleHeight / 2)-(Picture1.ScaleWidth, (Picture1.ScaleHeight / 2) + 10), 0, BF
End Sub

Private Sub Timer1\_Timer()

Me.Caption = Picture1.Point(cx - Picture1.Left, cy - Picture1.Top)
 If GetAsyncKeyState(37) Then 'Bild nach rechts
 Picture1.Left = Picture1.Left + 1
 DoEvents
 End If
 If GetAsyncKeyState(38) Then 'Bild nach unten
 Picture1.Top = Picture1.Top + 1
 DoEvents
 End If
 If GetAsyncKeyState(39) Then 'Bild nach links
 Picture1.Left = Picture1.Left - 1
 DoEvents
 End If
 If GetAsyncKeyState(40) Then 'Bild nach Oben
 Picture1.Top = Picture1.Top - 1
 DoEvents
 End If

End Sub

Das war’s schon. Mehr sollte im Moment nicht passieren.

Gruß, Rainer

IST DAS GEIL !! bin schon lv 3 nun :stuck_out_tongue:PP
Danke Rainer, wie soll ich das je wieder gut machen.

verdammt, fast wäre ich schlafen gegangen :stuck_out_tongue:

mfg jonny

Hi Joe,

IST DAS GEIL !! bin schon lv 3 nun :stuck_out_tongue:PP
Danke Rainer, wie soll ich das je wieder gut machen.

verdammt, fast wäre ich schlafen gegangen :stuck_out_tongue:

*gg* freut ich, wenn’s geholfen hat!

n8, Rainer