PDA

View Full Version : پرتاب توپ!!



kyrie-chan
جمعه 18 فروردین 1391, 14:58 عصر
همونطور که در عکس میبینین ، قراره یه توپ از نقطه شروع ، توسط موس زاویه پرتابش مشخص شه و توپ که پرتاب شد با برخوردش به اضلاع فرم ، با زاویه عکس بازتاب بشه . در واقع موس مشخص میکنه که زاویه پرتاب چی باشه ...



http://barnamenevis.org/attachment.php?attachmentid=85174&d=1333524183 (http://barnamenevis.org/attachment.php?attachmentid=85174&d=1333524295)


برای این کار فکر کنم به اینا نیاز داریم :


تابع کتابخونه ای drawing

رسم یک خط ( که توسط موس رسم میشه و اینجوری زاویه مشخص میشه )
طول خط مثلا 10 باشه و سرش به شکل فلش باشه .
بدست آوردن معادله خط
مشخص شدن زاویه

قرار دادن یک picturebox با طرح توپ

این توپ در حرکت با step = 0.1 حرکت میکنه ( تا حرکت یکنواخت باشد ) --> با کمک یک timer
قرار دادن شرط اگر توپ خورد به دیواره ها :
زاویه مشخص بشه
با زاویه عکس بازگشت کنه


خوب فکر کنم همینا فعلا انجام بشه خوب باشه .... کسی نظری نداره ؟ روش ساده تری بلدین ؟

kyrie-chan
جمعه 18 فروردین 1391, 15:02 عصر
برای اون خطی که گفتم از این کد استفاده کردم :




Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove


Dim p As New Point

p.X = (
Me.ClientRectangle.Width) / 2

p.Y =
Me.ClientRectangle.Height


Dim Graphic As Graphics

Graphic =
Me.CreateGraphics()


Dim pen As New Pen(Color.Tomato, 10)

pen.EndCap = LineCap.ArrowAnchor

Graphic.DrawLine(pen, p.X, p.Y, e.X, e.Y)


End Sub


اما خوب یه مشکلی داره ، من می خوام خطی که رسم میشه در امتداد همین خطی باشه که رسم میشه ، اما این خط بلنده ، چیکار کنم که مثلا فقط تا 10 پیکسل اولش نمایش بده ؟
مشکل بعدی هم اینه که چیکار کنم فقط در ان واحد یک خط روی صفحه نمایش بده . اینجوری طوری به نظر میاد که همون خطه که داره جا به جا میشه ...

tstsst
جمعه 18 فروردین 1391, 19:12 عصر
سلام کلی نوشتم آخرش صفحه رو بستم !!!!!!! حالا مختصر رشو میزارم !!
از کد زیر استفاده کن


dim x1,y1,x,y,m
dim p as new panel
x1 = نقطه اولیه (xها)
y1 = نقطه اولیه (yها)
m = (e.y - y) / (e.x - x)
with p
.size = new point(20,20)
.creategraphics.draweellipse(color.red,0,0,20,20)
.location = new point(x,y)
end with
me.controls.add(p)

تو تایمر :
if m > 0 then
y += m * x - m* x1 + y1
x -= 1
else
y -= m * x - m* x1 + y1
x -= 1
end if
if not p.bounds.intersectswith(me.bounds) then
m *= -1
end if
p.location = new point(x,y)


امتحانش نکردم چون vsام خرابه !!
امید وارم کارکنه !!

برای همون خط هم این جوری تغییرش بده احتمالا درست میشه.

PrivateSub Form1_MouseMove(ByVal sender AsObject, ByVal e As System.Windows.Forms.MouseEventArgs) HandlesMe.MouseMove


Dim p AsNew Point

p.X = (
Me.ClientRectangle.Width) / 2

p.Y =
Me.ClientRectangle.Height


Dim Graphic As Graphics

Graphic =
Me.CreateGraphics()


Dim pen AsNew Pen(Color.Tomato, 10)

pen.EndCap = LineCap.ArrowAnchor
Graphic.clear(me.backcolor)
Graphic.DrawLine(pen, p.X, p.Y, e.X, e.Y)


EndSub


پیروزباشید!

kyrie-chan
شنبه 19 فروردین 1391, 16:09 عصر
ممنون من کد دومی که نوشتین استفاده کردم ، چون برا اولیه خطا می گرفت ...

اما این مشکل که خطی که چاپ میشه طولش فقط 10 پیکسل باشه ( به پیکسله یگه نه ؟) نمیدونم چیکارش کنم ...

tstsst
شنبه 19 فروردین 1391, 16:19 عصر
سلام
اینم کاملش :

1-یک تایمر + یک پنل اضافه کنید
داک پنل رو fill بگذارید.

فرم لود :
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Enabled = True
Timer1.Stop()
End Sub

پنل موس موو :
Private Sub Panel1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
Dim p1 As New Point
Dim Graphic As Graphics
Graphic = Panel1.CreateGraphics()
p1.X = 0
p1.Y = Panel1.ClientRectangle.Height / 2
Dim pen As New Pen(Color.Tomato, 10)
pen.EndCap = LineCap.ArrowAnchor
Graphic.Clear(Panel1.BackColor)
Graphic.DrawLine(pen, p1.X, p1.Y, e.X, e.Y)
End Sub

تاییمر :
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
y1 += (y * m)
x1 += x
If p.Bounds.IntersectsWith(Panel1.Bounds) Then
p.Location = New Point(x1, y1)
Else
p.Location = New Point(50, Panel1.Height / 2)
m = 1
x = 0
y = 0
x1 = 0
y1 = 0
End If
If p.Bottom > Panel1.Bottom Then
y *= -1
End If
If p.Top < Panel1.Top Then
y *= -1
End If
If p.Right > Panel1.Right Then
x *= -1
End If
If p.Left < Panel1.Left Then
x *= -1
End If
p.CreateGraphics.FillEllipse(Brushes.Red, 0, 0, 50, 50)
End Sub

