I'm working on something fun :)

Страница 1/2
| 2

By Vampier

Prophet (2409)

Аватар пользователя Vampier

04-06-2009, 06:04

I'll first paste a short msx basic listing:

100 SCREEN 1,2,0
110 VPOKE BASE(9)+0,&B0110
120 VPOKE BASE(9)+1,&B1111
130 VPOKE BASE(9)+2,&B1111
140 VPOKE BASE(9)+3,&B0110
150 A=100:B=100:X=70:Y=70
160 D=STICK(0)
170 IF D=1 THEN Y=Y-1
180 IF D=3 THEN X=X+1
190 IF D=5 THEN Y=Y+1
200 IF D=7 THEN X=X-1
210 PUT SPRITE 1,(X,Y),15,0
220 PUT SPRITE 2,(A,B),8,0
230 'LOCATE 1,1:PRINT X-A;Y-B
240 IF ABS(B-Y)<10 AND ABS(A-X)<10 THEN B=B-((Y-B)/3):A=A-((X-A)/3)
250 IF INKEY$=CHR$(27)THEN SCREEN0:END
260 GOTO 160

in short: imagine you are playing nemesis and a bullet comes close to your ship... you push a button and the bullet changes course by a negative force field (see program above)

How would you program this?

Для того, чтобы оставить комментарий, необходимо регистрация или !login

By Vampier

Prophet (2409)

Аватар пользователя Vampier

04-06-2009, 09:22

in nemesis this procedure would look something like this:
http://www.youtube.com/watch?v=SsO7d62f_WA

LOL!

By Huey

Prophet (2694)

Аватар пользователя Huey

04-06-2009, 09:50

oO

LOL!LOL!LOL!LOL!LOL!LOL!

By evulopah

Paladin (669)

Аватар пользователя evulopah

04-06-2009, 11:11

Hehehe nice trick mister Vampier!! LOL!LOL!

By Vampier

Prophet (2409)

Аватар пользователя Vampier

04-06-2009, 16:51

Thanks Smile If anyone has some improvements on the math:

240 IF ABS(B-Y)<10 AND ABS(A-X)<10 THEN B=B-((Y-B)/3):A=A-((X-A)/3)

Let me know...

By NYYRIKKI

Enlighted (6016)

Аватар пользователя NYYRIKKI

04-06-2009, 17:14

Well... I think force field should be round Smile

240 IF SQR(ABS(B-Y)^2+ABS(A-X)^2)<10 THEN B=B-((Y-B)/3):A=A-((X-A)/3)

By ARTRAG

Enlighted (6923)

Аватар пользователя ARTRAG

04-06-2009, 17:45

and you shoud define a speed for the second object:
the force field acts on the speed not on the position
THIS IS FUN:

100 SCREEN 1,2,0
110 VPOKE BASE(9)+0,&B0110
120 VPOKE BASE(9)+1,&B1111
130 VPOKE BASE(9)+2,&B1111
140 VPOKE BASE(9)+3,&B0110
150 A=100:B=100:X=70:Y=70:DA=0:DB=0
160 D=STICK(0)
170 IF D=1 THEN Y=Y-1
180 IF D=3 THEN X=X+1
190 IF D=5 THEN Y=Y+1
200 IF D=7 THEN X=X-1
210 PUT SPRITE 1,(X,Y),15,0
220 PUT SPRITE 2,(A,B),8,0:A=A+DA/5:B=B+DB/5:DA=DA*0.95:DB=DB*0.95
230 'LOCATE 1,1:PRINT X-A;Y-B
240 IF ABS(B-Y)<10 AND ABS(A-X)<10 THEN DB=DB-((Y-B)/3):DA=DA-((X-A)/3)
250 IF INKEY$=CHR$(27)THEN SCREEN0:END
260 GOTO 160

By ARTRAG

Enlighted (6923)

Аватар пользователя ARTRAG

04-06-2009, 17:46

ps

SQR(ABS(B-Y)^2+ABS(A-X)^2)<10

is equivalent to

(ABS(B-Y)^2+ABS(A-X)^2)<100

that is faster

By Vampier

Prophet (2409)

Аватар пользователя Vampier

04-06-2009, 17:52

thanks Nyyrikki :

 	if {([expr sqrt(abs($b-$y)**2+abs($a-$x)**2)]<30)} {
		catch {
			set b [expr $b-(($y-$b)/3)]
			set a [expr $a-(($x-$a)/3	)]
			poke $f $a;poke $g $b;
		}
	}

works much better

By Vampier

Prophet (2409)

Аватар пользователя Vampier

04-06-2009, 18:01

(ABS(B-Y)^2+ABS(A-X)^2)<10^2 (another option)

By Vampier

Prophet (2409)

Аватар пользователя Vampier

04-06-2009, 22:41

here is the complete code (for use with openMSX)

proc nemesis {} {
	
	if {[catch {osd info nemesis -type} errmsg]} {
		init_osd nemesis
	for {set i 0} {$i<32} {incr i} {
		osd create rectangle nemesis.square$i  -x 0 -y 0 -w 8 -h 8 -rgba 0x0000ff80
		osd create text nemesis.square$i.text -x 0 -y 2 -size 6 -text $i -rgba 0xffffffff
		}
	}
	
	for {set i 0} {$i <32} {incr i 1} {
		set z [peek [expr 0xe30d+($i*0x20)]]
		if {$z!=13} {
			set px [expr 0xe306+($i*0x20)]
			set py [expr 0xe304+($i*0x20)]
			set x [peek $px]
			set y [peek $py]
			osd configure nemesis.square$i -x $x -y $y
			osd configure nemesis.square$i.text -text $z
			bounce $px $py
		} else {osd configure nemesis.square$i -y 999}
	}
after frame nemesis
} 	 	 	

proc bounce {f g} {

	set x [peek 0xe206]
	set y [peek 0xe204]
	set a [peek $f]
	set b [peek $g]



 	if {([expr sqrt(abs($b-$y)**2+abs($a-$x)**2)]<30)} {
		catch {
			set b [expr $b-(($y-$b)/5)]
			set a [expr $a-(($x-$a)/5)]
			poke $f $a;poke $g $b;
		}
	}
}


proc init_osd {name} {
	osd create rectangle $name -scaled true -alpha 0
		
	# compensate for horizontal-stretch and set-adjust
	set hstretch [expr {$::renderer != "SDL"} ? $::horizontal_stretch : 320]
	set xsize   [expr 320.0 / $hstretch]
	set xoffset [expr ($hstretch - 256) / 2 * $xsize]
	set ysize 1
	set yoffset [expr (240 - 192) / 2 * $ysize]
	set adjreg [vdpreg 18]
	set hadj [expr (($adjreg & 15) ^ 7) - 7]
	set vadj [expr (($adjreg >> 4) ^ 7) - 7]
	set xoffset [expr $xoffset + $xsize * $hadj]
	set yoffset [expr $yoffset + $ysize * $vadj]
	osd configure $name -x $xoffset -y $yoffset -w $xsize -h $ysize
}

While you play you'll see some debug info (make sure you use the latest svn release... also to be found on this forum Tongue)

Страница 1/2
| 2