• 締切済み

ブロック崩し

大学でプログラム習ってるんですが、全然できないのでこのままじゃまずいと思って勉強がてらゲームを作ってみる事にしました。ブロック崩しを作ろうとしたのですが、球を動かす機能を関数化する所とブロックの配置をどうすればいいかで悩んでます。どうすればよろしいでしょうか。DXライブラリで作ってます。 #include "DxLib.h" typedef struct _racket{ int g_racket; int g_x; int g_y; }racket; typedef struct _block{ int stone; int x; int y; }block; typedef struct _tama{ int ball; int x; int y; int vx; int vy; }tama; int Key; tama ta; void ball_attack() { ta.x = 300; ta.y = 450; ta.vx = 4; ta.vy = 4; ta.ball = LoadGraph("ball.bmp"); DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //tama ta; racket ra; //ta.x = 300; //ta.y = 450; //ta.vx = 4; //ta.vy = 4; ra.g_x = 300; ra.g_y = 420; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // 透過色を変更 SetTransColor( 255 , 255 , 255 ) ; ra.g_racket = LoadGraph("ziki.bmp"); //ta.ball = LoadGraph("ball.bmp"); while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0) { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } ClearDrawScreen(); ball_attack(); /* DrawGraph(ta.x, ta.y, ta.ball, TRUE); ta.x += ta.vx; ta.y += ta.vy; if(ta.x < 5 || ta.x > 635) ta.vx = -ta.vx; if(ta.y < 5 || ta.y > 475) ta.vy = -ta.vy*/; // キー入力取得 Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; // 右を押していたら右に進む if( Key & PAD_INPUT_RIGHT ) ra.g_x += 3 ; // 左を押していたら左に進む if( Key & PAD_INPUT_LEFT ) ra.g_x -= 3 ; // 読みこんだグラフィックを画面左上に描画 DrawGraph( ra.g_x , ra.g_y , ra.g_racket , TRUE ) ; ScreenFlip(); } WaitKey(); DxLib_End(); return 0; }

みんなの回答

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

ちゃんと見たわけではないけど、ラケットさえ動かせてないんじゃないかな? まずは、ラケットを動かしてみましょう。 ラケットがとりあえず動いたら、ラケットがスムーズに動くようにタイミングを計りましょう。 (タイマー処理) とりあえず、そこからかな。

shamal1988
質問者

補足

ラケットは動かせます。 ラケットのタイマー処理とは何の事でしょうか?申し訳ございません。

