• ベストアンサー

Basicのプログラミングについて… (game)

箱の上から自然に落ちるようにするにはどうすればよいのでしょうか? SET bitmap SIZE 500,500 SET WINDOW 0,10000,10000,0 LET x=5000 LET y=5000 LET jsw=0 DO UNTIL getkeystate(13)<0 PLOT LINES:0,5000+110;10000,5000+110 PLOT LINES:6000,4000;7000,4000 PLOT LINES:6000,4000;6000,5000+110 PLOT LINES:7000,4000;7000,5000+110 SET AREA COLOR "white" DRAW disk WITH SCALE(100)*SHIFT(x,y) IF getkeystate(37)<0 THEN LET x=x-50 IF getkeystate(39)<0 THEN LET x=x+50 IF x<0 THEN LET x=0 IF x>10000 THEN LET x=10000 IF getkeystate(38)<0 AND jsw=0 THEN LET jsw=1 LET i=-SQR(2500) END IF IF jsw=1 THEN LET y=i^2+2500 LET i=i+1 IF i>SQR(2500) THEN LET jsw=0 end if if i>0 then if 6000<x and x<7000 then if 4000-140<=y THEN LET jsw=0 end if end if end if if i>0 then if 6000>x then LET y=i^2+2400 IF i>SQR(2500) THEN LET jsw=0 end if end if SET AREA COLOR "black" DRAW disk WITH SCALE(100)*SHIFT(x,y) WAIT DELAY 0.01 LOOP END

質問者が選んだベストアンサー

  • ベストアンサー
noname#39970
noname#39970
回答No.2

速度係数と 加速度を個別に用意する必要がある。 g = 1 v = 0 として開始し vの分だけ下に落とす(y=y+v) 衝突面に到着(又は通過)するまで下に落とした後に v = v + g で落下速度を増加させる。(本来はループ内ではなく時間で増加。等間隔でループしているという前提) 衝突したら vは0になり次に落下するまでは0を維持する 係数gを操作する事によって重力を調整できる。 副産物としてこのvによって衝突エネルギーを算出できる。

miyo0928
質問者

お礼

それってぼくのプログラミングに組めますかね???

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tetsumyi
  • ベストアンサー率26% (1860/7109)
回答No.4

これは十進BASICですよね? 向こうの掲示板で聞けば教えてくれますよ。 もう少しどの部分で何がしたいのか書き加えると説明しやすくなります。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★『重力加速度』って知っていますか? ・私もソースを見ていません。というより『何』?→上手く動作しなかったのですか? ・回答者 No.1 さんと同じく『加速度』という概念をプログラミングに取り入れれば、  かなり、自然に落ちるように出来ると思います。 ・『重力加速度』とは、空から地上に向けて『物体』は徐々に速度を増して『落下』します。  しかし、ある一定の速度に到達すると『加速』する量が安定(空気抵抗)します。 ・このような『落下』を自然(物理的)に再現するにはちょっとだけ『物理法則』を理解  する必要があります。少なくとも『加速度』という概念をプログラミングに取り入れるべき  と考える必要があります。 ・『重力加速度』や『加速度』については『物理』カテゴリで質問してみましょう。 ・プログラミング的には、だんだん落ちる速度を加速していけばいいです。→難しい物理の  計算式を利用しなくても、箱から落ちる速度を『1』『2』『3』『3』『3』…という要領で  下方向に移動させれば良いでしょう。→移動量を変化させるだけです。 ・ゲームを作っているようなので、Y座標の移動量を加速的に下方向へ『値』を増やしてみたら  どうでしょうか? ・移動量は『正比例』ではなくて『反比例』=指数的にする事(加速度)の概念が重要です。 ・以上。おわり。→参考にして下さい。

全文を見る
すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.1

ソース見て無くてごめん とりあえず加速度の概念を採用したらどうだろう。 現実の世界ではgの分だけ落下速度が増えるというアレ つまり落下する処理をする度に落下速度が上がるというやつ 同じ方法で飛び上がって落ちる時にもその係数が使える。

miyo0928
質問者

お礼