پنل کلیک :
Private Sub Panel1_Click(ByVal sender As System.Object, ByVal e As MouseEventArgs) Handles Panel1.Click
x = 5
y = 5
x1 = 1
y1 = Panel1.Height / 2
m = (e.Y - y1) / (e.X - x1)
With p
.Size = New Size(50, 50)
.Location = New Point(x1, y1)
End With
Panel1.Controls.Add(p)
p.CreateGraphics.FillEllipse(Brushes.Red, 0, 0, 50, 50)
Timer1.Interval = 50
Timer1.Start()
End Sub

اینا هم تو کلاس (خارج subها اضافه کنید) :
Dim x1, y1, x, y, m
Dim p As New Panel

و اینو هم ایمپورت کنید :
Imports System.Drawing.Drawing2D


در کل تو ضمیمه ها هست !!!!

پیروزباشید!

kyrie-chan
شنبه 19 فروردین 1391, 17:03 عصر
خیلی ممنون ، خیلی عالیه ، اما این کد چیه ؟

With p
.Size = New Size(50, 50)
.Location = New Point(x1, y1)
End With
Panel1.Controls.Add(p)

tstsst
شنبه 19 فروردین 1391, 17:20 عصر
p یک پنله به طول و عرض توپ و به مختصات شروع حرکت!

Dim p As New Panel

که کارش اینه که زمانی که توپ به گوشه های فرم می خوره جهت رو تغییر بده و در کل اعمال رو اون انجام می شه. چون رو خود توپ

CreateGraphics.FillEllipse(Brushes.Red, 0, 0, 50, 50)
سخته این اعمال رو انجام بدیم !

روی اون خطه هم دارم کار می کنم ولی به نتیجه ای نرسیدم !!

kyrie-chan
شنبه 19 فروردین 1391, 17:43 عصر
ممنون .... میشه به جای این که Brushes.Red داشته باشیم یک عکس چاپ کنیم ؟

یه سوال دیگه هم دارم m1 چیه ؟

tstsst
شنبه 19 فروردین 1391, 18:08 عصر
فرق نمی کنه چون روی

p.CreateGraphics.FillEllipse(Brushes.Red, 0, 0, 50, 50)
عملی انجام نمی شه و می تونید به جایی خط بالا اینو بنویس :

p.BackgroundImage = image.FromFile"...\test.jpg"
البته اگه عکس مورد نظر تو ریسورس هات هست !
یا به جای

Dim p As New Panel
With p
.Size = New Size(50, 50)
.Location = New Point(x1, y1)
End With
اینجوری بنویسی :
Dim p As New PictureBox
With pc
.Image = image.FromFile"...\test.jpg"
.Location = New Point(x1, y1)
End With


و
m1 هیچی نیست (:لبخند:) کد رو تغییر دادم یادم رفت ورش دارم ببخشید ! (تشکر)

kyrie-chan
شنبه 19 فروردین 1391, 18:41 عصر
من این برنامه رو هم از اینترنت پیدا کردم ، گفتم شاید خوشتون اومد .... من که زیاد سر در نیاوردم :دی

kyrie-chan
شنبه 19 فروردین 1391, 19:46 عصر
من از کد هایی که گفتین استفاده کردم ، اما تصویرم رو نشون نمیده ، تصویر من تو resource هست

tstsst
شنبه 19 فروردین 1391, 20:09 عصر
خیلی عذر می خوام اشتباه نوشتم این درسته !

p.BackgroundImage = Image.FromFile("D:\untitled.jpg")
یا اگه PictureBox

p.Image= Image.FromFile("D:\untitled.jpg")

kyrie-chan
شنبه 19 فروردین 1391, 20:17 عصر
خیلی ممنون ، در مورد اندازه خطه که از 10 بیشتر نشه ،pen.MiterLimit کاری نمیتونه بکنه ( از اونجایی که کلمه limit داره :دی )

kyrie-chan
چهارشنبه 23 فروردین 1391, 11:24 صبح
حالا اگه قرار باشه یه راکت زیر توپ قرار بگیره که به توپ ضربه بزنه که این راکت با موس حرکت کنه (mouse move) و با کلیک کردن ( فقط بار اول زمان شروع کار )توپ پرتاب شه چه باید کرد؟
و اگه یک timer یه خط یه خط ، یه سری توپ که رنگای رندوم دارن ( مثلا فقط آبی و سبز و قرمز و زرد ) بیاره پایین از بالای صفحه و توپ هایی که روی راکت میاد هم رندوم رنگی باشن که توپ رنگی باید بخوره به توپ هم رنگ خودش و اون توپا حذف شن و توپ بعدی با رنگ رندوم دیگه بیاد روی راکت چی؟
اگه توپ به رنگی غیر خودش بخوره ، این توپ هم به صفحه توپ هایی که به پایین میان اضافه بشه .

kyrie-chan
یک شنبه 27 فروردین 1391, 10:31 صبح
یک سوالی ، من اگه بخوام این برنامه ای که tstsst پیوست کرده رو برای حالتی بنویسم که مثل اونی که خودم نوشتم فلش و حرکت توپ از پایین باشه ، باید چه بکنم ؟

kyrie-chan
یک شنبه 27 فروردین 1391, 22:57 عصر
یعنی هیچکی نمیتونه کمکم کنه