関連するQ&A

  • Flash Lite1.1について

    Flashで携帯ゲームのブロック崩しを作りたくて、あるサイトからflaサンプルを見つけました。 製作者のコメントに「ブロックを全部崩しても何も起きませんので、エンディング等は自作してください。 」とあったので、早速4フレーム目にゲームオーバー画面を5フレーム目にクリア画面を作ってみました。 そして元々のソースから if(ball._y>235){ gotoAndPlay(1); } を if(ball._y>235){ gotoAndPlay(3); } にしたまではよかったのですが、 ブロックが全て無くなったらクリア画面に移動させる方法が分からず困っています。 元々のソースは↓になります。 // ボール移動 ball._x += vx; ball._y += vy; // 壁とボールの当たり判定 if(ball._x<5 && vx<0){ vx = -vx; } if(ball._x>235 && vx>0){ vx = -vx; } if(ball._y<5 && vy<0){ vy = -vy; } //ボールが下に落ちたらゲームオーバー if(ball._y>235){ gotoAndPlay(1); } // パドルとの当たり判定 if(ball._x>pad._x-40-5 && ball._x<pad._x+40+5 && ball._y>pad._y-5-5 && ball._y<pad._y+5+5 && vy>0){ vy = -vy; vx = (ball._x-pad._x)/80*15; } // ブロックとの当たり判定 for(i=1;i<=40;i++){ bx = eval("block" add i)._x; by = eval("block" add i)._y; if(ball._x>bx-20-5 && ball._x<bx+20+5 && ball._y>by-5-5 && ball._y<by+5+5 && eval("block" add i)._visible==true){ eval("block" add i)._visible = false; //左端or右端に当たった場合 if(ball._x<bx-20 || ball._x>bx+20){ vx = -vx; }else{ //上端or下端に当たった場合 vy = -vy; } } } どの場所にどのように書くべきかいろいろ探してみたのですが、パソコン用の作り方しか見つからす゜携帯用のFlash Lite1.1には対応していない物ばかりで困っています。 ActionScriptについては初心者であまり詳しくなく、本当に恥ずかしい限りです。 どうかお解かりになる方おりましたらお力をお貸し下さい。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • DXライブラリの透過処理について

    #include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { ChangeWindowMode(TRUE); SetDrawScreen(DX_SCREEN_BACK); if(DxLib_Init()==1) { return -1; } char key[256]; // int haikei; int mapchip[2][152]; int i,j; //int x = 0, y = 0; //haikei = LoadGraph("haikei/草原.jpg"); LoadDivGraph("03.png",5,1,5,32,32,mapchip[0]); LoadDivGraph("mura.png",1,1,1,32,32,mapchip[1]); while(ScreenFlip()==0 && ProcessMessage() == 0 && GetHitKeyStateAll(key)==0) { // ClearDrawScreen(); // DrawGraph(x,y,haikei,FALSE); for(i = 0; i<15;i++) { for(j=0;j<20;j++) { DrawGraph(j*32,i*32,mapchip[0][4],FALSE); } } DrawGraph(32,32,mapchip[1][0],TRUE); /* if(CheckHitKey(KEY_INPUT_RIGHT) == 1) x+=10; if(CheckHitKey(KEY_INPUT_LEFT) == 1) x-=10; if(CheckHitKey(KEY_INPUT_UP) == 1) y-=10; if(CheckHitKey(KEY_INPUT_DOWN) == 1) y+=10; */ if(key[KEY_INPUT_ESCAPE] == 1) { DxLib_End(); return 0; } } } 「DrawGraph(32,32,mapchip[1][0],TRUE);」という処理でmura.pngの左上のカラーキーで透過するはずですがしません。 Win10のペイントで作ったpngファイル形式に対応してないかと思うのですが、よくわかりまえん。 なぜ?

  • ウインドウを大きくしてもボールの動きが変わらない

     今晩は、java初心者です。  宜しくお願い致します。  "ComponentListener"でウインドウを"componentResized"してもボールの動く範囲 は変わりません、何故でしょうか。    "componentResized"では確かに"Resized"されたウインドウの大きさをとっていますが、 何故かボールの動きには反映されません。  宜しくお願いします。 ======================================================================================== public class Ball2 extends Applet implements Runnable , ComponentListener { public static final long serialVersionUID = 1L ; int width , height ; Thread thread ; boolean  LoopFlag = false  ; int x = 30 , y = 100 ; Image  offScreen ; Graphics screen ; int vx = 2 , vy = 2 ; public void init() { width = getSize().width ; height = getSize().height ; thread = new Thread( this ); thread.start(); offScreen = createImage( width, height ) ; screen = offScreen.getGraphics() ; addComponentListener(this) ; } public void componentResized( ComponentEvent e ) { width = getSize().width ; height = getSize().height ; } public void run() { while( LoopFlag == false ) { move() ; repaint() ; try { Thread.sleep( 10 ) ; } catch ( InterruptedException e ) {} } } private void move() { if( x >= width - 50 ) { vx =- vx ; } if( y >= height - 50 ) { vy =- vy ; } if( x < 0 ) { vx =- vx ; } if( y < 0 ) { vy =-vy ; } x += vx; y += vy; } public void update( Graphics g) { paint(g) ; } public void paint( Graphics g) { screen.clearRect( 0 , 0 , width , height ) ; screen.setColor( Color.blue ) ; screen.fillOval( x , y , 50 , 50 ) ; g.drawImage( offScreen , 0 , 0 , this ) ; } public void destroy() { LoopFlag = true ; } public void componentHidden( ComponentEvent e ){} public void componentMoved( ComponentEvent e ){} public void componentShown( ComponentEvent e ){} }

    • ベストアンサー
    • Java
  • Hspゲーム

    HSPでブロック崩しを作ってます。ブロックを全て消したあとにgame clearと入れたいのですが、どのようなソースをどこに入れればいいのかわかりません。 これがソースです。 ;設定など #define Ver "3.12" #define SOFTNAME "ブロック崩し" #define TITLEBAR SOFTNAME+" #define EXENAME "block" #packopt type 0 #packopt name EXENAME #packopt runtime "hsp3c.hrt" #packopt hide 0 ;ウインドウの作成 screen 0,320,240 : title TITLEBAR ;初期化 *init ;主な変数の宣言  dim block,8,4;ブロックの状態 あれば1 repeat 4 : j=cnt repeat 8 : i=cnt block(i,j)=1 loop loop ball_flag = 0;ボールの状態 あれば1 ball_num = 2;ボールの残り数 ball_x = 320;ボールの座標 ball_y = 240;最初は見えないように画面外に ball_vx = 0;ボールの速度 ball_vy = 0 bar_x = 0;バーの座標 ;メインループ *main await 17;1秒に60回ループする ;キー入力処理 stick ky,15 if ky&128 : end;Escで終了 ;バーの座標はマウスの位置で決める bar_x = mousex - 24 ;ボールがあるときとないとき if ball_flag = 0 { if ky&256 {;クリックされたら ball_flag = 1 ball_x = bar_x + 16 ball_y = 208 ball_vx = 4 ball_vy = -4 } } else { ;前回の座標を記録(ブロックとの衝突判定で使う) ball_x_before = ball_x ball_y_before = ball_y ;速度の分だけ座標に足す ball_x += ball_vx : ball_y += ball_vy ;画面の端に当たったら反射 if ball_x < 0 { ball_x = 0 ball_vx = -ball_vx } if ball_x > 304 { ball_x = 304 ball_vx = -ball_vx } if ball_y < 0 { ball_y = 0 ball_vy = -ball_vy } if ball_y > 240 {;下に落ちたらボールを消す ball_flag = 0 ball_num-- if ball_num = -1 { pos 200,200 : color 255,255,255 mes "ゲームオーバー" stop } } ;バーに当たったら反射 if (204 < ball_y) & (ball_y < 209) { if (bar_x-16 < ball_x) & (ball_x < bar_x+48) { ball_vy = -ball_vy } } } ;ブロックとの衝突判定 tmp=0;二重のrepeat-loopから一気に抜け出すためのフラグ repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { if (32 + i*32 - 16 < ball_x) & (ball_x < 62 + i*32) { if (32 + j*16 - 16 < ball_y) & (ball_y < 46 + j*16) { block(i,j) = 0;ブロックを消す ;前回のx座標がすでに範囲に入っていた場合y方向の向きを反転 if (32 + i*32 - 16 < ball_x_before) & (ball_x_before < 62 + i*32) { ball_vy = -ball_vy tmp=1 : break } ;前回のy座標がすでに範囲に入っていた場合x方向の向きを反転 if (32 + j*16 - 16 < ball_y_before) & (ball_y_before < 46 + j*16) { ball_vx = -ball_vx tmp=1 : break } ;どちらも入ってない場合は両方判定 ball_vx = -ball_vx ball_vy = -ball_vy } } } loop if tmp=1 : break loop ;いろいろ描画 redraw 0 color 0,0,0 : boxf;白で全体を塗りつぶす ;ボールとバー pos ball_x,ball_y : color 255,255,0 : mes "●" pos bar_x,220 : mes "-------" ;ブロック repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { boxf 32 + i*32, 32 + j*16, 62 + i*32, 46 + j*16 } loop loop redraw 1 goto *main よろしくお願いします。

  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • ボールが勝手に動き困ってます。

    前回にひき続き困ってます>< タイトル画面→(Enterクリック)→ゲーム画面までできたんですが ゲーム画面でボールとタイマーを動かしたくてやってみるとタイマーはうまく いったのにボールが動く速度を変更できず、勝手に動いてしまいます><どう 改善すればいいでしょうか。ソースコードみにくいですが助言お願いします。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class JavaGame3 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("ゲームフレーム"); frame.setSize(500, 550); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Testpanel panel = new Testpanel(); frame.add(panel); frame.setVisible(true); } } class Testpanel extends JPanel implements Runnable{ private Ball[] balls; static final int TITLE = 0; static final int GAME = 1; private int mode; private int sec; private Timer timer; private Thread t; public Testpanel() { balls = new Ball[5]; java.util.Random rr = new java.util.Random(); for(int i=0; i<balls.length; i++) balls[i] = new Ball(10*i+6,10*i+31,rr.nextInt(5)+1, rr.nextInt(5)+1); sec = 0; setBackground(Color.black); addKeyListener(new JavaKeyListener()); setFocusable(true); timer = new Timer(1000, new JavaActionListener()); mode = TITLE; t = new Thread(this); } class JavaActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (sec == 30) { timer.stop(); } else { sec++; } } } private void drawTitle(Graphics g) { g.setColor(Color.blue); g.drawString("タイトル", 165, 150); g.setColor(Color.white); g.drawString("Hit Enter Key!", 150, 350); } public void drawGameOver(Graphics g) { g.setColor(Color.white); g.setColor(Color.red); g.drawString(sec + "sec", 230, 300); repaint(); for (int i=0; i<balls.length; i++) balls[i].draw(g); } protected void paintComponent(Graphics g) { super.paintComponent(g); if(mode == TITLE) { drawTitle(g); } else if(mode == GAME) { drawGameOver(g); } } class JavaKeyListener implements KeyListener { public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if(mode == TITLE) { switch(key) { case KeyEvent.VK_ENTER: mode = GAME; timer.start(); t.start(); sec = 0; break;} } else { switch (key) { case KeyEvent.VK_ENTER: mode = TITLE; break; } }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } public void run() { while(true) { try { Thread.sleep(100); } catch (Exception e) {} repaint(); } } } class Ball { private int x, y, vx, vy, r; public Ball(int x, int y, int vx, int vy) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; r = 30; } public void draw(Graphics g) { g.fillOval(x, y, r, r); x += vx; y += vy; if(x < 0 || x > 457) vx = -vx; if(y < 0 || y > 433) vy = -vy; } }

    • ベストアンサー
    • Java
  • マウスクリックで別のスレッドを動かしたい

    うまく動きません、どなたかご教示下さい(文字数が不足です) ===== public class ImgMove3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th1 /*, th2*/ ; private boolean bLoopEnd = false ; private int x1 = 30 , y1 = 100 ; // private int x2 = 80 , y2 = 150 ; Image img1 , img2 ; AudioClip sound ; private int vx1 = 3 , vy1 = 2 ; // private int vx2 = 1 , vy2 = 1 ; Dimension d ; public void init() { d = getSize() ; width = d.width ; height = d.height ; this.addMouseListener(this) ; this.addMouseListener(new MyImage3(this)) ; img1 = getImage( getDocumentBase() , "ambulance.jpg" ) ; img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; sound = getAudioClip( getDocumentBase() , "UFO.wav" ) ; } public void mouseEntered( MouseEvent e) { sound.play() ; } public void mouseClicked(MouseEvent e) { } public void start() { if(th1 == null) { th1 = new Thread(this); th1.start(); } } public void stop() { if( th1 != null ) { th1 = null ; } } public void run() { while(bLoopEnd == false) { move() ; repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x1 >= width - 130 ) { vx1 =- vx1 ; } if( y1 >= height - 110 ) { vy1 =- vy1 ; } if( x1 < 0 ) { vx1 =- vx1 ; } if( y1 < 0 ) { vy1 =- vy1 ; } } public void update( Graphics g1 ) { paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img1 , x1 , y1 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e){ } } //======================================================================= class MyImage3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th2 ; private boolean bLoopEnd = false ; private int x2 = 80 , y2 = 150 ; Image img2 ; AudioClip sound ; private int vx2 = 1 , vy2 = 1 ; Dimension d ; Image firecar ; ImgMove3 imv3 ; public MyImage3(ImgMove3 app) { imv3 = app ; imv3.img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; } public void mouseEntered( MouseEvent e) { imv3.sound.play() ; } public void mouseClicked(MouseEvent e) { Graphics g1 =getGraphics(); g1.drawImage( img2 , x2 , y2 , this ) ; imv3.repaint(); } public void start() { if(th2 == null) { th2 = new Thread(this); th2.start(); } } public void stop() { if( th2 != null ) { th2 = null ; } } public void run() { while( th2 != null && bLoopEnd == false) { move() ; imv3.repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x2 >= width - 130 ) { vx2 =- vx2 ; } if( y2 >= height - 110 ) { vy2 =- vy2 ; } if( x2 < 0 ) { vx2 =- vx2 ; } if( y2 < 0 ) { vy2 =- vy2 ; } x2 += vx2 ; y2 += vy2 ; } public void update( Graphics g1 ) { imv3.paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img2 , x2 , y2 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }

    • ベストアンサー
    • Java
  • 複素関数の質問です。

    問題の(1)と(2)はこれであっていますか? (3)と(4)が分からなかったので教えていただきたいです。 よろしくお願いします。 (1) f(z)=u(x,y)+iv(x,y)とする。 コーシーリーマンの関係式より ux=vy, uy=-vx-(1) またf(z~)=u(x,v)-iv(x,y)より ux=-vy, uy=vx よってux=uy=vx=vy=0となるので、u(x,y)とv(x,y)は定数となり、f(z)は定数。 (2) |f(z)|=√u^2(x,y)+v^2(x,y) g(x,y)=|f(z)|=√u^2(x,y)+v^2(x,y)とすると gx=(ux+uy)/g(x,y) gy=(vx+vy)/g(x,y) g(x,y)は定数なので ux=-uy, vx=-vy これらと(1)からux=uy=vx=vy=0となるので、u(x,y)とv(x,y)は定数となり、f(z)は定数。

  • 十進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

  • 変数変換と微分

    よろしくお願いします。ある本で次の図と記述があります。 ※vxのxはvの右下に付く添え字です。 Fxx=μ(dvx/dy)+μ(dvy/dx) これを以下の式でxy座標からXY座標に変換 X=(x+y)/√2,Y=(-x+y)/√2 上記の両式をt,x,yで微分すると VX=(dX/dt)=(vx+vy)/√2 VY=(dY/dt)=(-vx+vy)/√2 (∂X/∂x)=1/√2,(∂X/∂y)=1/√2,(∂Y/∂x)=-1/√2,(∂Y/∂x)=1/√2 が得られます。 さらに整理して vx=(VX-VY)/√2,vy=(VX+VY)/√2 これらを使って,一番最初の式に出てくる微分(dvx/dy)と(dvy/dx)を変数X,Yによる微分に変数変換します。 (dvx/dy)=(∂X/∂y)(∂vx/∂X)+(∂Y/∂y)(∂vx/∂Y) (dvy/dx)=(∂X/∂x)(∂vy/∂X)+(∂Y/∂x)(∂vy/∂Y) ここで質問です。  上記の式の最後の2行 つまり, (dvx/dy)=(∂X/∂y)(∂vx/∂X)+(∂Y/∂y)(∂vx/∂Y) (dvy/dx)=(∂X/∂x)(∂vy/∂X)+(∂Y/∂x)(∂vy/∂Y)  この式が出てきた経緯が分かりません。(dvxをdyで微分するとなぜ右辺のようになるのかが分かりません。同様にdvyをdxで微分するとなぜ右辺のようになるのかが分かりません。)  どなたか解説をお願いできないでしょうか。