それをプログラミングでやったらどんな感じになりますかね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • 十進BASICのグラフィック表示についてなのですが・・・

    グラフィック画面にy=sqr(1-x^2)のグラフとy=-sqr(1-x^2)のグラフを描くプログラムを作りなさい。ただし、 set window -1.5,1.5,-1.5,1.5 としなさい という問題で 私が書いたプログラムは SET WINDOW -1.5,1.5,-1.5,1.5 DRAW axes DEF f(x)=SQR(1-x^2) DEF g(x)=-SQR(1-x^2) LET h=0.01 SET LINE COLOR 9 FOR x=-1 TO 1 STEP h PLOT LINES:x,f(x);x+h,f(x) NEXT x SET LINE COLOR 10 FOR x=-1 TO 1 STEP h PLOT LINES:x,g(x);x+h,g(x+h) NEXT x END なのですが、 DEF g(x)=-SQR(1-x^2) のところでエラーが出ます。 どうすれば、改善されるか思いつかないで教えてください。 よろしくおねがいします。

  • プログラミングの問題です

    このプログラムは何をするものか詳しく説明しなさい。 100 FOR x=1 TO 100 110 FOR y=x TO 100 120 LET a=x 130 LET b=y 140 DO 150 LET r=MOD(a,b) 160 IF r=0 THEN EXIT DO 170 LET a=b 180 LET b=r 190 LOOP 200 IF b=1 THEN 210 LET z=SQR(x^2+y^2) 220 IF INT(z)=z THEN PRINT x,y,z 230 END IF 240 NEXT y 250 NEXT x プログラムに関して初心者で、120~230(ほとんどですが…)の部分で何をしようとしているのかが分かりません。何か参考になるHPや考え方だけでも教えていただけないでしょうか。

  • 十進BASICでのsin(x)の近似のグラフ化について

    十進BASICを使っています。 sin(x)=x-x^3/3!+x^5/5!-... について、グラフで確かめようと思いプログラミングしてみたんですが、3行目でt=36以上にするとグラフが描かれなくなってしまいます。 どこを直せばt>35でもグラフが描かれるようになるのか教えていただけないでしょうか。よろしくおねがいします。 LET w=30 LET s=0.1 LET t=30 DIM p1(t) DIM p2(t) SET WINDOW -w,w,-w,w SET POINT STYLE 1 DRAW AXES0 FOR n= 1 TO t LET p1(n)=(-1)^(n+1) LET p2(n)=2*n-1 NEXT n SET LINE COLOR 15 FOR x= -w TO w STEP s LET y=SIN(x) PLOT LINES: x,y; NEXT x PLOT LINES SET LINE COLOR 1 FOR x= -w TO w STEP s WHEN EXCEPTION IN LET y=0 FOR n= 1 TO t LET y=y+p1(n)*x^p2(n)/FACT(p2(n)) NEXT n PLOT LINES: x,y; USE PLOT LINES END WHEN NEXT x END

  • BASICでモンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1,1.1, -0.1,1.1 DRAW GRID SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET y=RND SET POINT STYLE 2 IF y<x*x THEN SET POINT COLOR 4 LET sumin=sumin+1 END IF ! PRINT USING "(%.####, %.####)": x,y PLOT POINTS: x,y NEXT i PRINT 1*1*sumin/n END

  • VBA と JIS Full BASIC

     下のJIS Full Basic スタイルとだいたい同じようなコードを VBA で書いたのですが   Z = Sqr(x^2 + y^2) のところでエラーが出ます。どこがおかしいのでしょうか。 Function gcd(a, b)   Do While b <> 0    r = a Mod b    a = b    b = r   Loop   gcd = a End Function Rem 既約なピタゴラス数を求める Sub Pythagoras()  LAST = 200   LAST = 200   For x = 1 To LAST    For y = x + 1 To LAST      Z = Sqr(x^2 + y^2)      'ここでコンパイルエラーが出る      If Int(Z) = Z Then       If gcd(x, y) = 1 And gcd(x, z) = 1 And gcd(y, z) = 1 Then         Debug.Print x & ", " & y & ", " & z       End If      End If    Next y   Next x End Sub ---------------------------- JIS Full Basic スタイルのコード REM ピタゴラス数 FUNCTION gcd(a,b)   DO WHILE b <> 0    LET r = MOD(a,b)    LET a = b    LET b = r   LOOP   LET gcd = a END FUNCTION LET LAST = 200 FOR x = 1 TO LAST   FOR y = x + 1 TO LAST    LET z = SQR(x^2+y^2)    IF INT(z) = z THEN      IF gcd(x,y) = 1 AND gcd(x,z) = 1 AND gcd(y,z) = 1 THEN       PRINT x,y,z      END IF    END IF   NEXT y NEXT x END

  • 08年センター試験本試数学Bコンピュータ

    以下はユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラムです。 センター試験の問題では、130~150行目が空欄になっていて、その部分に当てはまるものは何か問うていました。 私は勉強不足で、高校で学ぶコンピュータプログラミングを知りません。 ユークリッドの互除法といえば、130~150行目は 130 LET Z=X 140 LET X=Y 150 LET Y=Z と、即答できねばいけないものなのでしょうか。 それともこの部分は考えて求められるものなのでしょうか。 もし後者であれば、その考える道筋を解説していただきたいです。 100 INPUT "x=";X 110 INPUT "y=";Y 120 IF X<Y THEN 130 LET Z=X 140 LET X=Y 150 LET Y=Z 160 END IF 170 IF Y=0 THEN 180 PRINT X 190 GOTO 270 200 END IF 210 LET R=X 220 LET R=R-Y 230 IF R>=Y THEN GOTO 220 240 LET X=Y 250 LET Y=R 260 GOTO 170 270 END

  • BASICプログラミング &の使い方

    (A)IF a>=b THEN LET x=a & & ELSE LET x=b (B)IF a>=b THEN LET x=a ELSE LET x=b 学校でもらったプリントに 「1つの文を複数行に渡って書くときは&を使うと」書いてあるのですがなぜBの文では使ってないのでしょうか? &の使い方がわからないので教えてください。

  • プログラミングについての質問です。

    プログラミングでのゲーム作成についての質問です。 現在ExcelVBAにて横スクロールアクションゲーム(マリオみたいなものです)を作成しています。 MAPの作成、敵キャラの作成・動作・主人公の作成・動作は完了しました。 ステージは4面構成でラストステージの最後にBOSSを設置したいと考えています。 他の敵キャラと同じように動作は出来るのですが、BOSSなので5回踏まないと倒せない等といった 体力設定をしたいと考えています。 これがBOSS動作のコードです。 Sub ouM(i As Long) Dim l As Long, ImN As Long, xP As Long With sp(i) If .m = 1 Then ImN = 4 xP = 24 End If .n = (.n + 1) Mod 40 If .n < 30 Then .x = .x + .m * 2 If .n Mod 6 < 3 Then .o.Picture = ouI(0 + ImN).Picture Else .o.Picture = ouI(1 + ImN).Picture End If Else .x = .x + .m * 2 .o.Picture = ouI(2 + ImN).Picture End If If mapR(.x + xP, .y) = 2 Or DokanArea(.x + xP, .y) Then .m = -.m 'ElseIf mapR(.x + xP, .y + 24) = "" Then '.m = -.m End If l = .x - lEdge .o.Left = l If l <= -72 Then .o.Visible = False End If End With End Sub そしてこれがBOSSの設定です。 Case 11 With sp(schSp) .p = 11 .o.Visible = True .o.Picture = ouI(0).Picture .x = Edge * 24 .y = i * 24 .o.Left = .x - lEdge .o.Top = .y .o.Width = 40 .o.Height = 80 .m = -1 .n = Int(Rnd * 40) End With これで左右に歩きまわり、ブロックと接触すると方向転換します。 ただ、雑魚キャラと同様1度踏むと倒せてしまうので、"5回踏まないと倒せない"ようにしたいです。 なにかアドバイスお願いします。

  • FORTRANのプログラミングについて

    たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。